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); } }
FP.cpp
- Committer:
- sam_grove
- Date:
- 2014-03-08
- Revision:
- 2:bc7c28fe64b6
- Parent:
- 1:e9a4765b560f
- Child:
- 3:e0f19cdaa46e
File content as of revision 2:bc7c28fe64b6:
/** * @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> 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*>;