FnDispatcher.inl
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef SOFA_HELPER_FNDISPATCHER_INL
00028 #define SOFA_HELPER_FNDISPATCHER_INL
00029
00030 #include <sofa/helper/FnDispatcher.h>
00031 #include <sofa/helper/Factory.h>
00032 #include <iostream>
00033 #include <string>
00034
00035 namespace sofa
00036 {
00037
00038 namespace helper
00039 {
00040
00041
00042
00043
00044
00045
00046 template <class BaseClass, typename ResulT>
00047 ResulT BasicDispatcher<BaseClass, ResulT>::defaultFn(BaseClass& arg1, BaseClass& arg2)
00048 {
00049 std::cerr << "ERROR DISPATCH ("
00050 << gettypename(typeid(arg1)) << ", "
00051 << gettypename(typeid(arg2)) << ")\n";
00052 this->ignore(typeid(arg1), typeid(arg2));
00053 return ResulT();
00054 }
00055
00056 template <class BaseClass, typename ResulT>
00057 ResulT BasicDispatcher<BaseClass, ResulT>::ignoreFn(BaseClass& , BaseClass& )
00058 {
00059 return ResulT();
00060 }
00061
00062 template <class BaseClass, typename ResulT>
00063 ResulT BasicDispatcher<BaseClass, ResulT>::go(BaseClass &arg1,BaseClass &arg2)
00064 {
00065 typename MapType::iterator itt = this->callBackMap.find(KeyType(TypeInfo(typeid(arg1)),TypeInfo(typeid(arg2))));
00066 if (itt==callBackMap.end())
00067 return defaultFn(arg1,arg2);
00068 else
00069 return (itt->second)(arg1,arg2);
00070 }
00071
00073 template <class BaseClass, typename ResulT>
00074 bool BasicDispatcher<BaseClass, ResulT>::isSupported(BaseClass &arg1, BaseClass &arg2)
00075 {
00076 typename MapType::iterator itt = this->callBackMap.find(KeyType(TypeInfo(typeid(arg1)),TypeInfo(typeid(arg2))));
00077 if (itt==callBackMap.end())
00078 return false;
00079 else
00080 return itt->second != ignoreFn;
00081 }
00082
00083 template <class BaseClass, typename ResulT>
00084 SingletonFnDispatcher<BaseClass, ResulT>::SingletonFnDispatcher()
00085 {
00086 }
00087
00088 template <class BaseClass, typename ResulT>
00089 SingletonFnDispatcher<BaseClass, ResulT>* SingletonFnDispatcher<BaseClass, ResulT>::getInstance()
00090 {
00091 static SingletonFnDispatcher<BaseClass, ResulT> instance;
00092 return &instance;
00093 }
00094
00095 }
00096
00097 }
00098
00099
00100 #endif