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 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 #ifndef ORO_UN_MEMBER_HPP
00040 #define ORO_UN_MEMBER_HPP
00041 
00042 #include <boost/shared_ptr.hpp>
00043 #include <boost/mpl/erase.hpp>
00044 #include <boost/mpl/insert.hpp>
00045 #include <boost/mpl/begin_end.hpp>
00046 #include <boost/mpl/next_prior.hpp>
00047 #include <boost/mpl/vector.hpp>
00048 #include <boost/mpl/back.hpp>
00049 #include <boost/mpl/int.hpp>
00050 #include <boost/type_traits.hpp>
00051 #include <boost/function_types/function_type.hpp>
00052 #include <boost/function_types/components.hpp>
00053 #include <boost/function_types/member_function_pointer.hpp>
00054 
00055 namespace RTT
00056 {
00057     namespace internal
00058     {
00065         template<class F>
00066         class UnMember
00067         {
00068             typedef boost::function_types::components<F> member_signature;
00069             typedef typename boost::mpl::erase<typename member_signature::types,
00070                                                typename boost::mpl::next<typename boost::mpl::begin<member_signature>::type>::type>::type non_member_signature;
00071         public:
00072             typedef typename boost::function_types::function_type<non_member_signature>::type type;
00073         };
00074 
00080         template<class F,class Class>
00081         class AddMember
00082         {
00083             typedef boost::function_types::components<F> non_member_signature;
00084             typedef typename boost::mpl::insert<non_member_signature,
00085                                                typename boost::mpl::next<typename boost::mpl::begin<non_member_signature>::type>::type,
00086                                                Class>::type with_member_signature;
00087         public:
00088             typedef typename boost::function_types::member_function_pointer<with_member_signature>::type type;
00089         };
00090 
00096         template<class F>
00097         class ArgMember
00098         {
00099             typedef boost::function_types::components<F> member_signature;
00100             
00101             
00102             typedef typename boost::mpl::erase<typename member_signature::types,
00103                                                typename boost::mpl::next<typename boost::mpl::begin<member_signature>::type>::type>::type non_member_signature;
00104             typedef typename boost::shared_ptr<typename boost::remove_const<typename boost::remove_reference<typename boost::mpl::at<typename member_signature::types,boost::mpl::int_<1> >::type>::type>::type> object_pointer;
00105             
00106             typedef typename boost::mpl::insert<non_member_signature,
00107                                                 typename boost::mpl::next<typename boost::mpl::begin<non_member_signature>::type>::type,
00108                                                 object_pointer
00109 
00110 
00111                                                >::type arg_signature;
00112         public:
00113             typedef typename boost::function_types::function_type<arg_signature>::type type;
00114         };
00115 
00119         template<class F>
00120         class UnPointer
00121         {
00122             typedef boost::function_types::components<F> signature;
00123         public:
00124             typedef typename boost::function_types::function_type<signature>::type type;
00125         };
00126     }
00127 }
00128 
00129 
00130 #endif