Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r68720 - in sandbox/tti: boost/tti boost/tti/detail libs/tti/doc libs/tti/test
From: eldiener_at_[hidden]
Date: 2011-02-08 11:13:27


Author: eldiener
Date: 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
New Revision: 68720
URL: http://svn.boost.org/trac/boost/changeset/68720

Log:
Added support for metafunction classes
Text files modified:
   sandbox/tti/boost/tti/TTIntrospection.hpp | 740 +++++++++++++++------------------------
   sandbox/tti/boost/tti/TTIntrospectionVM.hpp | 47 ++
   sandbox/tti/boost/tti/detail/TTIntrospectionDetail.hpp | 448 +++++++++++++++++++++++
   sandbox/tti/libs/tti/doc/TTIAcknowledgements.qbk | 4
   sandbox/tti/libs/tti/test/TestMFHasMemberData.cpp | 76 ++++
   sandbox/tti/libs/tti/test/TestMFHasMemberData.hpp | 12
   sandbox/tti/libs/tti/test/TestMFHasMemberDataCompile.cpp | 136 +++++-
   sandbox/tti/libs/tti/test/TestMFHasMemberFunction.cpp | 63 +++
   sandbox/tti/libs/tti/test/TestMFHasMemberFunction.hpp | 7
   sandbox/tti/libs/tti/test/TestMFHasMemberFunctionCompile.cpp | 57 +++
   sandbox/tti/libs/tti/test/TestMFHasStaticData.cpp | 9
   sandbox/tti/libs/tti/test/TestMFHasStaticData.hpp | 3
   sandbox/tti/libs/tti/test/TestMFHasStaticDataCompile.cpp | 8
   sandbox/tti/libs/tti/test/TestMFHasStaticFunction.cpp | 46 ++
   sandbox/tti/libs/tti/test/TestMFHasStaticFunction.hpp | 5
   sandbox/tti/libs/tti/test/TestMFHasStaticFunctionCompile.cpp | 41 ++
   sandbox/tti/libs/tti/test/TestMFHasTemplate.cpp | 40 ++
   sandbox/tti/libs/tti/test/TestMFHasTemplate.hpp | 8
   sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.cpp | 48 ++
   sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.hpp | 8
   sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParamsCompile.cpp | 27 +
   sandbox/tti/libs/tti/test/TestMFHasTemplateCompile.cpp | 30 +
   sandbox/tti/libs/tti/test/TestMFHasType.cpp | 68 +++
   sandbox/tti/libs/tti/test/TestMFHasType.hpp | 13
   sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.cpp | 91 ++++
   sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.hpp | 12
   sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedefCompile.cpp | 74 +++
   sandbox/tti/libs/tti/test/TestMFHasTypeCompile.cpp | 62 +++
   sandbox/tti/libs/tti/test/TestMFMemberType.cpp | 94 +++++
   sandbox/tti/libs/tti/test/TestMFMemberType.hpp | 9
   sandbox/tti/libs/tti/test/TestMFMemberTypeCompile.cpp | 84 ++++
   sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.cpp | 48 ++
   sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.hpp | 8
   sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParamsCompile.cpp | 27 +
   34 files changed, 1957 insertions(+), 496 deletions(-)

Modified: sandbox/tti/boost/tti/TTIntrospection.hpp
==============================================================================
--- sandbox/tti/boost/tti/TTIntrospection.hpp (original)
+++ sandbox/tti/boost/tti/TTIntrospection.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -2,18 +2,13 @@
 #define TT_INTROSPECTION_HPP
 
 #include <boost/config.hpp>
-#include <boost/function_types/is_member_object_pointer.hpp>
-#include <boost/function_types/parameter_types.hpp>
 #include <boost/function_types/property_tags.hpp>
 #include <boost/mpl/has_xxx.hpp>
 #include <boost/mpl/apply.hpp>
-#include <boost/mpl/at.hpp>
 #include <boost/mpl/bool.hpp>
 #include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/identity.hpp>
-#include <boost/mpl/int.hpp>
 #include <boost/mpl/placeholders.hpp>
-#include <boost/mpl/quote.hpp>
 #include <boost/mpl/transform.hpp>
 #include <boost/mpl/vector.hpp>
 #include <boost/preprocessor/arithmetic/add.hpp>
@@ -57,44 +52,19 @@
   { \
   namespace detail \
     { \
- BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, false) \
+ TTI_DETAIL_TRAIT_HAS_TYPE(trait,name) \
     } \
   \
- template<class T,class U,class B> \
- struct BOOST_PP_CAT(trait,_impl) \
- { \
- typedef typename \
- boost::mpl::eval_if \
- < \
- boost::is_same<typename T::name,U>, \
- boost::mpl::true_, \
- boost::mpl::false_ \
- >::type \
- type; \
- }; \
- \
- template<class T,class U> \
- struct BOOST_PP_CAT(trait,_impl)<T,U,boost::mpl::false_::type> \
- { \
- typedef boost::mpl::false_::type type; \
- }; \
- \
- template<class T> \
- struct BOOST_PP_CAT(trait,_impl)<T,tti::detail::notype,boost::mpl::true_::type> \
- { \
- typedef boost::mpl::true_::type type; \
- }; \
- \
   template<class T,class U = tti::detail::notype> \
   struct trait \
     { \
     \
     typedef typename \
- BOOST_PP_CAT(trait,_impl) \
+ detail::trait \
       < \
       T, \
       U, \
- typename tti::detail::trait<T>::type \
+ typename detail::mpl::trait<T>::type \
>::type \
     type; \
     \
@@ -103,6 +73,35 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_TYPE(trait,name) \
+namespace tti \
+ { \
+ namespace detail \
+ { \
+ TTI_DETAIL_TRAIT_HAS_TYPE(trait,name) \
+ } \
+ \
+ struct trait \
+ { \
+ template<class T,class U = tti::detail::notype> \
+ struct apply \
+ { \
+ \
+ typedef typename \
+ detail::trait \
+ < \
+ T, \
+ U, \
+ typename detail::mpl::trait<T>::type \
+ >::type \
+ type; \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
+ }; \
+ }; \
+ } \
+/**/
+
 /// Expands to a metafunction which tests whether an inner type with a particular name exists and optionally is a particular type.
 /**
 
@@ -127,6 +126,14 @@
   ) \
 /**/
 
+#define TTI_MTFC_HAS_TYPE(name) \
+ TTI_MTFC_TRAIT_HAS_TYPE \
+ ( \
+ BOOST_PP_CAT(mtfc_has_type_,name), \
+ name \
+ ) \
+/**/
+
 /// Expands to a metafunction whose typedef 'type' is either the named type or an unspecified type.
 /**
 
@@ -152,7 +159,7 @@
   { \
   namespace detail \
     { \
- TTI_DETAIL_TRAIT_HAS_TYPE(trait,name) \
+ TTI_DETAIL_TRAIT_HAS_TYPE_MEMBER_TYPE(trait,name) \
     TTI_DETAIL_TRAIT_MEMBER_TYPE(trait,name) \
     } \
   template<class T> \
@@ -170,6 +177,32 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_MEMBER_TYPE(trait,name) \
+namespace tti \
+ { \
+ namespace detail \
+ { \
+ TTI_DETAIL_TRAIT_HAS_TYPE_MEMBER_TYPE(trait,name) \
+ TTI_DETAIL_TRAIT_MEMBER_TYPE(trait,name) \
+ } \
+ struct trait \
+ { \
+ template<class T> \
+ struct apply \
+ { \
+ typedef typename \
+ boost::mpl::eval_if \
+ < \
+ tti::detail::trait<T>, \
+ tti::detail::member_type::trait<T>, \
+ boost::mpl::identity<tti::detail::notype> \
+ >::type \
+ type; \
+ }; \
+ }; \
+ } \
+/**/
+
 /// Expands to a metafunction whose typedef 'type' is either the named type or an unspecified type.
 /**
 
@@ -197,6 +230,14 @@
   ) \
 /**/
   
+#define TTI_MTFC_MEMBER_TYPE(name) \
+ TTI_MTFC_TRAIT_MEMBER_TYPE \
+ ( \
+ BOOST_PP_CAT(mtfc_member_type_,name), \
+ name \
+ ) \
+/**/
+
 /// Expands to a metafunction which tests whether an inner class template with a particular name exists.
 /**
 
@@ -231,6 +272,26 @@
   } \
 /**/
   
+#define TTI_MTFC_TRAIT_HAS_TEMPLATE(trait,name) \
+namespace tti \
+ { \
+ namespace detail \
+ { \
+ BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(trait, name, false) \
+ } \
+ struct trait \
+ { \
+ template<class T> \
+ struct apply \
+ { \
+ typedef typename tti::detail::trait<T>::type type; \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
+ }; \
+ }; \
+ } \
+/**/
+
 /// Expands to a metafunction which tests whether an inner class template with a particular name exists.
 /**
 
@@ -255,6 +316,14 @@
   ) \
 /**/
 
+#define TTI_MTFC_HAS_TEMPLATE(name) \
+ TTI_MTFC_TRAIT_HAS_TEMPLATE \
+ ( \
+ BOOST_PP_CAT(mtfc_has_template_,name), \
+ name \
+ ) \
+/**/
+
 #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
 
@@ -287,6 +356,19 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpSeq) \
+namespace tti \
+ { \
+ struct trait \
+ { \
+ TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE \
+ ( \
+ ( BOOST_PP_ADD(BOOST_PP_SEQ_SIZE(tpSeq),4), ( apply, name, 1, false, BOOST_PP_SEQ_ENUM(tpSeq) ) ) \
+ ) \
+ }; \
+ } \
+/**/
+
 #else // !!BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
 
 /// Expands to a metafunction which tests whether an inner class template with a particular name and signature exists.
