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
00025
00028
00029 #ifndef THOR_SINGLEDISPATCHER_HPP
00030 #define THOR_SINGLEDISPATCHER_HPP
00031
00032 #include <Thor/Tools/NonCopyable.hpp>
00033 #include <Thor/Tools/ForEach.hpp>
00034 #include <Thor/Tools/Exceptions.hpp>
00035 #include <Thor/Detail/UnaryFunction.hpp>
00036 #include <Thor/Detail/AssociativeHelpers.hpp>
00037 #include <Thor/Detail/Metaprogramming.hpp>
00038 #include <Thor/Detail/TypeInfo.hpp>
00039
00040 #include <vector>
00041 #include <algorithm>
00042 #include <cassert>
00043
00044
00045 namespace thor
00046 {
00047
00050
00061 template <class B, typename R = void>
00062 class SingleDispatcher : private NonCopyable
00063 {
00064
00065
00066
00067
00068 THOR_STATIC_ASSERT(
00069 std::tr1::is_pointer<B>::value && std::tr1::is_polymorphic< typename std::tr1::remove_pointer<B>::type >::value
00070 || std::tr1::is_reference<B>::value && std::tr1::is_polymorphic< typename std::tr1::remove_reference<B>::type >::value )
00071
00072
00073
00074
00075 public:
00078 SingleDispatcher();
00079
00082 ~SingleDispatcher();
00083
00100 template <class D>
00101 void Register(R (*globalFunction)( THOR_REPLICATE(B,D) ));
00102
00124 template <class D, class C>
00125 void Register(R (C::*memberFunction)( THOR_REPLICATE(B,D) ), C& object);
00126
00145 template <class D, typename Fn>
00146 void Register(const Fn& functionObject);
00147
00153 R Call(B arg) const;
00154
00155
00156
00157
00158 private:
00159 typedef detail::TypeInfo Key;
00160 typedef detail::UnaryFunctionBase<B, R>* Value;
00161 typedef detail::KeyValuePair<Key, Value> Pair;
00162 typedef std::vector<Pair> FnMap;
00163
00164
00165
00166
00167 private:
00168
00169 void InternalRegister(Key key, Value value);
00170
00171
00172 typename FnMap::const_iterator Find(Key key) const;
00173
00174
00175
00176
00177 private:
00178 FnMap mMap;
00179 };
00180
00202
00204
00205 }
00206
00207 #include <Thor/Detail/SingleDispatcher.inl>
00208 #endif // THOR_SINGLEDISPATCHER_HPP