The code from https://github.com/vpcola/Nucleo

Committer:
sinrab
Date:
Wed Oct 08 11:00:24 2014 +0000
Revision:
0:5464d5e415e5
The code from https://github.com/vpcola/Nucleo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sinrab 0:5464d5e415e5 1 /* mbed Microcontroller Library
sinrab 0:5464d5e415e5 2 * Copyright (c) 2006-2013 ARM Limited
sinrab 0:5464d5e415e5 3 *
sinrab 0:5464d5e415e5 4 * Licensed under the Apache License, Version 2.0 (the "License");
sinrab 0:5464d5e415e5 5 * you may not use this file except in compliance with the License.
sinrab 0:5464d5e415e5 6 * You may obtain a copy of the License at
sinrab 0:5464d5e415e5 7 *
sinrab 0:5464d5e415e5 8 * http://www.apache.org/licenses/LICENSE-2.0
sinrab 0:5464d5e415e5 9 *
sinrab 0:5464d5e415e5 10 * Unless required by applicable law or agreed to in writing, software
sinrab 0:5464d5e415e5 11 * distributed under the License is distributed on an "AS IS" BASIS,
sinrab 0:5464d5e415e5 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sinrab 0:5464d5e415e5 13 * See the License for the specific language governing permissions and
sinrab 0:5464d5e415e5 14 * limitations under the License.
sinrab 0:5464d5e415e5 15 */
sinrab 0:5464d5e415e5 16 #ifndef MBED_FUNCTIONPOINTER_H
sinrab 0:5464d5e415e5 17 #define MBED_FUNCTIONPOINTER_H
sinrab 0:5464d5e415e5 18
sinrab 0:5464d5e415e5 19 #include <string.h>
sinrab 0:5464d5e415e5 20
sinrab 0:5464d5e415e5 21 namespace mbed {
sinrab 0:5464d5e415e5 22
sinrab 0:5464d5e415e5 23 typedef void (*pvoidf_t)(void);
sinrab 0:5464d5e415e5 24
sinrab 0:5464d5e415e5 25 /** A class for storing and calling a pointer to a static or member void function
sinrab 0:5464d5e415e5 26 */
sinrab 0:5464d5e415e5 27 class FunctionPointer {
sinrab 0:5464d5e415e5 28 public:
sinrab 0:5464d5e415e5 29
sinrab 0:5464d5e415e5 30 /** Create a FunctionPointer, attaching a static function
sinrab 0:5464d5e415e5 31 *
sinrab 0:5464d5e415e5 32 * @param function The void static function to attach (default is none)
sinrab 0:5464d5e415e5 33 */
sinrab 0:5464d5e415e5 34 FunctionPointer(void (*function)(void) = 0);
sinrab 0:5464d5e415e5 35
sinrab 0:5464d5e415e5 36 /** Create a FunctionPointer, attaching a member function
sinrab 0:5464d5e415e5 37 *
sinrab 0:5464d5e415e5 38 * @param object The object pointer to invoke the member function on (i.e. the this pointer)
sinrab 0:5464d5e415e5 39 * @param function The address of the void member function to attach
sinrab 0:5464d5e415e5 40 */
sinrab 0:5464d5e415e5 41 template<typename T>
sinrab 0:5464d5e415e5 42 FunctionPointer(T *object, void (T::*member)(void)) {
sinrab 0:5464d5e415e5 43 attach(object, member);
sinrab 0:5464d5e415e5 44 }
sinrab 0:5464d5e415e5 45
sinrab 0:5464d5e415e5 46 /** Attach a static function
sinrab 0:5464d5e415e5 47 *
sinrab 0:5464d5e415e5 48 * @param function The void static function to attach (default is none)
sinrab 0:5464d5e415e5 49 */
sinrab 0:5464d5e415e5 50 void attach(void (*function)(void) = 0);
sinrab 0:5464d5e415e5 51
sinrab 0:5464d5e415e5 52 /** Attach a member function
sinrab 0:5464d5e415e5 53 *
sinrab 0:5464d5e415e5 54 * @param object The object pointer to invoke the member function on (i.e. the this pointer)
sinrab 0:5464d5e415e5 55 * @param function The address of the void member function to attach
sinrab 0:5464d5e415e5 56 */
sinrab 0:5464d5e415e5 57 template<typename T>
sinrab 0:5464d5e415e5 58 void attach(T *object, void (T::*member)(void)) {
sinrab 0:5464d5e415e5 59 _object = static_cast<void*>(object);
sinrab 0:5464d5e415e5 60 memcpy(_member, (char*)&member, sizeof(member));
sinrab 0:5464d5e415e5 61 _membercaller = &FunctionPointer::membercaller<T>;
sinrab 0:5464d5e415e5 62 _function = 0;
sinrab 0:5464d5e415e5 63 }
sinrab 0:5464d5e415e5 64
sinrab 0:5464d5e415e5 65 /** Call the attached static or member function
sinrab 0:5464d5e415e5 66 */
sinrab 0:5464d5e415e5 67 void call();
sinrab 0:5464d5e415e5 68
sinrab 0:5464d5e415e5 69 pvoidf_t get_function() const {
sinrab 0:5464d5e415e5 70 return (pvoidf_t)_function;
sinrab 0:5464d5e415e5 71 }
sinrab 0:5464d5e415e5 72
sinrab 0:5464d5e415e5 73 #ifdef MBED_OPERATORS
sinrab 0:5464d5e415e5 74 void operator ()(void);
sinrab 0:5464d5e415e5 75 #endif
sinrab 0:5464d5e415e5 76
sinrab 0:5464d5e415e5 77 private:
sinrab 0:5464d5e415e5 78 template<typename T>
sinrab 0:5464d5e415e5 79 static void membercaller(void *object, char *member) {
sinrab 0:5464d5e415e5 80 T* o = static_cast<T*>(object);
sinrab 0:5464d5e415e5 81 void (T::*m)(void);
sinrab 0:5464d5e415e5 82 memcpy((char*)&m, member, sizeof(m));
sinrab 0:5464d5e415e5 83 (o->*m)();
sinrab 0:5464d5e415e5 84 }
sinrab 0:5464d5e415e5 85
sinrab 0:5464d5e415e5 86 void (*_function)(void); // static function pointer - 0 if none attached
sinrab 0:5464d5e415e5 87 void *_object; // object this pointer - 0 if none attached
sinrab 0:5464d5e415e5 88 char _member[16]; // raw member function pointer storage - converted back by registered _membercaller
sinrab 0:5464d5e415e5 89 void (*_membercaller)(void*, char*); // registered membercaller function to convert back and call _member on _object
sinrab 0:5464d5e415e5 90 };
sinrab 0:5464d5e415e5 91
sinrab 0:5464d5e415e5 92 } // namespace mbed
sinrab 0:5464d5e415e5 93
sinrab 0:5464d5e415e5 94 #endif
sinrab 0:5464d5e415e5 95