@@ -318,6 +400,16 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpSeq) \
+namespace tti \
+ { \
+ TTI_DETAIL_MTFC_HAS_MEMBER_WITH_TEMPLATE_SFINAE \
+ ( \
+ ( BOOST_PP_ADD(BOOST_PP_SEQ_SIZE(tpSeq),4), ( trait, name, 1, false, BOOST_PP_SEQ_ENUM(tpSeq) ) ) \
+ ) \
+ } \
+/**/
+
 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
 #else // !!defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
 
@@ -341,7 +433,20 @@
     
 */
 #define TTI_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpSeq) \
-TTI_DETAIL_SAME(trait,name) \
+namespace tti \
+ { \
+ TTI_DETAIL_SAME(trait,name) \
+ } \
+/**/
+
+#define TTI_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpSeq) \
+namespace tti \
+ { \
+ struct trait \
+ { \
+ TTI_DETAIL_SAME(apply,name) \
+ }; \
+ } \
 /**/
 
 #endif // !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
@@ -373,288 +478,15 @@
   ) \
 /**/
 
-#if defined(BOOST_MSVC)
-
-#if defined(BOOST_NO_NULLPTR)
-
-/// Expands to a metafunction which tests whether a member data or member function with a particular name and type exists.
-/**
-
- trait = the name of the metafunction within the tti namespace.<br />
- name = the name of the inner member.
-
- returns = a metafunction called "tti::trait" where 'trait' is the macro parameter.<br />
-
- The metafunction types and return:
-
- T = the type, in the form of a member data pointer or member function pointer,
- in which to look for our 'name'.<br />
- returns = 'value' is true if the 'name' exists, with the appropriate type,
- otherwise 'value' is false.
-
-*/
-#define TTI_TRAIT_HAS_MEMBER(trait,name) \
-namespace tti \
- { \
- template<class T> \
- struct trait \
- { \
- template<class> \
- struct class_of; \
- \
- template<class R,class C> \
- struct class_of<R C::*> \
- { \
- typedef C type; \
- }; \
- \
- template<class> \
- struct return_of; \
- \
- template<class R,class C> \
- struct return_of<R C::*> \
- { \
- typedef R type; \
- }; \
- \
- template<bool,typename U> \
- struct menable_if; \
- \
- template<typename U> \
- struct menable_if<true,U> \
- { \
- typedef U type; \
- }; \
- \
- template<typename U,typename V> \
- static ::boost::type_traits::yes_type check2(V U::*); \
- \
- template<typename U,typename V> \
- static ::boost::type_traits::no_type check2(U); \
- \
- template<class F> \
- struct class_type \
- { \
- typedef typename \
- boost::remove_const \
- < \
- typename \
- boost::mpl::at \
- < \
- typename \
- boost::function_types::parameter_types \
- < \
- F, \
- boost::mpl::quote1 \
- < \
- boost::mpl::identity \
- > \
- > \
- ::type, \
- boost::mpl::int_<0> \
- >::type \
- >::type \
- type; \
- }; \
- \
- template<T> \
- struct helper; \
- \
- template<typename U,typename V> \
- static typename \
- menable_if \
- < \
- sizeof(check2<U,V>(&U::name))==sizeof(::boost::type_traits::yes_type), \
- ::boost::type_traits::yes_type \
- > \
- ::type \
- has_matching_member(int); \
- \
- template<typename U,typename V> \
- static ::boost::type_traits::no_type has_matching_member(...); \
- \
- template<class U> \
- static ::boost::type_traits::yes_type check(helper<&U::name> *); \
- \
- template<class U> \
- static ::boost::type_traits::no_type check(...); \
- \
- template<class F> \
- struct ttc_md \
- { \
- typedef boost::mpl::bool_<sizeof(has_matching_member<typename class_of<F>::type,typename return_of<F>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
- }; \
- \
- template<class F> \
- struct ttc_mf \
- { \
- typedef boost::mpl::bool_<sizeof(check<typename class_type<F>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
- }; \
- \
- template<class F> \
- struct type_to_check \
- { \
- typedef typename \
- boost::mpl::eval_if \
- < \
- boost::function_types::is_member_object_pointer<F>, \
- ttc_md<F>, \
- ttc_mf<F> \
- >::type \
- type; \
- }; \
- \
- typedef typename type_to_check<T>::type type; \
- \
- BOOST_STATIC_CONSTANT(bool,value=type::value); \
- \
- }; \
- } \
-/**/
-
-#else // !defined(BOOST_NO_NULLPTR)
-
-/// Expands to a metafunction which tests whether a member data or member function with a particular name and type exists.
-/**
-
- trait = the name of the metafunction within the tti namespace.<br />
- name = the name of the inner member.
-
- returns = a metafunction called "tti::trait" where 'trait' is the macro parameter.<br />
-
- The metafunction types and return:
-
- T = the type, in the form of a member data pointer or member function pointer,
- in which to look for our 'name'.<br />
- returns = 'value' is true if the 'name' exists, with the appropriate type,
- otherwise 'value' is false.
-
-*/
-#define TTI_TRAIT_HAS_MEMBER(trait,name) \
-namespace tti \
- { \
- template<class T> \
- struct trait \
- { \
- template<class> \
- struct class_of; \
- \
- template<class R,class C> \
- struct class_of<R C::*> \
- { \
- typedef C type; \
- }; \
- \
- template<class> \
- struct return_of; \
- \
- template<class R,class C> \
- struct return_of<R C::*> \
- { \
- typedef R type; \
- }; \
- \
- template<bool,typename U> \
- struct menable_if; \
- \
- template<typename U> \
- struct menable_if<true,U> \
- { \
- typedef U type; \
- }; \
- \
- template<typename U,typename V> \
- static ::boost::type_traits::yes_type check2(V U::*); \
- \
- template<typename U,typename V> \
- static ::boost::type_traits::no_type check2(U); \
- \
- template<class F> \
- struct class_type \
- { \
- typedef typename \
- boost::remove_const \
- < \
- typename \
- boost::mpl::at \
- < \
- typename \
- boost::function_types::parameter_types \
- < \
- F, \
- boost::mpl::quote1 \
- < \
- boost::mpl::identity \
- > \
- > \
- ::type, \
- boost::mpl::int_<0> \
- >::type \
- >::type \
- type; \
- }; \
- \
- template<T> \
- struct helper; \
- \
- template<typename U,typename V> \
- static typename \
- menable_if \
- < \
- sizeof(check2<U,V>(&U::name))==sizeof(::boost::type_traits::yes_type), \
- ::boost::type_traits::yes_type \
- > \
- ::type \
- has_matching_member(int); \
- \
- template<typename U,typename V> \
- static ::boost::type_traits::no_type has_matching_member(...); \
- \
- template<class U> \
- static ::boost::type_traits::yes_type check(helper<&U::name> *); \
- \
- template<class U> \
- static ::boost::type_traits::no_type check(...); \
- \
- template<class F> \
- struct ttc_md \
- { \
- typedef boost::mpl::bool_<sizeof(has_matching_member<typename class_of<F>::type,typename return_of<F>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
- }; \
- \
- template<class F> \
- struct ttc_mf \
- { \
- typedef boost::mpl::bool_<sizeof(check<typename class_type<F>::type>(nullptr))==sizeof(::boost::type_traits::yes_type)> type; \
- }; \
- \
- template<class F> \
- struct type_to_check \
- { \
- typedef typename \
- boost::mpl::eval_if \
- < \
- boost::function_types::is_member_object_pointer<F>, \
- ttc_md<F>, \
- ttc_mf<F> \
- >::type \
- type; \
- }; \
- \
- typedef typename type_to_check<T>::type type; \
- \
- BOOST_STATIC_CONSTANT(bool,value=type::value); \
- \
- }; \
- } \
+#define TTI_MTFC_HAS_TEMPLATE_CHECK_PARAMS(name,tpSeq) \
+ TTI_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS \
+ ( \
+ BOOST_PP_CAT(mtfc_has_template_check_params_,name), \
+ name, \
+ tpSeq \
+ ) \
 /**/
 
-#endif // defined(BOOST_NO_NULLPTR)
-
-#else // !defined(BOOST_MSVC)
-
-#if defined(BOOST_NO_NULLPTR)
-
 /// Expands to a metafunction which tests whether a member data or member function with a particular name and type exists.
 /**
 
@@ -674,147 +506,21 @@
 #define TTI_TRAIT_HAS_MEMBER(trait,name) \
 namespace tti \
   { \
- template<class T> \
- struct trait \
+ namespace detail \
     { \
- template<class> \
- struct class_of; \
- \
- template<class R,class C> \
- struct class_of<R C::*> \
- { \
- typedef C type; \
- }; \
- \
- template<class F> \
- struct class_type \
- { \
- typedef typename \
- boost::mpl::eval_if \
- < \
- boost::function_types::is_member_object_pointer<F>, \
- class_of<F>, \
- boost::remove_const \
- < \
- typename \
- boost::mpl::at \
- < \
- typename \
- boost::function_types::parameter_types \
- < \
- F, \
- boost::mpl::quote1 \
- < \
- boost::mpl::identity \
- > \
- > \
- ::type, \
- boost::mpl::int_<0> \
- >::type \
- > \
- >::type \
- type; \
- }; \
- \
- template<T> \
- struct helper; \
- \
- template<class U> \
- static ::boost::type_traits::yes_type check(helper<&U::name> *); \
- \
- template<class U> \
- static ::boost::type_traits::no_type check(...); \
- \
- BOOST_STATIC_CONSTANT(bool,value=sizeof(check<typename class_type<T>::type>(0))==sizeof(::boost::type_traits::yes_type)); \
- \
- typedef boost::mpl::bool_<value> type; \
- }; \
- } \
-/**/
-
-#else // !defined(BOOST_NO_NULLPTR)
-
-/// Expands to a metafunction which tests whether a member data or member function with a particular name and type exists.
-/**
-
- trait = the name of the metafunction within the tti namespace.<br />
- name = the name of the inner member.
-
- returns = a metafunction called "tti::trait" where 'trait' is the macro parameter.
-
- The metafunction types and return:
-
- T = the type, in the form of a member data pointer or member function pointer,
- in which to look for our 'name'.<br />
- returns = 'value' is true if the 'name' exists, with the appropriate type,
- otherwise 'value' is false.
-
-*/
-#define TTI_TRAIT_HAS_MEMBER(trait,name) \
-namespace tti \
- { \
+ TTI_DETAIL_TRAIT_HAS_MEMBER(trait,name) \
+ } \
   template<class T> \
   struct trait \
     { \
- template<class> \
- struct class_of; \
- \
- template<class R,class C> \
- struct class_of<R C::*> \
- { \
- typedef C type; \
- }; \
- \
- template<class F> \
- struct class_type \
- { \
- typedef typename \
- boost::mpl::eval_if \
- < \
- boost::function_types::is_member_object_pointer<F>, \
- class_of<F>, \
- boost::remove_const \
- < \
- typename \
- boost::mpl::at \
- < \
- typename \
- boost::function_types::parameter_types \
- < \
- F, \
- boost::mpl::quote1 \
- < \
- boost::mpl::identity \
- > \
- > \
- ::type, \
- boost::mpl::int_<0> \
- >::type \
- > \
- >::type \
- type; \
- }; \
+ typedef typename detail::trait<T>::type type; \
     \
- template<T> \
- struct helper; \
- \
- template<class U> \
- static ::boost::type_traits::yes_type check(helper<&U::name> *); \
- \
- template<class U> \
- static ::boost::type_traits::no_type check(...); \
- \
- BOOST_STATIC_CONSTANT(bool,value=sizeof(check<typename class_type<T>::type>(nullptr))==sizeof(::boost::type_traits::yes_type)); \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
     \
- typedef boost::mpl::bool_<value> type; \
     }; \
   } \
 /**/
 
-#endif // defined(BOOST_NO_NULLPTR)
-
-#endif // defined(BOOST_MSVC)
-
 /// Expands to a metafunction which tests whether a member data or member function with a particular name and type exists.
 /**
 
@@ -873,6 +579,26 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_MEMBER_FUNCTION(trait,name) \
+namespace tti \
+ { \
+ namespace detail \
+ { \
+ TTI_DETAIL_TRAIT_HAS_MEMBER_FUNCTION(trait,name) \
+ } \
+ struct trait \
+ { \
+ template<class T,class R,class FS = boost::mpl::vector<>,class TAG = boost::function_types::null_tag> \
+ struct apply \
+ { \
+ typedef detail::trait<typename detail::ptmf_seq<T,R,FS,TAG>::type,typename boost::remove_const<T>::type> type; \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
+ }; \
+ }; \
+ } \
+/**/
+
 /// Expands to a metafunction which tests whether a member function with a particular name and signature exists.
 /**
 
@@ -898,6 +624,14 @@
   ) \
 /**/
 
+#define TTI_MTFC_HAS_MEMBER_FUNCTION(name) \
+ TTI_MTFC_TRAIT_HAS_MEMBER_FUNCTION \
+ ( \
+ BOOST_PP_CAT(mtfc_has_member_function_,name), \
+ name \
+ ) \
+/**/
+
 /// Expands to a metafunction which tests whether a member data with a particular name and type exists.
 /**
 
@@ -931,6 +665,26 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_MEMBER_DATA(trait,name) \
+namespace tti \
+ { \
+ namespace detail \
+ { \
+ TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \
+ } \
+ struct trait \
+ { \
+ template<class T,class R> \
+ struct apply \
+ { \
+ typedef detail::trait<typename detail::ptmd<T,R>::type,typename boost::remove_const<T>::type> type; \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
+ }; \
+ }; \
+ } \
+/**/
+
 /// Expands to a metafunction which tests whether a member data with a particular name and type exists.
 /**
 
@@ -954,6 +708,14 @@
   ) \
 /**/
 
+#define TTI_MTFC_HAS_MEMBER_DATA(name) \
+ TTI_MTFC_TRAIT_HAS_MEMBER_DATA \
+ ( \
+ BOOST_PP_CAT(mtfc_has_member_data_,name), \
+ name \
+ ) \
+/**/
+
 #if defined(BOOST_NO_NULLPTR)
 
 /// Expands to a metafunction which tests whether a static member data or a static member function with a particular name and type exists.
@@ -997,6 +759,31 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_STATIC_MEMBER(trait,name) \
+namespace tti \
+ { \
+ struct trait \
+ { \
+ template<class T,class Type> \
+ struct apply \
+ { \
+ template<Type *> \
+ struct helper; \
+ \
+ template<class U> \
+ static ::boost::type_traits::yes_type check(helper<&U::name> *); \
+ \
+ template<class U> \
+ static ::boost::type_traits::no_type check(...); \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=sizeof(check<T>(0))==sizeof(::boost::type_traits::yes_type)); \
+ \
+ typedef boost::mpl::bool_<value> type; \
+ }; \
+ }; \
+ } \
+/**/
+
 #else // !defined(BOOST_NO_NULLPTR)
 
 /// Expands to a metafunction which tests whether a static member data or a static member function with a particular name and type exists.
@@ -1040,6 +827,31 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_STATIC_MEMBER(trait,name) \
+namespace tti \
+ { \
+ struct trait \
+ { \
+ template<class T,class Type> \
+ struct apply \
+ { \
+ template<Type *> \
+ struct helper; \
+ \
+ template<class U> \
+ static ::boost::type_traits::yes_type check(helper<&U::name> *); \
+ \
+ template<class U> \
+ static ::boost::type_traits::no_type check(...); \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=sizeof(check<T>(nullptr))==sizeof(::boost::type_traits::yes_type)); \
+ \
+ typedef boost::mpl::bool_<value> type; \
+ }; \
+ }; \
+ } \
+/**/
+
 #endif // defined(BOOST_NO_NULLPTR)
   
 /// Expands to a metafunction which tests whether a static member data or a static member function with a particular name and type exists.
