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