Wrapper classes for the emwin library
Dependents: app_emwin1 app_emwin2_pos lpc4088_ebb_gui_emwin
EwFunctionPointer.h
- Committer:
- embeddedartists
- Date:
- 2014-04-14
- Revision:
- 1:0b16165ada7c
- Parent:
- 0:316c181e9b65
File content as of revision 1:0b16165ada7c:
/* mbed Microcontroller Library * Copyright (c) 2006-2013 ARM Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef EWFUNCTIONPOINTER_H #define EWFUNCTIONPOINTER_H #include <string.h> #include <stdint.h> #include "EwWindow.h" /** A class for storing and calling a pointer to a static or member void function */ class EwFunctionPointer { public: /** Create a FunctionPointer, attaching a static function * * @param function The void static function to attach (default is none) */ EwFunctionPointer(void (*function)(EwWindow* w) = 0); /** Create a FunctionPointer, attaching a member function * * @param object The object pointer to invoke the member function on (i.e. the this pointer) * @param function The address of the void member function to attach */ template<typename T> EwFunctionPointer(T *object, void (T::*member)(EwWindow* w)) { attach(object, member); } /** Attach a static function * * @param function The void static function to attach (default is none) */ void attach(void (*function)(EwWindow* w) = 0); /** Attach a member function * * @param object The object pointer to invoke the member function on (i.e. the this pointer) * @param function The address of the void member function to attach */ template<typename T> void attach(T *object, void (T::*member)(EwWindow* w)) { _object = static_cast<void*>(object); memcpy(_member, (char*)&member, sizeof(member)); _membercaller = &EwFunctionPointer::membercaller<T>; _function = 0; } /** Call the attached static or member function */ void call(EwWindow* w); private: template<typename T> static void membercaller(void *object, char *member, EwWindow* w) { T* o = static_cast<T*>(object); void (T::*m)(EwWindow* w); memcpy((char*)&m, member, sizeof(m)); (o->*m)(w); } void (*_function)(EwWindow* w); // static function pointer - 0 if none attached void *_object; // object this pointer - 0 if none attached char _member[16]; // raw member function pointer storage - converted back by registered _membercaller void (*_membercaller)(void*, char*, EwWindow* w); // registered membercaller function to convert back and call _member on _object }; #endif