@@ -1068,6 +880,14 @@
   ) \
 /**/
 
+#define TTI_MTFC_HAS_STATIC_MEMBER(name) \
+ TTI_MTFC_TRAIT_HAS_STATIC_MEMBER \
+ ( \
+ BOOST_PP_CAT(mtfc_has_static_member_,name), \
+ name \
+ ) \
+/**/
+
 /// Expands to a metafunction which tests whether a static member function with a particular name and signature exists.
 /**
 
@@ -1103,6 +923,26 @@
   } \
 /**/
 
+#define TTI_MTFC_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
+namespace tti \
+ { \
+ namespace detail \
+ { \
+ TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
+ } \
+ struct trait \
+ { \
+ template<class T,class R,class FS = boost::mpl::vector<>,class TAG = boost::function_types::null_tag> \
+ struct apply \
+ { \
+ typedef detail::trait<T,typename detail::tfunction_seq<R,FS,TAG>::type> type; \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
+ }; \
+ }; \
+ } \
+/**/
+
 /// Expands to a metafunction which tests whether a static member function with a particular name and signature exists.
 /**
 
@@ -1128,6 +968,14 @@
   ) \
 /**/
 
+#define TTI_MTFC_HAS_STATIC_MEMBER_FUNCTION(name) \
+ TTI_MTFC_TRAIT_HAS_STATIC_MEMBER_FUNCTION \
+ ( \
+ BOOST_PP_CAT(mtfc_has_static_member_function_,name), \
+ name \
+ ) \
+/**/
+
 namespace tti
   {
   

Modified: sandbox/tti/boost/tti/TTIntrospectionVM.hpp
==============================================================================
--- sandbox/tti/boost/tti/TTIntrospectionVM.hpp (original)
+++ sandbox/tti/boost/tti/TTIntrospectionVM.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -50,6 +50,19 @@
   } \
 /**/
 
