Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: Waldo_Embed_V2 MQTT MQTTSN MQTT ... more
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 */
};