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);
    }
}

Files at this revision

API Documentation at this revision

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
diff -r e0f19cdaa46e -r 3c62ba1807ac FP.cpp
--- 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*>;
-
-
diff -r e0f19cdaa46e -r 3c62ba1807ac FP.h
--- 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 */
     };