+#define TTI_VM_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
+namespace tti \
+ { \
+ struct trait \
+ { \
+ TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE \
+ ( \
+ ( BOOST_PP_ADD(VMD_DATA_SIZE(__VA_ARGS__),4), ( apply, name, 1, false, __VA_ARGS__ ) ) \
+ ) \
+ }; \
+ } \
+/**/
+
 #else // !!BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
 
 /// Expands to a metafunction which tests whether an inner class template with a particular name and signature exists.
@@ -79,6 +92,16 @@
   } \
 /**/
 
+#define TTI_VM_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
+namespace tti \
+ { \
+ TTI_DETAIL_MTFC_HAS_MEMBER_WITH_TEMPLATE_SFINAE \
+ ( \
+ ( BOOST_PP_ADD(VMD_DATA_SIZE(__VA_ARGS__),4), ( trait, name, 1, false, __VA_ARGS__ ) ) \
+ ) \
+ } \
+/**/
+
 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
 #else // !!defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
 
@@ -100,7 +123,20 @@
     
 */
 #define TTI_VM_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
-TTI_DETAIL_SAME(trait,name) \
+namespace tti \
+ { \
+ TTI_DETAIL_SAME(trait,name) \
+ } \
+/**/
+
+#define TTI_VM_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
+namespace tti \
+ { \
+ struct trait \
+ { \
+ TTI_DETAIL_SAME(apply,name) \
+ }; \
+ } \
 /**/
 
 #endif // !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
@@ -130,5 +166,14 @@
   ) \
 /**/
 
+#define TTI_VM_MTFC_HAS_TEMPLATE_CHECK_PARAMS(name,...) \
+ TTI_VM_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS \
+ ( \
+ BOOST_PP_CAT(mtfc_has_template_check_params_,name), \
+ name, \
+ __VA_ARGS__ \
+ ) \
+/**/
+
 #endif // !defined(BOOST_NO_VARIADIC_MACROS)
 #endif // TT_INTROSPECTION_VM_HPP

Modified: sandbox/tti/boost/tti/detail/TTIntrospectionDetail.hpp
==============================================================================
--- sandbox/tti/boost/tti/detail/TTIntrospectionDetail.hpp (original)
+++ sandbox/tti/boost/tti/detail/TTIntrospectionDetail.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -2,10 +2,15 @@
 #define TT_INTROSPECTION_DETAIL_HPP
 
 #include <boost/config.hpp>
+#include <boost/mpl/at.hpp>
 #include <boost/mpl/bool.hpp>
+#include <boost/mpl/eval_if.hpp>
 #include <boost/mpl/has_xxx.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/int.hpp>
 #include <boost/mpl/not.hpp>
 #include <boost/mpl/push_front.hpp>
+#include <boost/mpl/quote.hpp>
 #include <boost/mpl/remove.hpp>
 #include <boost/mpl/transform.hpp>
 #include <boost/mpl/vector.hpp>
@@ -20,9 +25,13 @@
 #include <boost/preprocessor/repetition/enum.hpp>
 #include <boost/preprocessor/repetition/enum_shifted.hpp>
 #include <boost/preprocessor/repetition/enum_shifted_params.hpp>
-#include <boost/function_types/member_function_pointer.hpp>
 #include <boost/function_types/function_type.hpp>
+#include <boost/function_types/is_member_object_pointer.hpp>
+#include <boost/function_types/member_function_pointer.hpp>
+#include <boost/function_types/parameter_types.hpp>
 #include <boost/type_traits/is_same.hpp>
+#include <boost/type_traits/remove_const.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
 
 #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
 
@@ -50,6 +59,29 @@
      }; \
 /**/
 
+#define TTI_DETAIL_MTFC_HAS_MEMBER_IMPLEMENTATION(args,introspect_macro) \
+ struct BOOST_PP_ARRAY_ELEM(0, args) \
+ { \
+ template \
+ < \
+ typename T, \
+ typename fallback_ \
+ = boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \
+ > \
+ class apply \
+ { \
+ introspect_macro(args) \
+ public: \
+ static const bool value \
+ = BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< T >::value; \
+ typedef typename BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
+ < \
+ T \
+ >::type type; \
+ }; \
+ }; \
+/**/
+
 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
 
 #define TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE(z,n,args) \
@@ -171,24 +203,33 @@
     ) \
 /**/
 
+#define TTI_DETAIL_MTFC_HAS_MEMBER_WITH_TEMPLATE_SFINAE(args) \
+ TTI_DETAIL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE \
+ ( \
+ args \
+ ) \
+ TTI_DETAIL_MTFC_HAS_MEMBER_IMPLEMENTATION \
+ ( \
+ args, \
+ TTI_DETAIL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE \
+ ) \
+/**/
+
 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
 #else // !!defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
 
 #define TTI_DETAIL_SAME(trait,name) \
-namespace tti \
- { \
   BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF \
     ( \
     trait, \
     name, \
     false \
     ) \
- } \
 /**/
 
 #endif // !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
 
-#define TTI_DETAIL_TRAIT_HAS_TYPE(trait,name) \
+#define TTI_DETAIL_TRAIT_HAS_TYPE_MEMBER_TYPE(trait,name) \
 namespace mpl \
   { \
   BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, false) \
@@ -213,6 +254,37 @@
   } \
 /**/
 
+#define TTI_DETAIL_TRAIT_HAS_TYPE(trait,name) \
+namespace mpl \
+ { \
+ BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(trait, name, false) \
+ } \
+template<class T,class U,class B> \
+struct trait \
+ { \
+ typedef typename \
+ boost::mpl::eval_if \
+ < \
+ boost::is_same<typename T::name,U>, \
+ boost::mpl::true_, \
+ boost::mpl::false_ \
+ >::type \
+ type; \
+ }; \
+\
+template<class T,class U> \
+struct trait<T,U,boost::mpl::false_::type> \
+ { \
+ typedef boost::mpl::false_::type type; \
+ }; \
+\
+template<class T> \
+struct trait<T,tti::detail::notype,boost::mpl::true_::type> \
+ { \
+ typedef boost::mpl::true_::type type; \
+ }; \
+/**/
+
 #define TTI_DETAIL_PP_REPEAT_CLASS(z,n,data) \
   BOOST_PP_COMMA_IF(n) data \
 /**/
@@ -373,6 +445,372 @@
 
 #endif // defined(BOOST_NO_NULLPTR)
 
