mbed library sources

Dependents:   Encrypted my_mbed mbed_forkd lklk ... more

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official mbed C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Wed Sep 30 17:00:09 2015 +0100
Revision:
635:a11c0372f0ba
Parent:
212:34d62c0b2af6
Synchronized with git revision d29c98dae61be0946ddf3a3c641c7726056f9452

Full URL: https://github.com/mbedmicro/mbed/commit/d29c98dae61be0946ddf3a3c641c7726056f9452/

Added support for SAMW25

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bogdanm13:0645d8841f51 1/* mbed Microcontroller Library
mbed_official525:c320967f86b9 2 * Copyright (c) 2006-2015 ARM Limited
bogdanm13:0645d8841f51 3 *
bogdanm13:0645d8841f51 4 * Licensed under the Apache License, Version 2.0 (the "License");
bogdanm13:0645d8841f51 5 * you may not use this file except in compliance with the License.
bogdanm13:0645d8841f51 6 * You may obtain a copy of the License at
bogdanm13:0645d8841f51 7 *
bogdanm13:0645d8841f51 8 * http://www.apache.org/licenses/LICENSE-2.0
bogdanm13:0645d8841f51 9 *
bogdanm13:0645d8841f51 10 * Unless required by applicable law or agreed to in writing, software
bogdanm13:0645d8841f51 11 * distributed under the License is distributed on an "AS IS" BASIS,
bogdanm13:0645d8841f51 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
bogdanm13:0645d8841f51 13 * See the License for the specific language governing permissions and
bogdanm13:0645d8841f51 14 * limitations under the License.
bogdanm13:0645d8841f51 15 */
bogdanm13:0645d8841f51 16#ifndef MBED_FUNCTIONPOINTER_H
bogdanm13:0645d8841f51 17#define MBED_FUNCTIONPOINTER_H
bogdanm13:0645d8841f51 18
bogdanm13:0645d8841f51 19#include <string.h>
mbed_official525:c320967f86b9 20#include <stdint.h>
bogdanm13:0645d8841f51 21
bogdanm13:0645d8841f51 22namespace mbed {
bogdanm13:0645d8841f51 23
mbed_official525:c320967f86b9 24/* If we had variaditic templates, this wouldn't be a problem, but until C++11 is enabled, we are stuck with multiple classes... */
bogdanm15:4892fe388435 25
mbed_official525:c320967f86b9 26/** A class for storing and calling a pointer to a static or member function
bogdanm13:0645d8841f51 27 */
mbed_official525:c320967f86b9 28template <typename R, typename A1>
mbed_official525:c320967f86b9 29class FunctionPointerArg1{
bogdanm13:0645d8841f51 30public:
bogdanm13:0645d8841f51 31 /** Create a FunctionPointer, attaching a static function
bogdanm13:0645d8841f51 32 *
mbed_official525:c320967f86b9 33 * @param function The static function to attach (default is none)
bogdanm13:0645d8841f51 34 */
mbed_official525:c320967f86b9 35 FunctionPointerArg1(R (*function)(A1) = 0) {
mbed_official525:c320967f86b9 36 attach(function);
mbed_official525:c320967f86b9 37 }
mbed_official525:c320967f86b9 38
mbed_official525:c320967f86b9 39 /** Create a FunctionPointer, attaching a member function
mbed_official525:c320967f86b9 40 *
mbed_official525:c320967f86b9 41 * @param object The object pointer to invoke the member function on (i.e. the this pointer)
mbed_official525:c320967f86b9 42 * @param function The address of the member function to attach
mbed_official525:c320967f86b9 43 */
mbed_official525:c320967f86b9 44 template<typename T>
mbed_official525:c320967f86b9 45 FunctionPointerArg1(T *object, R (T::*member)(A1)) {
mbed_official525:c320967f86b9 46 attach(object, member);
mbed_official525:c320967f86b9 47 }
mbed_official525:c320967f86b9 48
mbed_official525:c320967f86b9 49 /** Attach a static function
mbed_official525:c320967f86b9 50 *
mbed_official525:c320967f86b9 51 * @param function The static function to attach (default is none)
mbed_official525:c320967f86b9 52 */
mbed_official525:c320967f86b9 53 void attach(R (*function)(A1)) {
mbed_official525:c320967f86b9 54 _p.function = function;
mbed_official525:c320967f86b9 55 _membercaller = 0;
mbed_official525:c320967f86b9 56 }
mbed_official525:c320967f86b9 57
mbed_official525:c320967f86b9 58 /** Attach a member function
mbed_official525:c320967f86b9 59 *
mbed_official525:c320967f86b9 60 * @param object The object pointer to invoke the member function on (i.e. the this pointer)
mbed_official525:c320967f86b9 61 * @param function The address of the member function to attach
mbed_official525:c320967f86b9 62 */
mbed_official525:c320967f86b9 63 template<typename T>
mbed_official525:c320967f86b9 64 void attach(T *object, R (T::*member)(A1)) {
mbed_official525:c320967f86b9 65 _p.object = static_cast<void*>(object);
mbed_official525:c320967f86b9 66 *reinterpret_cast<R (T::**)(A1)>(_member) = member;
mbed_official525:c320967f86b9 67 _membercaller = &FunctionPointerArg1::membercaller<T>;
mbed_official525:c320967f86b9 68 }
mbed_official525:c320967f86b9 69
mbed_official525:c320967f86b9 70 /** Call the attached static or member function
mbed_official525:c320967f86b9 71 */
mbed_official525:c320967f86b9 72 R call(A1 a) {
mbed_official525:c320967f86b9 73 if (_membercaller == 0 && _p.function) {
mbed_official525:c320967f86b9 74 return _p.function(a);
mbed_official525:c320967f86b9 75 } else if (_membercaller && _p.object) {
mbed_official525:c320967f86b9 76 return _membercaller(_p.object, _member, a);
mbed_official525:c320967f86b9 77 }
mbed_official525:c320967f86b9 78 return (R)0;
mbed_official525:c320967f86b9 79 }
mbed_official525:c320967f86b9 80
mbed_official525:c320967f86b9 81 /** Get registered static function
mbed_official525:c320967f86b9 82 */
mbed_official525:c320967f86b9 83 R(*get_function(A1))() {
mbed_official525:c320967f86b9 84 return _membercaller ? (R(*)(A1))0 : (R(*)(A1))_p.function;
mbed_official525:c320967f86b9 85 }
mbed_official525:c320967f86b9 86
mbed_official525:c320967f86b9 87#ifdef MBED_OPERATORS
mbed_official525:c320967f86b9 88 R operator ()(A1 a) {
mbed_official525:c320967f86b9 89 return call(a);
mbed_official525:c320967f86b9 90 }
mbed_official525:c320967f86b9 91 operator bool(void) const {
mbed_official525:c320967f86b9 92 return (_membercaller != NULL ? _p.object : (void*)_p.function) != NULL;
mbed_official525:c320967f86b9 93 }
mbed_official525:c320967f86b9 94#endif
mbed_official525:c320967f86b9 95private:
mbed_official525:c320967f86b9 96 template<typename T>
mbed_official525:c320967f86b9 97 static R membercaller(void *object, uintptr_t *member, A1 a) {
mbed_official525:c320967f86b9 98 T* o = static_cast<T*>(object);
mbed_official525:c320967f86b9 99 R (T::**m)(A1) = reinterpret_cast<R (T::**)(A1)>(member);
mbed_official525:c320967f86b9 100 return (o->**m)(a);
mbed_official525:c320967f86b9 101 }
mbed_official525:c320967f86b9 102
mbed_official525:c320967f86b9 103 union {
mbed_official525:c320967f86b9 104 R (*function)(A1); // static function pointer
mbed_official525:c320967f86b9 105 void *object; // object this pointer
mbed_official525:c320967f86b9 106 } _p;
mbed_official525:c320967f86b9 107 uintptr_t _member[4]; // aligned raw member function pointer storage - converted back by registered _membercaller
mbed_official525:c320967f86b9 108 R (*_membercaller)(void*, uintptr_t*, A1); // registered membercaller function to convert back and call _m.member on _object
mbed_official525:c320967f86b9 109};
mbed_official525:c320967f86b9 110
mbed_official525:c320967f86b9 111/** A class for storing and calling a pointer to a static or member function (R ()(void))
mbed_official525:c320967f86b9 112 */
mbed_official525:c320967f86b9 113template <typename R>
mbed_official525:c320967f86b9 114class FunctionPointerArg1<R, void>{
mbed_official525:c320967f86b9 115public:
mbed_official525:c320967f86b9 116 /** Create a FunctionPointer, attaching a static function
mbed_official525:c320967f86b9 117 *
mbed_official525:c320967f86b9 118 * @param function The static function to attach (default is none)
mbed_official525:c320967f86b9 119 */
mbed_official525:c320967f86b9 120 FunctionPointerArg1(R (*function)(void) = 0) {
mbed_official525:c320967f86b9 121 attach(function);
mbed_official525:c320967f86b9 122 }
bogdanm13:0645d8841f51 123
bogdanm13:0645d8841f51 124 /** Create a FunctionPointer, attaching a member function
bogdanm13:0645d8841f51 125 *
bogdanm13:0645d8841f51 126 * @param object The object pointer to invoke the member function on (i.e. the this pointer)
bogdanm13:0645d8841f51 127 * @param function The address of the void member function to attach
bogdanm13:0645d8841f51 128 */
bogdanm13:0645d8841f51 129 template<typename T>
mbed_official525:c320967f86b9 130 FunctionPointerArg1(T *object, R (T::*member)(void)) {
bogdanm13:0645d8841f51 131 attach(object, member);
bogdanm13:0645d8841f51 132 }
bogdanm13:0645d8841f51 133
bogdanm13:0645d8841f51 134 /** Attach a static function
bogdanm13:0645d8841f51 135 *
bogdanm13:0645d8841f51 136 * @param function The void static function to attach (default is none)
bogdanm13:0645d8841f51 137 */
mbed_official525:c320967f86b9 138 void attach(R (*function)(void)) {
mbed_official525:c320967f86b9 139 _p.function = function;
mbed_official525:c320967f86b9 140 _membercaller = 0;
mbed_official525:c320967f86b9 141 }
bogdanm13:0645d8841f51 142
bogdanm13:0645d8841f51 143 /** Attach a member function
bogdanm13:0645d8841f51 144 *
bogdanm13:0645d8841f51 145 * @param object The object pointer to invoke the member function on (i.e. the this pointer)
bogdanm13:0645d8841f51 146 * @param function The address of the void member function to attach
bogdanm13:0645d8841f51 147 */
bogdanm13:0645d8841f51 148 template<typename T>
mbed_official525:c320967f86b9 149 void attach(T *object, R (T::*member)(void)) {
mbed_official525:c320967f86b9 150 _p.object = static_cast<void*>(object);
mbed_official525:c320967f86b9 151 *reinterpret_cast<R (T::**)(void)>(_member) = member;
mbed_official525:c320967f86b9 152 _membercaller = &FunctionPointerArg1::membercaller<T>;
bogdanm13:0645d8841f51 153 }
bogdanm13:0645d8841f51 154
bogdanm13:0645d8841f51 155 /** Call the attached static or member function
bogdanm13:0645d8841f51 156 */
mbed_official525:c320967f86b9 157 R call(){
mbed_official525:c320967f86b9 158 if (_membercaller == 0 && _p.function) {
mbed_official525:c320967f86b9 159 return _p.function();
mbed_official525:c320967f86b9 160 } else if (_membercaller && _p.object) {
mbed_official525:c320967f86b9 161 return _membercaller(_p.object, _member);
mbed_official525:c320967f86b9 162 }
mbed_official525:c320967f86b9 163 return (R)0;
mbed_official525:c320967f86b9 164 }
bogdanm13:0645d8841f51 165
mbed_official525:c320967f86b9 166 /** Get registered static function
mbed_official525:c320967f86b9 167 */
mbed_official525:c320967f86b9 168 R(*get_function())() {
mbed_official525:c320967f86b9 169 return _membercaller ? (R(*)())0 : (R(*)())_p.function;
bogdanm15:4892fe388435 170 }
bogdanm15:4892fe388435 171
bogdanm15:4892fe388435 172#ifdef MBED_OPERATORS
mbed_official525:c320967f86b9 173 R operator ()(void) {
mbed_official525:c320967f86b9 174 return call();
mbed_official525:c320967f86b9 175 }
mbed_official525:c320967f86b9 176 operator bool(void) const {
mbed_official525:c320967f86b9 177 return (_membercaller != NULL ? _p.object : (void*)_p.function) != NULL;
mbed_official525:c320967f86b9 178 }
bogdanm15:4892fe388435 179#endif
bogdanm15:4892fe388435 180
bogdanm13:0645d8841f51 181private:
bogdanm13:0645d8841f51 182 template<typename T>
mbed_official525:c320967f86b9 183 static R membercaller(void *object, uintptr_t *member) {
bogdanm13:0645d8841f51 184 T* o = static_cast<T*>(object);
mbed_official525:c320967f86b9 185 R (T::**m)(void) = reinterpret_cast<R (T::**)(void)>(member);
mbed_official525:c320967f86b9 186 return (o->**m)();
bogdanm13:0645d8841f51 187 }
bogdanm13:0645d8841f51 188
mbed_official525:c320967f86b9 189 union {
mbed_official525:c320967f86b9 190 R (*function)(void); // static function pointer
mbed_official525:c320967f86b9 191 void *object; // object this pointer
mbed_official525:c320967f86b9 192 } _p;
mbed_official525:c320967f86b9 193 uintptr_t _member[4]; // aligned raw member function pointer storage - converted back by registered _membercaller
mbed_official525:c320967f86b9 194 R (*_membercaller)(void*, uintptr_t*); // registered membercaller function to convert back and call _m.member on _object
bogdanm13:0645d8841f51 195};
bogdanm13:0645d8841f51 196
mbed_official525:c320967f86b9 197typedef FunctionPointerArg1<void, void> FunctionPointer;
mbed_official525:c320967f86b9 198typedef FunctionPointerArg1<void, int> event_callback_t;
mbed_official525:c320967f86b9 199
bogdanm13:0645d8841f51 200} // namespace mbed
bogdanm13:0645d8841f51 201
bogdanm13:0645d8841f51 202#endif