Templated function pointer class. Common utility that other classes are built on / with
Dependents: Waldo_Embed_V2 MQTT MQTTSN MQTT ... more
Good resource about declaring templated types for the linker
Basic Use
#include "mbed.h" #include "FP.h" FP<void,bool>fp; DigitalOut myled(LED1); void handler(bool value) { myled = value; return; } int main() { fp.attach(&handler); while(1) { fp(1); wait(0.2); fp(0); wait(0.2); } }
Example using the FP Class with different class member functions
#include "mbed.h" #include "FP.h" FP<void,bool>fp; DigitalOut myled(LED4); class Wrapper { public: Wrapper(){} void handler(bool value) { myled = value; return; } }; int main() { Wrapper wrapped; fp.attach(&wrapped, &Wrapper::handler); while(1) { fp(1); wait(0.2); fp(0); wait(0.2); } }
Example using the FP Class with member FP and member function
#include "mbed.h" #include "FP.h" DigitalOut myled(LED2); class Wrapper { public: Wrapper() { fp.attach(this, &Wrapper::handler); } void handler(bool value) { myled = value; return; } FP<void,bool>fp; }; int main() { Wrapper wrapped; while(1) { wrapped.fp(1); wait(0.2); wrapped.fp(0); wait(0.2); } }
Revision 4:3c62ba1807ac, committed 2014-07-30
- Comitter:
- sam_grove
- Date:
- Wed Jul 30 19:10:31 2014 +0000
- Parent:
- 3:e0f19cdaa46e
- Commit message:
- Moved all implementations to FP.h to not pre-define all templated data types for the linker
Changed in this revision
FP.cpp | Show diff for this revision Revisions of this file |
FP.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/FP.cpp Sun Apr 13 22:31:44 2014 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,599 +0,0 @@ -/** - * @file FP.cpp - * @brief Core Utility - Templated Function Pointer Class - * @author sam grove - * @version 1.0 - * @see - * - * Copyright (c) 2013 - * - * 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. - */ - -#include "FP.h" -#include <stdint.h> - -template<class retT, class argT> -FP<retT, argT>::FP() -{ - obj_callback = 0; - c_callback = 0; -} - -template<class retT, class argT> -bool FP<retT, argT>::attached() -{ - return obj_callback || c_callback; -} - - -template<class retT, class argT> -void FP<retT, argT>::detach() -{ - obj_callback = 0; - c_callback = 0; -} - - -template<class retT, class argT> -void FP<retT, argT>::attach(retT (*function)(argT)) -{ - c_callback = function; -} - -template<class retT, class argT> -retT FP<retT, argT>::operator()(argT arg) const -{ - if( 0 != c_callback ) - { - return obj_callback ? (obj_callback->*method_callback)(arg) : (*c_callback)(arg); - } - return (retT)0; -} - -// pre-define the types for the linker -template class FP<void,char>; -template class FP<void,char*>; -template class FP<void,int8_t>; -template class FP<void,int8_t*>; -template class FP<void,uint8_t>; -template class FP<void,uint8_t*>; -template class FP<void,int16_t>; -template class FP<void,int16_t*>; -template class FP<void,uint16_t>; -template class FP<void,uint16_t*>; -template class FP<void,int32_t>; -template class FP<void,int32_t*>; -template class FP<void,uint32_t>; -template class FP<void,uint32_t*>; -template class FP<void,int64_t>; -template class FP<void,int64_t*>; -template class FP<void,uint64_t>; -template class FP<void,uint64_t*>; -template class FP<void,bool>; -template class FP<void,bool*>; -template class FP<void,float>; -template class FP<void,float*>; -template class FP<void,double>; -template class FP<void,double*>; -template class FP<void,void*>; - -template class FP<int8_t,char>; -template class FP<int8_t,char*>; -template class FP<int8_t,int8_t>; -template class FP<int8_t,int8_t*>; -template class FP<int8_t,uint8_t>; -template class FP<int8_t,uint8_t*>; -template class FP<int8_t,int16_t>; -template class FP<int8_t,int16_t*>; -template class FP<int8_t,uint16_t>; -template class FP<int8_t,uint16_t*>; -template class FP<int8_t,int32_t>; -template class FP<int8_t,int32_t*>; -template class FP<int8_t,uint32_t>; -template class FP<int8_t,uint32_t*>; -template class FP<int8_t,int64_t>; -template class FP<int8_t,int64_t*>; -template class FP<int8_t,uint64_t>; -template class FP<int8_t,uint64_t*>; -template class FP<int8_t,bool>; -template class FP<int8_t,bool*>; -template class FP<int8_t,float>; -template class FP<int8_t,float*>; -template class FP<int8_t,double>; -template class FP<int8_t,double*>; - -template class FP<int8_t*,char>; -template class FP<int8_t*,char*>; -template class FP<int8_t*,int8_t>; -template class FP<int8_t*,int8_t*>; -template class FP<int8_t*,uint8_t>; -template class FP<int8_t*,uint8_t*>; -template class FP<int8_t*,int16_t>; -template class FP<int8_t*,int16_t*>; -template class FP<int8_t*,uint16_t>; -template class FP<int8_t*,uint16_t*>; -template class FP<int8_t*,int32_t>; -template class FP<int8_t*,int32_t*>; -template class FP<int8_t*,uint32_t>; -template class FP<int8_t*,uint32_t*>; -template class FP<int8_t*,int64_t>; -template class FP<int8_t*,int64_t*>; -template class FP<int8_t*,uint64_t>; -template class FP<int8_t*,uint64_t*>; -template class FP<int8_t*,bool>; -template class FP<int8_t*,bool*>; -template class FP<int8_t*,float>; -template class FP<int8_t*,float*>; -template class FP<int8_t*,double>; -template class FP<int8_t*,double*>; - -template class FP<uint8_t,char>; -template class FP<uint8_t,char*>; -template class FP<uint8_t,int8_t>; -template class FP<uint8_t,int8_t*>; -template class FP<uint8_t,uint8_t>; -template class FP<uint8_t,uint8_t*>; -template class FP<uint8_t,int16_t>; -template class FP<uint8_t,int16_t*>; -template class FP<uint8_t,uint16_t>; -template class FP<uint8_t,uint16_t*>; -template class FP<uint8_t,int32_t>; -template class FP<uint8_t,int32_t*>; -template class FP<uint8_t,uint32_t>; -template class FP<uint8_t,uint32_t*>; -template class FP<uint8_t,int64_t>; -template class FP<uint8_t,int64_t*>; -template class FP<uint8_t,uint64_t>; -template class FP<uint8_t,uint64_t*>; -template class FP<uint8_t,bool>; -template class FP<uint8_t,bool*>; -template class FP<uint8_t,float>; -template class FP<uint8_t,float*>; -template class FP<uint8_t,double>; -template class FP<uint8_t,double*>; - -template class FP<uint8_t*,char>; -template class FP<uint8_t*,char*>; -template class FP<uint8_t*,int8_t>; -template class FP<uint8_t*,int8_t*>; -template class FP<uint8_t*,uint8_t>; -template class FP<uint8_t*,uint8_t*>; -template class FP<uint8_t*,int16_t>; -template class FP<uint8_t*,int16_t*>; -template class FP<uint8_t*,uint16_t>; -template class FP<uint8_t*,uint16_t*>; -template class FP<uint8_t*,int32_t>; -template class FP<uint8_t*,int32_t*>; -template class FP<uint8_t*,uint32_t>; -template class FP<uint8_t*,uint32_t*>; -template class FP<uint8_t*,int64_t>; -template class FP<uint8_t*,int64_t*>; -template class FP<uint8_t*,uint64_t>; -template class FP<uint8_t*,uint64_t*>; -template class FP<uint8_t*,bool>; -template class FP<uint8_t*,bool*>; -template class FP<uint8_t*,float>; -template class FP<uint8_t*,float*>; -template class FP<uint8_t*,double>; -template class FP<uint8_t*,double*>; - -template class FP<int16_t,char>; -template class FP<int16_t,char*>; -template class FP<int16_t,int8_t>; -template class FP<int16_t,int8_t*>; -template class FP<int16_t,uint8_t>; -template class FP<int16_t,uint8_t*>; -template class FP<int16_t,int16_t>; -template class FP<int16_t,int16_t*>; -template class FP<int16_t,uint16_t>; -template class FP<int16_t,uint16_t*>; -template class FP<int16_t,int32_t>; -template class FP<int16_t,int32_t*>; -template class FP<int16_t,uint32_t>; -template class FP<int16_t,uint32_t*>; -template class FP<int16_t,int64_t>; -template class FP<int16_t,int64_t*>; -template class FP<int16_t,uint64_t>; -template class FP<int16_t,uint64_t*>; -template class FP<int16_t,bool>; -template class FP<int16_t,bool*>; -template class FP<int16_t,float>; -template class FP<int16_t,float*>; -template class FP<int16_t,double>; -template class FP<int16_t,double*>; - -template class FP<int16_t*,char>; -template class FP<int16_t*,char*>; -template class FP<int16_t*,int8_t>; -template class FP<int16_t*,int8_t*>; -template class FP<int16_t*,uint8_t>; -template class FP<int16_t*,uint8_t*>; -template class FP<int16_t*,int16_t>; -template class FP<int16_t*,int16_t*>; -template class FP<int16_t*,uint16_t>; -template class FP<int16_t*,uint16_t*>; -template class FP<int16_t*,int32_t>; -template class FP<int16_t*,int32_t*>; -template class FP<int16_t*,uint32_t>; -template class FP<int16_t*,uint32_t*>; -template class FP<int16_t*,int64_t>; -template class FP<int16_t*,int64_t*>; -template class FP<int16_t*,uint64_t>; -template class FP<int16_t*,uint64_t*>; -template class FP<int16_t*,bool>; -template class FP<int16_t*,bool*>; -template class FP<int16_t*,float>; -template class FP<int16_t*,float*>; -template class FP<int16_t*,double>; -template class FP<int16_t*,double*>; - -template class FP<uint16_t,char>; -template class FP<uint16_t,char*>; -template class FP<uint16_t,int8_t>; -template class FP<uint16_t,int8_t*>; -template class FP<uint16_t,uint8_t>; -template class FP<uint16_t,uint8_t*>; -template class FP<uint16_t,int16_t>; -template class FP<uint16_t,int16_t*>; -template class FP<uint16_t,uint16_t>; -template class FP<uint16_t,uint16_t*>; -template class FP<uint16_t,int32_t>; -template class FP<uint16_t,int32_t*>; -template class FP<uint16_t,uint32_t>; -template class FP<uint16_t,uint32_t*>; -template class FP<uint16_t,int64_t>; -template class FP<uint16_t,int64_t*>; -template class FP<uint16_t,uint64_t>; -template class FP<uint16_t,uint64_t*>; -template class FP<uint16_t,bool>; -template class FP<uint16_t,bool*>; -template class FP<uint16_t,float>; -template class FP<uint16_t,float*>; -template class FP<uint16_t,double>; -template class FP<uint16_t,double*>; - -template class FP<uint16_t*,char>; -template class FP<uint16_t*,char*>; -template class FP<uint16_t*,int8_t>; -template class FP<uint16_t*,int8_t*>; -template class FP<uint16_t*,uint8_t>; -template class FP<uint16_t*,uint8_t*>; -template class FP<uint16_t*,int16_t>; -template class FP<uint16_t*,int16_t*>; -template class FP<uint16_t*,uint16_t>; -template class FP<uint16_t*,uint16_t*>; -template class FP<uint16_t*,int32_t>; -template class FP<uint16_t*,int32_t*>; -template class FP<uint16_t*,uint32_t>; -template class FP<uint16_t*,uint32_t*>; -template class FP<uint16_t*,int64_t>; -template class FP<uint16_t*,int64_t*>; -template class FP<uint16_t*,uint64_t>; -template class FP<uint16_t*,uint64_t*>; -template class FP<uint16_t*,bool>; -template class FP<uint16_t*,bool*>; -template class FP<uint16_t*,float>; -template class FP<uint16_t*,float*>; -template class FP<uint16_t*,double>; -template class FP<uint16_t*,double*>; - -template class FP<int32_t,char>; -template class FP<int32_t,char*>; -template class FP<int32_t,int8_t>; -template class FP<int32_t,int8_t*>; -template class FP<int32_t,uint8_t>; -template class FP<int32_t,uint8_t*>; -template class FP<int32_t,int16_t>; -template class FP<int32_t,int16_t*>; -template class FP<int32_t,uint16_t>; -template class FP<int32_t,uint16_t*>; -template class FP<int32_t,int32_t>; -template class FP<int32_t,int32_t*>; -template class FP<int32_t,uint32_t>; -template class FP<int32_t,uint32_t*>; -template class FP<int32_t,int64_t>; -template class FP<int32_t,int64_t*>; -template class FP<int32_t,uint64_t>; -template class FP<int32_t,uint64_t*>; -template class FP<int32_t,bool>; -template class FP<int32_t,bool*>; -template class FP<int32_t,float>; -template class FP<int32_t,float*>; -template class FP<int32_t,double>; -template class FP<int32_t,double*>; - -template class FP<int32_t*,char>; -template class FP<int32_t*,char*>; -template class FP<int32_t*,int8_t>; -template class FP<int32_t*,int8_t*>; -template class FP<int32_t*,uint8_t>; -template class FP<int32_t*,uint8_t*>; -template class FP<int32_t*,int16_t>; -template class FP<int32_t*,int16_t*>; -template class FP<int32_t*,uint16_t>; -template class FP<int32_t*,uint16_t*>; -template class FP<int32_t*,int32_t>; -template class FP<int32_t*,int32_t*>; -template class FP<int32_t*,uint32_t>; -template class FP<int32_t*,uint32_t*>; -template class FP<int32_t*,int64_t>; -template class FP<int32_t*,int64_t*>; -template class FP<int32_t*,uint64_t>; -template class FP<int32_t*,uint64_t*>; -template class FP<int32_t*,bool>; -template class FP<int32_t*,bool*>; -template class FP<int32_t*,float>; -template class FP<int32_t*,float*>; -template class FP<int32_t*,double>; -template class FP<int32_t*,double*>; - -template class FP<uint32_t,char>; -template class FP<uint32_t,char*>; -template class FP<uint32_t,int8_t>; -template class FP<uint32_t,int8_t*>; -template class FP<uint32_t,uint8_t>; -template class FP<uint32_t,uint8_t*>; -template class FP<uint32_t,int16_t>; -template class FP<uint32_t,int16_t*>; -template class FP<uint32_t,uint16_t>; -template class FP<uint32_t,uint16_t*>; -template class FP<uint32_t,int32_t>; -template class FP<uint32_t,int32_t*>; -template class FP<uint32_t,uint32_t>; -template class FP<uint32_t,uint32_t*>; -template class FP<uint32_t,int64_t>; -template class FP<uint32_t,int64_t*>; -template class FP<uint32_t,uint64_t>; -template class FP<uint32_t,uint64_t*>; -template class FP<uint32_t,bool>; -template class FP<uint32_t,bool*>; -template class FP<uint32_t,float>; -template class FP<uint32_t,float*>; -template class FP<uint32_t,double>; -template class FP<uint32_t,double*>; - -template class FP<uint32_t*,char>; -template class FP<uint32_t*,char*>; -template class FP<uint32_t*,int8_t>; -template class FP<uint32_t*,int8_t*>; -template class FP<uint32_t*,uint8_t>; -template class FP<uint32_t*,uint8_t*>; -template class FP<uint32_t*,int16_t>; -template class FP<uint32_t*,int16_t*>; -template class FP<uint32_t*,uint16_t>; -template class FP<uint32_t*,uint16_t*>; -template class FP<uint32_t*,int32_t>; -template class FP<uint32_t*,int32_t*>; -template class FP<uint32_t*,uint32_t>; -template class FP<uint32_t*,uint32_t*>; -template class FP<uint32_t*,int64_t>; -template class FP<uint32_t*,int64_t*>; -template class FP<uint32_t*,uint64_t>; -template class FP<uint32_t*,uint64_t*>; -template class FP<uint32_t*,bool>; -template class FP<uint32_t*,bool*>; -template class FP<uint32_t*,float>; -template class FP<uint32_t*,float*>; -template class FP<uint32_t*,double>; -template class FP<uint32_t*,double*>; - -template class FP<int64_t,char>; -template class FP<int64_t,char*>; -template class FP<int64_t,int8_t>; -template class FP<int64_t,int8_t*>; -template class FP<int64_t,uint8_t>; -template class FP<int64_t,uint8_t*>; -template class FP<int64_t,int16_t>; -template class FP<int64_t,int16_t*>; -template class FP<int64_t,uint16_t>; -template class FP<int64_t,uint16_t*>; -template class FP<int64_t,int32_t>; -template class FP<int64_t,int32_t*>; -template class FP<int64_t,uint32_t>; -template class FP<int64_t,uint32_t*>; -template class FP<int64_t,int64_t>; -template class FP<int64_t,int64_t*>; -template class FP<int64_t,uint64_t>; -template class FP<int64_t,uint64_t*>; -template class FP<int64_t,bool>; -template class FP<int64_t,bool*>; -template class FP<int64_t,float>; -template class FP<int64_t,float*>; -template class FP<int64_t,double>; -template class FP<int64_t,double*>; - -template class FP<int64_t*,char>; -template class FP<int64_t*,char*>; -template class FP<int64_t*,int8_t>; -template class FP<int64_t*,int8_t*>; -template class FP<int64_t*,uint8_t>; -template class FP<int64_t*,uint8_t*>; -template class FP<int64_t*,int16_t>; -template class FP<int64_t*,int16_t*>; -template class FP<int64_t*,uint16_t>; -template class FP<int64_t*,uint16_t*>; -template class FP<int64_t*,int32_t>; -template class FP<int64_t*,int32_t*>; -template class FP<int64_t*,uint32_t>; -template class FP<int64_t*,uint32_t*>; -template class FP<int64_t*,int64_t>; -template class FP<int64_t*,int64_t*>; -template class FP<int64_t*,uint64_t>; -template class FP<int64_t*,uint64_t*>; -template class FP<int64_t*,bool>; -template class FP<int64_t*,bool*>; -template class FP<int64_t*,float>; -template class FP<int64_t*,float*>; -template class FP<int64_t*,double>; -template class FP<int64_t*,double*>; - -template class FP<uint64_t,char>; -template class FP<uint64_t,char*>; -template class FP<uint64_t,int8_t>; -template class FP<uint64_t,int8_t*>; -template class FP<uint64_t,uint8_t>; -template class FP<uint64_t,uint8_t*>; -template class FP<uint64_t,int16_t>; -template class FP<uint64_t,int16_t*>; -template class FP<uint64_t,uint16_t>; -template class FP<uint64_t,uint16_t*>; -template class FP<uint64_t,int32_t>; -template class FP<uint64_t,int32_t*>; -template class FP<uint64_t,uint32_t>; -template class FP<uint64_t,uint32_t*>; -template class FP<uint64_t,int64_t>; -template class FP<uint64_t,int64_t*>; -template class FP<uint64_t,uint64_t>; -template class FP<uint64_t,uint64_t*>; -template class FP<uint64_t,bool>; -template class FP<uint64_t,bool*>; -template class FP<uint64_t,float>; -template class FP<uint64_t,float*>; -template class FP<uint64_t,double>; -template class FP<uint64_t,double*>; - -template class FP<uint64_t*,char>; -template class FP<uint64_t*,char*>; -template class FP<uint64_t*,int8_t>; -template class FP<uint64_t*,int8_t*>; -template class FP<uint64_t*,uint8_t>; -template class FP<uint64_t*,uint8_t*>; -template class FP<uint64_t*,int16_t>; -template class FP<uint64_t*,int16_t*>; -template class FP<uint64_t*,uint16_t>; -template class FP<uint64_t*,uint16_t*>; -template class FP<uint64_t*,int32_t>; -template class FP<uint64_t*,int32_t*>; -template class FP<uint64_t*,uint32_t>; -template class FP<uint64_t*,uint32_t*>; -template class FP<uint64_t*,int64_t>; -template class FP<uint64_t*,int64_t*>; -template class FP<uint64_t*,uint64_t>; -template class FP<uint64_t*,uint64_t*>; -template class FP<uint64_t*,bool>; -template class FP<uint64_t*,bool*>; -template class FP<uint64_t*,float>; -template class FP<uint64_t*,float*>; -template class FP<uint64_t*,double>; -template class FP<uint64_t*,double*>; - -template class FP<float,char>; -template class FP<float,char*>; -template class FP<float,int8_t>; -template class FP<float,int8_t*>; -template class FP<float,uint8_t>; -template class FP<float,uint8_t*>; -template class FP<float,int16_t>; -template class FP<float,int16_t*>; -template class FP<float,uint16_t>; -template class FP<float,uint16_t*>; -template class FP<float,int32_t>; -template class FP<float,int32_t*>; -template class FP<float,uint32_t>; -template class FP<float,uint32_t*>; -template class FP<float,int64_t>; -template class FP<float,int64_t*>; -template class FP<float,uint64_t>; -template class FP<float,uint64_t*>; -template class FP<float,bool>; -template class FP<float,bool*>; -template class FP<float,float>; -template class FP<float,float*>; -template class FP<float,double>; -template class FP<float,double*>; - -template class FP<float*,char>; -template class FP<float*,char*>; -template class FP<float*,int8_t>; -template class FP<float*,int8_t*>; -template class FP<float*,uint8_t>; -template class FP<float*,uint8_t*>; -template class FP<float*,int16_t>; -template class FP<float*,int16_t*>; -template class FP<float*,uint16_t>; -template class FP<float*,uint16_t*>; -template class FP<float*,int32_t>; -template class FP<float*,int32_t*>; -template class FP<float*,uint32_t>; -template class FP<float*,uint32_t*>; -template class FP<float*,int64_t>; -template class FP<float*,int64_t*>; -template class FP<float*,uint64_t>; -template class FP<float*,uint64_t*>; -template class FP<float*,bool>; -template class FP<float*,bool*>; -template class FP<float*,float>; -template class FP<float*,float*>; -template class FP<float*,double>; -template class FP<float*,double*>; - -template class FP<double,char>; -template class FP<double,char*>; -template class FP<double,int8_t>; -template class FP<double,int8_t*>; -template class FP<double,uint8_t>; -template class FP<double,uint8_t*>; -template class FP<double,int16_t>; -template class FP<double,int16_t*>; -template class FP<double,uint16_t>; -template class FP<double,uint16_t*>; -template class FP<double,int32_t>; -template class FP<double,int32_t*>; -template class FP<double,uint32_t>; -template class FP<double,uint32_t*>; -template class FP<double,int64_t>; -template class FP<double,int64_t*>; -template class FP<double,uint64_t>; -template class FP<double,uint64_t*>; -template class FP<double,bool>; -template class FP<double,bool*>; -template class FP<double,float>; -template class FP<double,float*>; -template class FP<double,double>; -template class FP<double,double*>; - -template class FP<double*,char>; -template class FP<double*,char*>; -template class FP<double*,int8_t>; -template class FP<double*,int8_t*>; -template class FP<double*,uint8_t>; -template class FP<double*,uint8_t*>; -template class FP<double*,int16_t>; -template class FP<double*,int16_t*>; -template class FP<double*,uint16_t>; -template class FP<double*,uint16_t*>; -template class FP<double*,int32_t>; -template class FP<double*,int32_t*>; -template class FP<double*,uint32_t>; -template class FP<double*,uint32_t*>; -template class FP<double*,int64_t>; -template class FP<double*,int64_t*>; -template class FP<double*,uint64_t>; -template class FP<double*,uint64_t*>; -template class FP<double*,bool>; -template class FP<double*,bool*>; -template class FP<double*,float>; -template class FP<double*,float*>; -template class FP<double*,double>; -template class FP<double*,double*>; - -template class FP<char, char>; -template class FP<char, char*>; -template class FP<char, const char*>; - -template class FP<char*, char>; -template class FP<char*, char*>; -template class FP<char*, const char*>; - -
--- a/FP.h Sun Apr 13 22:31:44 2014 +0000 +++ b/FP.h Wed Jul 30 19:10:31 2014 +0000 @@ -2,8 +2,8 @@ * @file FP.h * @brief Core Utility - Templated Function Pointer Class * @author sam grove - * @version 1.0 - * @see + * @version 1.1 + * @see http://mbed.org/users/sam_grove/code/FP/ * * Copyright (c) 2013 * @@ -27,21 +27,57 @@ * @code * #include "mbed.h" * #include "FP.h" - * + * * FP<void,bool>fp; * DigitalOut myled(LED1); - * + * * void handler(bool value) * { * myled = value; * return; * } - * + * * int main() * { * fp.attach(&handler); - * - * while(1) + * + * while(1) + * { + * fp(1); + * wait(0.2); + * fp(0); + * wait(0.2); + * } + * } + * @endcode + */ + +/** Example using the FP Class with different class member functions + * @code + * #include "mbed.h" + * #include "FP.h" + * + * FP<void,bool>fp; + * DigitalOut myled(LED4); + * + * class Wrapper + * { + * public: + * Wrapper(){} + * + * void handler(bool value) + * { + * myled = value; + * return; + * } + * }; + * + * int main() + * { + * Wrapper wrapped; + * fp.attach(&wrapped, &Wrapper::handler); + * + * while(1) * { * fp(1); * wait(0.2); @@ -51,96 +87,65 @@ * } * @endcode */ - -/** Example using the FP Class with different class member functions - * @code - * #include "mbed.h" - * #include "FP.h" - * - * FP<void,bool>fp; - * DigitalOut myled(LED4); - * - * class Wrapper - * { - * public: - * Wrapper(){} - * - * void handler(bool value) - * { - * myled = value; - * return; - * } - * }; - * - * int main() - * { - * Wrapper wrapped; - * fp.attach(&wrapped, &Wrapper::handler); - * - * while(1) - * { - * fp(1); - * wait(0.2); - * fp(0); - * wait(0.2); - * } - * } - * @endcode - */ - - /** Example using the FP Class with member FP and member function - * @code - * #include "mbed.h" - * #include "FP.h" - * - * DigitalOut myled(LED2); - * - * class Wrapper - * { - * public: - * Wrapper() - * { - * fp.attach(this, &Wrapper::handler); - * } - * - * void handler(bool value) - * { - * myled = value; - * return; - * } - * - * FP<void,bool>fp; - * }; - * - * int main() - * { - * Wrapper wrapped; - * - * while(1) - * { - * wrapped.fp(1); - * wait(0.2); - * wrapped.fp(0); - * wait(0.2); - * } - * } - * @endcode - */ + +/** Example using the FP Class with member FP and member function +* @code +* #include "mbed.h" +* #include "FP.h" +* +* DigitalOut myled(LED2); +* +* class Wrapper +* { +* public: +* Wrapper() +* { +* fp.attach(this, &Wrapper::handler); +* } +* +* void handler(bool value) +* { +* myled = value; +* return; +* } +* +* FP<void,bool>fp; +* }; +* +* int main() +* { +* Wrapper wrapped; +* +* while(1) +* { +* wrapped.fp(1); +* wait(0.2); +* wrapped.fp(0); +* wait(0.2); +* } +* } +* @endcode +*/ /** * @class FP - * @brief API abstraction for a Function Pointers - */ + * @brief API for managing Function Pointers + */ template<class retT, class argT> class FP { public: - /** Create the FP object - */ - FP(); + /** Create the FP object - only one callback can be attached to the object, that is + * a member function or a global function, not both at the same time + */ + FP() + { + obj_callback = 0; + c_callback = 0; + } - /** Add a callback function to the class - * @param item - Address of the initialized class + /** Add a callback function to the object + * @param item - Address of the initialized object * @param member - Address of the member function (dont forget the scope that the function is defined in) */ template<class T> @@ -151,34 +156,54 @@ return; } - /** Add a callback function to the class + /** Add a callback function to the object * @param function - The address of a globally defined function */ - void attach(retT (*function)(argT)); - + void attach(retT (*function)(argT)) + { + c_callback = function; + } + /** Invoke the function attached to the class * @param arg - An argument that is passed into the function handler that is called * @return The return from the function hanlder called by this class */ - retT operator()(argT arg) const; - - bool attached(); - - void detach(); + retT operator()(argT arg) const + { + if( 0 != c_callback ) { + return obj_callback ? (obj_callback->*method_callback)(arg) : (*c_callback)(arg); + } + return (retT)0; + } + + /** Determine if an callback is currently hooked + * @return 1 if a method is hooked, 0 otherwise + */ + bool attached() + { + return obj_callback || c_callback; + } + + /** Release a function from the callback hook + */ + void detach() + { + obj_callback = 0; + c_callback = 0; + } private: - + // empty type used for casting class FPtrDummy; - + FPtrDummy *obj_callback; - + /** * @union Funciton * @brief Member or global callback function - */ - union - { + */ + union { retT (*c_callback)(argT); /*!< Footprint for a global function */ retT (FPtrDummy::*method_callback)(argT); /*!< Footprint for a member function */ };