+#if defined(BOOST_MSVC)
+
+#if defined(BOOST_NO_NULLPTR)
+
+#define TTI_DETAIL_TRAIT_HAS_MEMBER(trait,name) \
+ template<class T> \
+ struct trait \
+ { \
+ template<class> \
+ struct class_of; \
+ \
+ template<class R,class C> \
+ struct class_of<R C::*> \
+ { \
+ typedef C type; \
+ }; \
+ \
+ template<class> \
+ struct return_of; \
+ \
+ template<class R,class C> \
+ struct return_of<R C::*> \
+ { \
+ typedef R type; \
+ }; \
+ \
+ template<bool,typename U> \
+ struct menable_if; \
+ \
+ template<typename U> \
+ struct menable_if<true,U> \
+ { \
+ typedef U type; \
+ }; \
+ \
+ template<typename U,typename V> \
+ static ::boost::type_traits::yes_type check2(V U::*); \
+ \
+ template<typename U,typename V> \
+ static ::boost::type_traits::no_type check2(U); \
+ \
+ template<class F> \
+ struct class_type \
+ { \
+ typedef typename \
+ boost::remove_const \
+ < \
+ typename \
+ boost::mpl::at \
+ < \
+ typename \
+ boost::function_types::parameter_types \
+ < \
+ F, \
+ boost::mpl::quote1 \
+ < \
+ boost::mpl::identity \
+ > \
+ > \
+ ::type, \
+ boost::mpl::int_<0> \
+ >::type \
+ >::type \
+ type; \
+ }; \
+ \
+ template<T> \
+ struct helper; \
+ \
+ template<typename U,typename V> \
+ static typename \
+ menable_if \
+ < \
+ sizeof(check2<U,V>(&U::name))==sizeof(::boost::type_traits::yes_type), \
+ ::boost::type_traits::yes_type \
+ > \
+ ::type \
+ has_matching_member(int); \
+ \
+ template<typename U,typename V> \
+ static ::boost::type_traits::no_type has_matching_member(...); \
+ \
+ template<class U> \
+ static ::boost::type_traits::yes_type check(helper<&U::name> *); \
+ \
+ template<class U> \
+ static ::boost::type_traits::no_type check(...); \
+ \
+ template<class F> \
+ struct ttc_md \
+ { \
+ typedef boost::mpl::bool_<sizeof(has_matching_member<typename class_of<F>::type,typename return_of<F>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
+ }; \
+ \
+ template<class F> \
+ struct ttc_mf \
+ { \
+ typedef boost::mpl::bool_<sizeof(check<typename class_type<F>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
+ }; \
+ \
+ template<class F> \
+ struct type_to_check \
+ { \
+ typedef typename \
+ boost::mpl::eval_if \
+ < \
+ boost::function_types::is_member_object_pointer<F>, \
+ ttc_md<F>, \
+ ttc_mf<F> \
+ >::type \
+ type; \
+ }; \
+ \
+ typedef typename type_to_check<T>::type type; \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
+ \
+ }; \
+/**/
+
+#else // !defined(BOOST_NO_NULLPTR)
+
+#define TTI_DETAIL_TRAIT_HAS_MEMBER(trait,name) \
+ template<class T> \
+ struct trait \
+ { \
+ template<class> \
+ struct class_of; \
+ \
+ template<class R,class C> \
+ struct class_of<R C::*> \
+ { \
+ typedef C type; \
+ }; \
+ \
+ template<class> \
+ struct return_of; \
+ \
+ template<class R,class C> \
+ struct return_of<R C::*> \
+ { \
+ typedef R type; \
+ }; \
+ \
+ template<bool,typename U> \
+ struct menable_if; \
+ \
+ template<typename U> \
+ struct menable_if<true,U> \
+ { \
+ typedef U type; \
+ }; \
+ \
+ template<typename U,typename V> \
+ static ::boost::type_traits::yes_type check2(V U::*); \
+ \
+ template<typename U,typename V> \
+ static ::boost::type_traits::no_type check2(U); \
+ \
+ template<class F> \
+ struct class_type \
+ { \
+ typedef typename \
+ boost::remove_const \
+ < \
+ typename \
+ boost::mpl::at \
+ < \
+ typename \
+ boost::function_types::parameter_types \
+ < \
+ F, \
+ boost::mpl::quote1 \
+ < \
+ boost::mpl::identity \
+ > \
+ > \
+ ::type, \
+ boost::mpl::int_<0> \
+ >::type \
+ >::type \
+ type; \
+ }; \
+ \
+ template<T> \
+ struct helper; \
+ \
+ template<typename U,typename V> \
+ static typename \
+ menable_if \
+ < \
+ sizeof(check2<U,V>(&U::name))==sizeof(::boost::type_traits::yes_type), \
+ ::boost::type_traits::yes_type \
+ > \
+ ::type \
+ has_matching_member(int); \
+ \
+ template<typename U,typename V> \
+ static ::boost::type_traits::no_type has_matching_member(...); \
+ \
+ template<class U> \
+ static ::boost::type_traits::yes_type check(helper<&U::name> *); \
+ \
+ template<class U> \
+ static ::boost::type_traits::no_type check(...); \
+ \
+ template<class F> \
+ struct ttc_md \
+ { \
+ typedef boost::mpl::bool_<sizeof(has_matching_member<typename class_of<F>::type,typename return_of<F>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
+ }; \
+ \
+ template<class F> \
+ struct ttc_mf \
+ { \
+ typedef boost::mpl::bool_<sizeof(check<typename class_type<F>::type>(nullptr))==sizeof(::boost::type_traits::yes_type)> type; \
+ }; \
+ \
+ template<class F> \
+ struct type_to_check \
+ { \
+ typedef typename \
+ boost::mpl::eval_if \
+ < \
+ boost::function_types::is_member_object_pointer<F>, \
+ ttc_md<F>, \
+ ttc_mf<F> \
+ >::type \
+ type; \
+ }; \
+ \
+ typedef typename type_to_check<T>::type type; \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=type::value); \
+ \
+ }; \
+/**/
+
+#endif // defined(BOOST_NO_NULLPTR)
+
+#else // !defined(BOOST_MSVC)
+
+#if defined(BOOST_NO_NULLPTR)
+
+#define TTI_DETAIL_TRAIT_HAS_MEMBER(trait,name) \
+ template<class T> \
+ struct trait \
+ { \
+ template<class> \
+ struct class_of; \
+ \
+ template<class R,class C> \
+ struct class_of<R C::*> \
+ { \
+ typedef C type; \
+ }; \
+ \
+ template<class F> \
+ struct class_type \
+ { \
+ typedef typename \
+ boost::mpl::eval_if \
+ < \
+ boost::function_types::is_member_object_pointer<F>, \
+ class_of<F>, \
+ boost::remove_const \
+ < \
+ typename \
+ boost::mpl::at \
+ < \
+ typename \
+ boost::function_types::parameter_types \
+ < \
+ F, \
+ boost::mpl::quote1 \
+ < \
+ boost::mpl::identity \
+ > \
+ > \
+ ::type, \
+ boost::mpl::int_<0> \
+ >::type \
+ > \
+ >::type \
+ type; \
+ }; \
+ \
+ template<T> \
+ struct helper; \
+ \
+ template<class U> \
+ static ::boost::type_traits::yes_type check(helper<&U::name> *); \
+ \
+ template<class U> \
+ static ::boost::type_traits::no_type check(...); \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=sizeof(check<typename class_type<T>::type>(0))==sizeof(::boost::type_traits::yes_type)); \
+ \
+ typedef boost::mpl::bool_<value> type; \
+ }; \
+/**/
+
+#else // !defined(BOOST_NO_NULLPTR)
+
+#define TTI_DETAIL_TRAIT_HAS_MEMBER(trait,name) \
+ template<class T> \
+ struct trait \
+ { \
+ template<class> \
+ struct class_of; \
+ \
+ template<class R,class C> \
+ struct class_of<R C::*> \
+ { \
+ typedef C type; \
+ }; \
+ \
+ template<class F> \
+ struct class_type \
+ { \
+ typedef typename \
+ boost::mpl::eval_if \
+ < \
+ boost::function_types::is_member_object_pointer<F>, \
+ class_of<F>, \
+ boost::remove_const \
+ < \
+ typename \
+ boost::mpl::at \
+ < \
+ typename \
+ boost::function_types::parameter_types \
+ < \
+ F, \
+ boost::mpl::quote1 \
+ < \
+ boost::mpl::identity \
+ > \
+ > \
+ ::type, \
+ boost::mpl::int_<0> \
+ >::type \
+ > \
+ >::type \
+ type; \
+ }; \
+ \
+ template<T> \
+ struct helper; \
+ \
+ template<class U> \
+ static ::boost::type_traits::yes_type check(helper<&U::name> *); \
+ \
+ template<class U> \
+ static ::boost::type_traits::no_type check(...); \
+ \
+ BOOST_STATIC_CONSTANT(bool,value=sizeof(check<typename class_type<T>::type>(nullptr))==sizeof(::boost::type_traits::yes_type)); \
+ \
+ typedef boost::mpl::bool_<value> type; \
+ }; \
+/**/
+
+#endif // defined(BOOST_NO_NULLPTR)
+
+#endif // defined(BOOST_MSVC)
+
 namespace tti
   {
   namespace detail

Modified: sandbox/tti/libs/tti/doc/TTIAcknowledgements.qbk
==============================================================================
--- sandbox/tti/libs/tti/doc/TTIAcknowledgements.qbk (original)
+++ sandbox/tti/libs/tti/doc/TTIAcknowledgements.qbk 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -13,9 +13,9 @@
 
 Two of the introspection templates are taken from the MPL and
 lifted into my library under a different name for the sake
-of orthogonality, so I would like to thank Aleksey Gurtovoy and
+of completeness, so I would like to thank Aleksey Gurtovoy and
 David Abrahams for that library, and Daniel Walker for work on
-those MPL introspection macros.
+those MPL introspection macros.
 
 Finally thanks to Anthony Williams for supplying a workaround
 for a Visual C++ bug which is needed for introspecting member

Modified: sandbox/tti/libs/tti/test/TestMFHasMemberData.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasMemberData.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasMemberData.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -82,6 +82,82 @@
               ::value
             ));
   
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_AnInt,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_AnInt,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<long>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_aMember,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<bool>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::MFCMember,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<bool>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_IntBT,
+ boost::mpl::identity<AType>,
+ tti::member_type_BType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::MFNestedData,
+ boost::mpl::identity<AType>,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::MFAOther,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_ONestStr,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AStructType<AType>
+ >
+ ::value
+ ));
+
   return boost::report_errors();
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasMemberData.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasMemberData.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasMemberData.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -12,8 +12,20 @@
 TTI_TRAIT_HAS_MEMBER_DATA(NestedData,NestedCT)
 TTI_TRAIT_HAS_MEMBER_DATA(AOther,OtherAT)
 TTI_HAS_MEMBER_DATA(ONestStr)
+
+TTI_MTFC_HAS_MEMBER_DATA(AnInt)
+TTI_MTFC_HAS_MEMBER_DATA(aMember)
+TTI_MTFC_TRAIT_HAS_MEMBER_DATA(MFCMember,cMem)
+TTI_MTFC_HAS_MEMBER_DATA(someDataMember)
+TTI_MTFC_HAS_MEMBER_DATA(IntBT)
+TTI_MTFC_TRAIT_HAS_MEMBER_DATA(MFNestedData,NestedCT)
+TTI_MTFC_TRAIT_HAS_MEMBER_DATA(MFAOther,OtherAT)
+TTI_MTFC_HAS_MEMBER_DATA(ONestStr)
+
 TTI_MEMBER_TYPE(BType)
 TTI_MEMBER_TYPE(CType)
 TTI_MEMBER_TYPE(AStructType)
 
+TTI_MTFC_MEMBER_TYPE(CType)
+
 #endif // TEST_MF_HAS_MEMBER_DATA_HPP

Modified: sandbox/tti/libs/tti/test/TestMFHasMemberDataCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasMemberDataCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasMemberDataCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -39,40 +39,108 @@
                   ));
   
   BOOST_MPL_ASSERT((tti::mf_has_member_data
- <
- tti::has_member_data_IntBT<_,_>,
- boost::mpl::identity<AType>,
- tti::member_type_BType<AType>
- >
- ));
-
- BOOST_MPL_ASSERT((tti::mf_has_member_data
- <
- tti::NestedData<_,_>,
- boost::mpl::identity<AType>,
- tti::mf_member_type
- <
- tti::member_type_CType<_>,
- tti::member_type_BType<AType>
- >
- >
- ));
-
- BOOST_MPL_ASSERT((tti::mf_has_member_data
- <
- tti::AOther<_,_>,
- boost::mpl::identity<AnotherType>,
- boost::mpl::identity<AType>
- >
- ));
-
- BOOST_MPL_ASSERT((tti::mf_has_member_data
- <
- tti::has_member_data_ONestStr<_,_>,
- boost::mpl::identity<AnotherType>,
- tti::member_type_AStructType<AType>
- >
- ));
+ <
+ tti::has_member_data_IntBT<_,_>,
+ boost::mpl::identity<AType>,
+ tti::member_type_BType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::NestedData<_,_>,
+ boost::mpl::identity<AType>,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::member_type_BType<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::AOther<_,_>,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::has_member_data_ONestStr<_,_>,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AStructType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_AnInt,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_AnInt,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<long>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_aMember,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<bool>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::MFCMember,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<bool>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_IntBT,
+ boost::mpl::identity<AType>,
+ tti::member_type_BType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::MFNestedData,
+ boost::mpl::identity<AType>,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::MFAOther,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_data
+ <
+ tti::mtfc_has_member_data_ONestStr,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AStructType<AType>
+ >
+ ));
   
   return 0;
 

Modified: sandbox/tti/libs/tti/test/TestMFHasMemberFunction.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasMemberFunction.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasMemberFunction.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -68,6 +68,69 @@
>
               ::value
             ));
+
+ BOOST_TEST((tti::mf_has_member_function
+ <
+ tti::mtfc_has_member_function_VoidFunction,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<void>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_function
+ <
+ tti::MFFunctionReturningInt,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_function
+ <
+ tti::MFFunctionReturningInt,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<double>,
+ boost::mpl::vector<boost::mpl::identity<int> >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_function
+ <
+ tti::mtfc_has_member_function_aFunction,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<AType>,
+ boost::mpl::vector<boost::mpl::identity<int> >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_function
+ <
+ tti::MFAnotherIntFunction,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<int>,
+ boost::mpl::vector<boost::mpl::identity<AType> >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_member_function
+ <
+ tti::mtfc_has_member_function_sFunction,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AnIntType<AType>,
+ boost::mpl::vector
+ <
+ boost::mpl::identity<int>,
+ boost::mpl::identity<long>,
+ boost::mpl::identity<double>
+ >
+ >
+ ::value
+ ));
   
   return boost::report_errors();
 

Modified: sandbox/tti/libs/tti/test/TestMFHasMemberFunction.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasMemberFunction.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasMemberFunction.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -11,6 +11,13 @@
 TTI_HAS_MEMBER_FUNCTION(sFunction)
 TTI_HAS_MEMBER_FUNCTION(someFunctionMember)
 
+TTI_MTFC_HAS_MEMBER_FUNCTION(VoidFunction)
+TTI_MTFC_TRAIT_HAS_MEMBER_FUNCTION(MFFunctionReturningInt,IntFunction)
+TTI_MTFC_HAS_MEMBER_FUNCTION(aFunction)
+TTI_MTFC_TRAIT_HAS_MEMBER_FUNCTION(MFAnotherIntFunction,anotherFunction)
+TTI_MTFC_HAS_MEMBER_FUNCTION(sFunction)
+TTI_MTFC_HAS_MEMBER_FUNCTION(someFunctionMember)
+
 TTI_MEMBER_TYPE(AnIntType)
 
 #endif // TEST_MF_HAS_MEMBER_FUNCTION_HPP

Modified: sandbox/tti/libs/tti/test/TestMFHasMemberFunctionCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasMemberFunctionCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasMemberFunctionCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -100,6 +100,63 @@
>
                   ));
             
+ BOOST_MPL_ASSERT((tti::mf_has_member_function
+ <
+ tti::mtfc_has_member_function_VoidFunction,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<void>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_function
+ <
+ tti::MFFunctionReturningInt,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_function
+ <
+ tti::MFFunctionReturningInt,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<double>,
+ boost::mpl::vector<boost::mpl::identity<int> >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_function
+ <
+ tti::mtfc_has_member_function_aFunction,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<AType>,
+ boost::mpl::vector<boost::mpl::identity<int> >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_function
+ <
+ tti::MFAnotherIntFunction,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<int>,
+ boost::mpl::vector<boost::mpl::identity<AType> >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_member_function
+ <
+ tti::mtfc_has_member_function_sFunction,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AnIntType<AType>,
+ boost::mpl::vector
+ <
+ boost::mpl::identity<int>,
+ boost::mpl::identity<long>,
+ boost::mpl::identity<double>
+ >
+ >
+ ));
+
   return 0;
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasStaticData.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasStaticData.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasStaticData.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -15,6 +15,15 @@
               ::value
             ));
   
+ BOOST_TEST((tti::mf_has_static_data
+ <
+ tti::mtfc_has_static_member_DSMember,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<short>
+ >
+ ::value
+ ));
+
   return boost::report_errors();
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasStaticData.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasStaticData.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasStaticData.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -7,4 +7,7 @@
 TTI_HAS_STATIC_MEMBER(DSMember)
 TTI_HAS_STATIC_MEMBER(SomeStaticData)
 
+TTI_MTFC_HAS_STATIC_MEMBER(DSMember)
+TTI_MTFC_HAS_STATIC_MEMBER(SomeStaticData)
+
 #endif // TEST_MF_HAS_STATIC_DATA_HPP

Modified: sandbox/tti/libs/tti/test/TestMFHasStaticDataCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasStaticDataCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasStaticDataCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -25,6 +25,14 @@
>
                   ));
   
+ BOOST_MPL_ASSERT((tti::mf_has_static_data
+ <
+ tti::mtfc_has_static_member_DSMember,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<short>
+ >
+ ));
+
   return 0;
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasStaticFunction.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasStaticFunction.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasStaticFunction.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -47,6 +47,52 @@
>
               ::value
             ));
+
+
+
+
+
+ BOOST_TEST((tti::mf_has_static_member_function
+ <
+ tti::MFHaveTheSIntFunction,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>,
+ boost::mpl::vector
+ <
+ boost::mpl::identity<long>,
+ boost::mpl::identity<double>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_static_member_function
+ <
+ tti::MFCTheTIntFunction,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<AType>,
+ boost::mpl::vector
+ <
+ boost::mpl::identity<long>,
+ boost::mpl::identity<double>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_static_member_function
+ <
+ tti::mtfc_has_static_member_function_TSFunction,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AStructType<AType>,
+ boost::mpl::vector
+ <
+ tti::NameIntType<AType>,
+ boost::mpl::identity<double>
+ >
+ >
+ ::value
+ ));
   
   return boost::report_errors();
 

Modified: sandbox/tti/libs/tti/test/TestMFHasStaticFunction.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasStaticFunction.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasStaticFunction.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -9,6 +9,11 @@
 TTI_HAS_STATIC_MEMBER_FUNCTION(TSFunction)
 TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION(Pickedname,SomeStaticFunction)
 
+TTI_MTFC_TRAIT_HAS_STATIC_MEMBER_FUNCTION(MFHaveTheSIntFunction,SIntFunction)
+TTI_MTFC_TRAIT_HAS_STATIC_MEMBER_FUNCTION(MFCTheTIntFunction,TIntFunction)
+TTI_MTFC_HAS_STATIC_MEMBER_FUNCTION(TSFunction)
+TTI_MTFC_TRAIT_HAS_STATIC_MEMBER_FUNCTION(MTFCPickedname,SomeStaticFunction)
+
 TTI_MEMBER_TYPE(AStructType)
 TTI_TRAIT_MEMBER_TYPE(NameIntType,AnIntType)
 

Modified: sandbox/tti/libs/tti/test/TestMFHasStaticFunctionCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasStaticFunctionCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasStaticFunctionCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -22,7 +22,7 @@
   
   tti::mf_has_static_member_function
     <
- tti::Pickedname<_,_,_>,
+ tti::MTFCPickedname,
     boost::mpl::identity<AType>,
     boost::mpl::identity<double>,
     boost::mpl::vector<boost::mpl::identity<float> >
@@ -69,6 +69,45 @@
>
                   ));
   
+ BOOST_MPL_ASSERT((tti::mf_has_static_member_function
+ <
+ tti::MFHaveTheSIntFunction,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>,
+ boost::mpl::vector
+ <
+ boost::mpl::identity<long>,
+ boost::mpl::identity<double>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_static_member_function
+ <
+ tti::MFCTheTIntFunction,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<AType>,
+ boost::mpl::vector
+ <
+ boost::mpl::identity<long>,
+ boost::mpl::identity<double>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_static_member_function
+ <
+ tti::mtfc_has_static_member_function_TSFunction,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AStructType<AType>,
+ boost::mpl::vector
+ <
+ tti::NameIntType<AType>,
+ boost::mpl::identity<double>
+ >
+ >
+ ));
+
   return 0;
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasTemplate.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTemplate.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTemplate.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -46,6 +46,46 @@
               ::value
             ));
   
+ BOOST_TEST((tti::mf_has_template
+ <
+ tti::MetaHaveMStr,
+ tti::member_type_AStructType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((!tti::mf_has_template
+ <
+ tti::mtfc_has_template_TemplateNotExist,
+ tti::MT_BType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_template
+ <
+ tti::mtfc_has_template_ATPMemberTemplate,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_template
+ <
+ tti::MFClassHaveCL,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_template
+ <
+ tti::mtfc_has_template_SimpleTMP,
+ boost::mpl::identity<AnotherType>
+ >
+ ::value
+ ));
+
   return boost::report_errors();
   
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasTemplate.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTemplate.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTemplate.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -12,6 +12,14 @@
 TTI_TRAIT_HAS_TEMPLATE(AMT,AnotherMemberTemplate)
 TTI_HAS_TEMPLATE(SomeMemberTemplate)
 
+TTI_MTFC_TRAIT_HAS_TEMPLATE(MetaHaveMStr,MStrMemberTemplate)
+TTI_MTFC_HAS_TEMPLATE(TemplateNotExist)
+TTI_MTFC_HAS_TEMPLATE(ATPMemberTemplate)
+TTI_MTFC_TRAIT_HAS_TEMPLATE(MFClassHaveCL,CLMemberTemplate)
+TTI_MTFC_HAS_TEMPLATE(SimpleTMP)
+TTI_MTFC_TRAIT_HAS_TEMPLATE(MFClassAMT,AnotherMemberTemplate)
+TTI_MTFC_HAS_TEMPLATE(SomeMemberTemplate)
+
 TTI_MEMBER_TYPE(AStructType)
 TTI_TRAIT_MEMBER_TYPE(MT_BType,BType)
 

Modified: sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -54,6 +54,54 @@
               ::value
             ));
   
+ BOOST_TEST((tti::mf_has_template_check_params
+ <
+ tti::MF_HT_Str,
+ tti::member_type_AStructType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_AnotherMemberTemplate,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((!tti::mf_has_template_check_params
+ <
+ tti::MetaCWrongParametersForMP,
+ boost::mpl::identity<AnotherType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_CTManyParameters,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::MT_BType<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((!tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_TemplateNotExist,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::MT_BType<AType>
+ >
+ >
+ ::value
+ ));
+
   return boost::report_errors();
   
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParams.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -10,8 +10,16 @@
 TTI_HAS_TEMPLATE_CHECK_PARAMS(CTManyParameters,(class)(class)(int)(short)(class)(template <class)(int> class InnerTemplate)(class))
 TTI_HAS_TEMPLATE_CHECK_PARAMS(TemplateNotExist,(int)(class))
 
+TTI_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(MF_HT_Str,MStrMemberTemplate,(class))
+TTI_MTFC_HAS_TEMPLATE_CHECK_PARAMS(AnotherMemberTemplate,(int)(int))
+TTI_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(MetaCWrongParametersForMP,ManyParameters,(class)(class)(int)(class)(template <class> class InnerTemplate)(class)(short))
+TTI_MTFC_HAS_TEMPLATE_CHECK_PARAMS(CTManyParameters,(class)(class)(int)(short)(class)(template <class)(int> class InnerTemplate)(class))
+TTI_MTFC_HAS_TEMPLATE_CHECK_PARAMS(TemplateNotExist,(int)(class))
+
 TTI_MEMBER_TYPE(AStructType)
 TTI_TRAIT_MEMBER_TYPE(MT_BType,BType)
 TTI_MEMBER_TYPE(CType)
 
+TTI_MTFC_MEMBER_TYPE(CType)
+
 #endif // TEST_MF_HAS_TEMPLATE_CHECK_PARAMS_HPP

Modified: sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParamsCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParamsCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTemplateCheckParamsCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -13,7 +13,7 @@
                 tti::has_template_check_params_TemplateNotExist<_>,
                 tti::mf_member_type
                   <
- tti::member_type_CType<_>,
+ tti::mtfc_member_type_CType,
                   tti::MT_BType<AType>
>
> aVar;
@@ -45,6 +45,31 @@
>
                   ));
   
+ BOOST_MPL_ASSERT((tti::mf_has_template_check_params
+ <
+ tti::MF_HT_Str,
+ tti::member_type_AStructType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_AnotherMemberTemplate,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_CTManyParameters,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::MT_BType<AType>
+ >
+ >
+ ));
+
   return 0;
   
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasTemplateCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTemplateCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTemplateCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -16,7 +16,7 @@
     
   tti::mf_has_template
     <
- tti::has_template_ATPMemberTemplate<_>,
+ tti::mtfc_has_template_ATPMemberTemplate,
     boost::mpl::identity<AnotherType>
> aVar2;
   
@@ -49,6 +49,34 @@
                       boost::mpl::identity<AnotherType>
>
                   ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template
+ <
+ tti::MetaHaveMStr,
+ tti::member_type_AStructType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template
+ <
+ tti::mtfc_has_template_ATPMemberTemplate,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template
+ <
+ tti::MFClassHaveCL,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template
+ <
+ tti::mtfc_has_template_SimpleTMP,
+ boost::mpl::identity<AnotherType>
+ >
+ ));
   
   return 0;
   

Modified: sandbox/tti/libs/tti/test/TestMFHasType.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasType.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasType.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -74,6 +74,74 @@
               ::value
             ));
             
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntType,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::MetaFNameStruct,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntTypeReference,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_BType,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::MClassTheInteger,
+ tti::member_type_BType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_CType,
+ tti::member_type_BType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnotherIntegerType,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::MTFCSomethingElse,
+ boost::mpl::identity<AnotherType>
+ >
+ ::value
+ ));
+
   return boost::report_errors();
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasType.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasType.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasType.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -15,7 +15,20 @@
 TTI_TRAIT_HAS_TYPE(SomethingElse,someOtherType)
 TTI_HAS_TYPE(NoOtherType)
 
+TTI_MTFC_HAS_TYPE(AnIntType)
+TTI_MTFC_TRAIT_HAS_TYPE(MetaFNameStruct,AStructType)
+TTI_MTFC_HAS_TYPE(AnIntTypeReference)
+TTI_MTFC_HAS_TYPE(BType)
+TTI_MTFC_TRAIT_HAS_TYPE(MClassTheInteger,AnIntegerType)
+TTI_MTFC_HAS_TYPE(CType)
+TTI_MTFC_HAS_TYPE(AnotherIntegerType)
+
+TTI_MTFC_TRAIT_HAS_TYPE(MTFCSomethingElse,someOtherType)
+TTI_MTFC_HAS_TYPE(NoOtherType)
+
 TTI_MEMBER_TYPE(BType)
 TTI_MEMBER_TYPE(CType)
 
+TTI_MTFC_MEMBER_TYPE(CType)
+
 #endif // TEST_MF_HAS_TYPE_HPP

Modified: sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -69,7 +69,7 @@
                 tti::has_type_AnotherIntegerType<_,_>,
                 tti::mf_member_type
                   <
- tti::member_type_CType<_>,
+ tti::mtfc_member_type_CType,
                   tti::member_type_BType<AType>
>,
                 boost::mpl::identity<int>
@@ -94,6 +94,95 @@
>
               ::value
             ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntType,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::MFunctionNameStruct,
+ boost::mpl::identity<AType>,
+ tti::member_type_AStructType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntTypeReference,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int &>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_BType,
+ boost::mpl::identity<AType>,
+ tti::member_type_BType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::MFCTheInteger,
+ tti::member_type_BType<AType>,
+ boost::mpl::identity<int>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_CType,
+ tti::member_type_BType<AType>,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::member_type_BType<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnotherIntegerType,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >,
+ boost::mpl::identity<int>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_type
+ <
+ tti::FClassSomethingElse,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AnIntType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((!tti::mf_has_type
+ <
+ tti::mtfc_has_type_NoOtherType,
+ boost::mpl::identity<AnotherType>,
+ boost::mpl::identity<double>
+ >
+ ::value
+ ));
   
   return boost::report_errors();
 

Modified: sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedef.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -14,9 +14,21 @@
 TTI_TRAIT_HAS_TYPE(SomethingElse,someOtherType)
 TTI_HAS_TYPE(NoOtherType)
 
+TTI_MTFC_HAS_TYPE(AnIntType)
+TTI_MTFC_TRAIT_HAS_TYPE(MFunctionNameStruct,AStructType)
+TTI_MTFC_HAS_TYPE(AnIntTypeReference)
+TTI_MTFC_HAS_TYPE(BType)
+TTI_MTFC_TRAIT_HAS_TYPE(MFCTheInteger,AnIntegerType)
+TTI_MTFC_HAS_TYPE(CType)
+TTI_MTFC_HAS_TYPE(AnotherIntegerType)
+TTI_MTFC_TRAIT_HAS_TYPE(FClassSomethingElse,someOtherType)
+TTI_MTFC_HAS_TYPE(NoOtherType)
+
 TTI_MEMBER_TYPE(AStructType)
 TTI_MEMBER_TYPE(BType)
 TTI_MEMBER_TYPE(CType)
 TTI_MEMBER_TYPE(AnIntType)
 
+TTI_MTFC_MEMBER_TYPE(CType)
+
 #endif // TEST_MF_HAS_TYPE_CHECK_TYPEDEF_HPP

Modified: sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedefCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedefCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTypeCheckTypedefCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -17,7 +17,7 @@
     
   tti::mf_has_type
     <
- tti::has_type_NoOtherType<_,_>,
+ tti::mtfc_has_type_NoOtherType,
     boost::mpl::identity<AType>,
     boost::mpl::identity<float>
> aVar2;
@@ -96,6 +96,78 @@
>
             ));
   
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntType,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::MFunctionNameStruct,
+ boost::mpl::identity<AType>,
+ tti::member_type_AStructType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntTypeReference,
+ boost::mpl::identity<AType>,
+ boost::mpl::identity<int &>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_BType,
+ boost::mpl::identity<AType>,
+ tti::member_type_BType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::MFCTheInteger,
+ tti::member_type_BType<AType>,
+ boost::mpl::identity<int>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_CType,
+ tti::member_type_BType<AType>,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::member_type_BType<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnotherIntegerType,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >,
+ boost::mpl::identity<int>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::FClassSomethingElse,
+ boost::mpl::identity<AnotherType>,
+ tti::member_type_AnIntType<AType>
+ >
+ ));
+
   return 0;
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFHasTypeCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFHasTypeCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFHasTypeCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -10,7 +10,7 @@
   
   tti::mf_has_type
     <
- tti::has_type_AnIntType<_>,
+ tti::mtfc_has_type_AnIntType,
     boost::mpl::identity<AnotherType>
> aVar;
   
@@ -82,6 +82,66 @@
>
                   ));
             
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntType,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::MetaFNameStruct,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnIntTypeReference,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_BType,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::MClassTheInteger,
+ tti::member_type_BType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_CType,
+ tti::member_type_BType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::mtfc_has_type_AnotherIntegerType,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::member_type_BType<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_type
+ <
+ tti::MTFCSomethingElse,
+ boost::mpl::identity<AnotherType>
+ >
+ ));
+
   return 0;
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFMemberType.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFMemberType.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFMemberType.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -97,7 +97,99 @@
>
               ::value
             ));
-
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_AnIntType,
+ boost::mpl::identity<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::MFNameStruct,
+ boost::mpl::identity<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_AnIntTypeReference,
+ boost::mpl::identity<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_BType,
+ boost::mpl::identity<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::MFTheInteger,
+ tti::member_type_BType<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_AnotherIntegerType,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::member_type_BType<AType>
+ >
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::MetaClSomethingElse,
+ boost::mpl::identity<AnotherType>
+ >
+ >
+ ::value
+ ));
+
   return boost::report_errors();
 
   }

Modified: sandbox/tti/libs/tti/test/TestMFMemberType.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFMemberType.hpp (original)
+++ sandbox/tti/libs/tti/test/TestMFMemberType.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -13,4 +13,13 @@
 TTI_MEMBER_TYPE(AnotherIntegerType)
 TTI_TRAIT_MEMBER_TYPE(SomethingElse,someOtherType)
 
+TTI_MTFC_MEMBER_TYPE(AnIntType)
+TTI_MTFC_TRAIT_MEMBER_TYPE(MFNameStruct,AStructType)
+TTI_MTFC_MEMBER_TYPE(AnIntTypeReference)
+TTI_MTFC_MEMBER_TYPE(BType)
+TTI_MTFC_TRAIT_MEMBER_TYPE(MFTheInteger,AnIntegerType)
+TTI_MTFC_MEMBER_TYPE(CType)
+TTI_MTFC_MEMBER_TYPE(AnotherIntegerType)
+TTI_MTFC_TRAIT_MEMBER_TYPE(MetaClSomethingElse,someOtherType)
+
 #endif // TEST_MF_MEMBER_TYPE_HPP

Modified: sandbox/tti/libs/tti/test/TestMFMemberTypeCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestMFMemberTypeCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestMFMemberTypeCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -90,6 +90,90 @@
>
                   ));
   
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_AnIntType,
+ boost::mpl::identity<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::MFNameStruct,
+ boost::mpl::identity<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_AnIntTypeReference,
+ boost::mpl::identity<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_BType,
+ boost::mpl::identity<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::MFTheInteger,
+ tti::member_type_BType<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_AnotherIntegerType,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::member_type_BType<AType>
+ >
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_valid_member_type
+ <
+ tti::mf_member_type
+ <
+ tti::MetaClSomethingElse,
+ boost::mpl::identity<AnotherType>
+ >
+ >
+ ));
+
   return 0;
 
   }

Modified: sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.cpp (original)
+++ sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -56,6 +56,54 @@
               ::value
             ));
   
+ BOOST_TEST((tti::mf_has_template_check_params
+ <
+ tti::MF_HT_Str,
+ tti::member_type_AStructType<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_AnotherMemberTemplate,
+ boost::mpl::identity<AType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((!tti::mf_has_template_check_params
+ <
+ tti::AllWrongParametersForMP,
+ boost::mpl::identity<AnotherType>
+ >
+ ::value
+ ));
+
+ BOOST_TEST((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_CTManyParameters,
+ tti::mf_member_type
+ <
+ tti::member_type_CType<_>,
+ tti::MT_BType<AType>
+ >
+ >
+ ::value
+ ));
+
+ BOOST_TEST((!tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_TemplateNotExist,
+ tti::mf_member_type
+ <
+ tti::mtfc_member_type_CType,
+ tti::MT_BType<AType>
+ >
+ >
+ ::value
+ ));
+
 #endif //!defined(BOOST_NO_VARIADIC_MACROS)
 
   return boost::report_errors();

Modified: sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.hpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.hpp (original)
+++ sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParams.hpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -13,10 +13,18 @@
 TTI_VM_HAS_TEMPLATE_CHECK_PARAMS(CTManyParameters,class,class,int,short,class,template <class,int> class InnerTemplate,class)
 TTI_VM_HAS_TEMPLATE_CHECK_PARAMS(TemplateNotExist,int,class)
 
+TTI_VM_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(MF_HT_Str,MStrMemberTemplate,class)
+TTI_VM_MTFC_HAS_TEMPLATE_CHECK_PARAMS(AnotherMemberTemplate,int,int)
+TTI_VM_MTFC_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(AllWrongParametersForMP,ManyParameters,class,class,int,class,template <class> class InnerTemplate,class,short)
+TTI_VM_MTFC_HAS_TEMPLATE_CHECK_PARAMS(CTManyParameters,class,class,int,short,class,template <class,int> class InnerTemplate,class)
+TTI_VM_MTFC_HAS_TEMPLATE_CHECK_PARAMS(TemplateNotExist,int,class)
+
 TTI_MEMBER_TYPE(AStructType)
 TTI_TRAIT_MEMBER_TYPE(MT_BType,BType)
 TTI_MEMBER_TYPE(CType)
 
+TTI_MTFC_MEMBER_TYPE(CType)
+
 #endif //!defined(BOOST_NO_VARIADIC_MACROS)
 
 #endif // TEST_VM_MF_HAS_TEMPLATE_CHECK_PARAMS_HPP

Modified: sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParamsCompile.cpp
==============================================================================
--- sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParamsCompile.cpp (original)
+++ sandbox/tti/libs/tti/test/TestVMMFHasTemplateCheckParamsCompile.cpp 2011-02-08 11:13:22 EST (Tue, 08 Feb 2011)
@@ -12,7 +12,7 @@
   
   tti::mf_has_template_check_params
                 <
- tti::has_template_check_params_TemplateNotExist<_>,
+ tti::mtfc_has_template_check_params_TemplateNotExist,
                 tti::mf_member_type
                   <
                   tti::member_type_CType<_>,
@@ -41,6 +41,31 @@
                       tti::has_template_check_params_CTManyParameters<_>,
                       tti::mf_member_type
                         <
+ tti::mtfc_member_type_CType,
+ tti::MT_BType<AType>
+ >
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template_check_params
+ <
+ tti::MF_HT_Str,
+ tti::member_type_AStructType<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_AnotherMemberTemplate,
+ boost::mpl::identity<AType>
+ >
+ ));
+
+ BOOST_MPL_ASSERT((tti::mf_has_template_check_params
+ <
+ tti::mtfc_has_template_check_params_CTManyParameters,
+ tti::mf_member_type
+ <
                         tti::member_type_CType<_>,
                         tti::MT_BType<AType>
>


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk