stabilize build system: depends, installer, boost/bdb fixes, cross targets groundwork

This commit is contained in:
2026-02-24 18:38:47 +00:00
parent da8c28aaeb
commit 65cb2619a7
13106 changed files with 2484322 additions and 1804 deletions
@@ -0,0 +1,78 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_COMP_MEM_FUN_HPP)
#define BOOST_TTI_DETAIL_COMP_MEM_FUN_HPP
#include <boost/config.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/dftclass.hpp>
#include <boost/tti/detail/dnullptr.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
#if defined(__SUNPRO_CC)
#define BOOST_TTI_DETAIL_TRAIT_HAS_COMP_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_hcmf) \
{ \
template<class BOOST_TTI_DETAIL_TP_F> \
struct cl_type : \
boost::remove_const \
< \
typename BOOST_TTI_NAMESPACE::detail::class_type<BOOST_TTI_DETAIL_TP_F>::type \
> \
{ \
}; \
\
template<BOOST_TTI_DETAIL_TP_T> \
struct helper {}; \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_U::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<sizeof(chkt<typename cl_type<BOOST_TTI_DETAIL_TP_T>::type>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
/**/
#else
#define BOOST_TTI_DETAIL_TRAIT_HAS_COMP_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_hcmf) \
{ \
template<class BOOST_TTI_DETAIL_TP_F> \
struct cl_type : \
boost::remove_const \
< \
typename BOOST_TTI_NAMESPACE::detail::class_type<BOOST_TTI_DETAIL_TP_F>::type \
> \
{ \
}; \
\
template<BOOST_TTI_DETAIL_TP_T> \
struct helper; \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_U::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<sizeof(chkt<typename cl_type<BOOST_TTI_DETAIL_TP_T>::type>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
/**/
#endif
#endif // BOOST_TTI_DETAIL_COMP_MEM_FUN_HPP
@@ -0,0 +1,29 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_DATA_HPP)
#define BOOST_TTI_DETAIL_DATA_HPP
#include <boost/mpl/or.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/dmem_data.hpp>
#include <boost/tti/detail/dstatic_mem_data.hpp>
#define BOOST_TTI_DETAIL_TRAIT_HAS_DATA(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_DATA(trait,name) \
template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_DT> \
struct BOOST_PP_CAT(trait,_detail_hd) : \
boost::mpl::or_ \
< \
BOOST_PP_CAT(trait,_detail_hmd_with_enclosing_class)<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_DT>, \
BOOST_PP_CAT(trait,_detail_hsd)<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_DT> \
> \
{ \
}; \
/**/
#endif // BOOST_TTI_DETAIL_DATA_HPP
@@ -0,0 +1,23 @@
// (C) Copyright Edward Diener 2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_DEFTYPE_HPP)
#define BOOST_TTI_DETAIL_DEFTYPE_HPP
namespace boost
{
namespace tti
{
namespace detail
{
struct deftype
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_DEFTYPE_HPP
@@ -0,0 +1,43 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_FTCLASS_HPP)
#define BOOST_TTI_DETAIL_FTCLASS_HPP
#include <boost/function_types/parameter_types.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/quote.hpp>
namespace boost
{
namespace tti
{
namespace detail
{
template<class BOOST_TTI_DETAIL_TP_F>
struct class_type :
boost::mpl::at
<
typename
boost::function_types::parameter_types
<
BOOST_TTI_DETAIL_TP_F,
boost::mpl::quote1
<
boost::mpl::identity
>
>::type,
boost::mpl::int_<0>
>
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_FTCLASS_HPP
@@ -0,0 +1,34 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_FUNCTION_HPP)
#define BOOST_TTI_DETAIL_FUNCTION_HPP
#include <boost/mpl/or.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/dmem_fun.hpp>
#include <boost/tti/detail/dstatic_mem_fun.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#define BOOST_TTI_DETAIL_TRAIT_HAS_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_CALL_TYPES_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_IMPL_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_FS,class BOOST_TTI_DETAIL_TP_TAG> \
struct BOOST_PP_CAT(trait,_detail_hf) : \
boost::mpl::or_ \
< \
BOOST_PP_CAT(trait,_detail_call_types)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_R,BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_TAG>, \
BOOST_PP_CAT(trait,_detail_ihsmf) \
< \
BOOST_TTI_DETAIL_TP_T, \
typename BOOST_TTI_NAMESPACE::detail::tfunction_seq<BOOST_TTI_DETAIL_TP_R,BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_TAG>::type \
> \
> \
{ \
}; \
/**/
#endif // BOOST_TTI_DETAIL_FUNCTION_HPP
@@ -0,0 +1,34 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_LAMBDA_HPP)
#define BOOST_TTI_DETAIL_LAMBDA_HPP
#include <boost/mpl/or.hpp>
#include <boost/tti/detail/dmetafunc.hpp>
#include <boost/tti/detail/dplaceholder.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
namespace boost
{
namespace tti
{
namespace detail
{
template <class BOOST_TTI_DETAIL_TP_T>
struct is_lambda_expression :
boost::mpl::or_
<
BOOST_TTI_NAMESPACE::detail::is_metafunction_class<BOOST_TTI_DETAIL_TP_T>,
BOOST_TTI_NAMESPACE::detail::is_placeholder_expression<BOOST_TTI_DETAIL_TP_T>
>
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_LAMBDA_HPP
@@ -0,0 +1,219 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_MEM_DATA_HPP)
#define BOOST_TTI_DETAIL_MEM_DATA_HPP
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/function_types/components.hpp>
#include <boost/function_types/is_member_object_pointer.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/or.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/ddeftype.hpp>
#include <boost/tti/detail/dftclass.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/remove_const.hpp>
#if defined(BOOST_MSVC) || (BOOST_WORKAROUND(BOOST_GCC, >= 40400) && BOOST_WORKAROUND(BOOST_GCC, < 40600))
#define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_C> \
struct BOOST_PP_CAT(trait,_detail_hmd_op) \
{ \
template<class> \
struct return_of; \
\
template<class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_IC> \
struct return_of<BOOST_TTI_DETAIL_TP_R BOOST_TTI_DETAIL_TP_IC::*> \
{ \
typedef BOOST_TTI_DETAIL_TP_R type; \
}; \
\
template<bool,typename BOOST_TTI_DETAIL_TP_U> \
struct menable_if; \
\
template<typename BOOST_TTI_DETAIL_TP_U> \
struct menable_if<true,BOOST_TTI_DETAIL_TP_U> \
{ \
typedef BOOST_TTI_DETAIL_TP_U type; \
}; \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static ::boost::type_traits::yes_type check2(BOOST_TTI_DETAIL_TP_V BOOST_TTI_DETAIL_TP_U::*); \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static ::boost::type_traits::no_type check2(BOOST_TTI_DETAIL_TP_U); \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static typename \
menable_if \
< \
sizeof(check2<BOOST_TTI_DETAIL_TP_U,BOOST_TTI_DETAIL_TP_V>(&BOOST_TTI_DETAIL_TP_U::name))==sizeof(::boost::type_traits::yes_type), \
::boost::type_traits::yes_type \
> \
::type \
has_matching_member(int); \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static ::boost::type_traits::no_type has_matching_member(...); \
\
template<class BOOST_TTI_DETAIL_TP_U,class BOOST_TTI_DETAIL_TP_V> \
struct ttc_md \
{ \
typedef boost::mpl::bool_<sizeof(has_matching_member<BOOST_TTI_DETAIL_TP_V,typename return_of<BOOST_TTI_DETAIL_TP_U>::type>(0))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
\
typedef typename ttc_md<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_C>::type type; \
\
}; \
/**/
#else // !defined(BOOST_MSVC)
#include <boost/tti/detail/dmem_fun.hpp>
#define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_TYPES_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_C> \
struct BOOST_PP_CAT(trait,_detail_hmd_op) : \
BOOST_PP_CAT(trait,_detail_types)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_C> \
{ \
}; \
/**/
#endif // defined(BOOST_MSVC)
#define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_ENCLOSING_CLASS(trait) \
template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hmd_invoke_enclosing_class) : \
BOOST_PP_CAT(trait,_detail_hmd_op) \
< \
typename BOOST_TTI_NAMESPACE::detail::ptmd<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_TYPE>::type, \
typename boost::remove_const<BOOST_TTI_DETAIL_TP_ET>::type \
> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_PT_MEMBER(trait) \
template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hmd_invoke_pt_member) : \
BOOST_PP_CAT(trait,_detail_hmd_op) \
< \
typename BOOST_TTI_NAMESPACE::detail::dmem_get_type<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_TYPE>::type, \
typename boost::remove_const \
< \
typename BOOST_TTI_NAMESPACE::detail::dmem_get_enclosing<BOOST_TTI_DETAIL_TP_ET,BOOST_TTI_DETAIL_TP_TYPE>::type \
>::type \
> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_WITH_ENCLOSING_CLASS(trait) \
BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_ENCLOSING_CLASS(trait) \
template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hmd_with_enclosing_class) : \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_ET>, \
BOOST_PP_CAT(trait,_detail_hmd_invoke_enclosing_class) \
< \
BOOST_TTI_DETAIL_TP_ET, \
BOOST_TTI_DETAIL_TP_TYPE \
>, \
boost::mpl::false_ \
> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_OP(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_WITH_ENCLOSING_CLASS(trait) \
BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA_INVOKE_PT_MEMBER(trait) \
template<class BOOST_TTI_DETAIL_TP_ET,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hmd) : \
boost::mpl::eval_if \
< \
boost::is_same<BOOST_TTI_DETAIL_TP_TYPE,BOOST_TTI_NAMESPACE::detail::deftype>, \
BOOST_PP_CAT(trait,_detail_hmd_invoke_pt_member) \
< \
BOOST_TTI_DETAIL_TP_ET, \
BOOST_TTI_DETAIL_TP_TYPE \
>, \
BOOST_PP_CAT(trait,_detail_hmd_with_enclosing_class) \
< \
BOOST_TTI_DETAIL_TP_ET, \
BOOST_TTI_DETAIL_TP_TYPE \
> \
> \
{ \
}; \
/**/
namespace boost
{
namespace tti
{
namespace detail
{
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R>
struct ptmd
{
typedef BOOST_TTI_DETAIL_TP_R BOOST_TTI_DETAIL_TP_T::* type;
};
template<class BOOST_TTI_DETAIL_TP_T>
struct dmem_check_ptmd :
boost::mpl::identity<BOOST_TTI_DETAIL_TP_T>
{
BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer<BOOST_TTI_DETAIL_TP_T>));
};
template<class BOOST_TTI_DETAIL_TP_T>
struct dmem_check_ptec :
BOOST_TTI_NAMESPACE::detail::class_type<BOOST_TTI_DETAIL_TP_T>
{
BOOST_MPL_ASSERT((boost::function_types::is_member_object_pointer<BOOST_TTI_DETAIL_TP_T>));
};
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_T2>
struct dmem_get_type :
boost::mpl::eval_if
<
boost::is_same<BOOST_TTI_DETAIL_TP_T2,BOOST_TTI_NAMESPACE::detail::deftype>,
BOOST_TTI_NAMESPACE::detail::dmem_check_ptmd<BOOST_TTI_DETAIL_TP_T>,
BOOST_TTI_NAMESPACE::detail::ptmd<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_T2>
>
{
};
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_T2>
struct dmem_get_enclosing :
boost::mpl::eval_if
<
boost::is_same<BOOST_TTI_DETAIL_TP_T2,BOOST_TTI_NAMESPACE::detail::deftype>,
BOOST_TTI_NAMESPACE::detail::dmem_check_ptec<BOOST_TTI_DETAIL_TP_T>,
boost::mpl::identity<BOOST_TTI_DETAIL_TP_T>
>
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_MEM_DATA_HPP
@@ -0,0 +1,133 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_MEM_FUN_HPP)
#define BOOST_TTI_DETAIL_MEM_FUN_HPP
#include <boost/config.hpp>
#include <boost/function_types/is_member_function_pointer.hpp>
#include <boost/function_types/property_tags.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/logical.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/tti/detail/dcomp_mem_fun.hpp>
#include <boost/tti/detail/ddeftype.hpp>
#include <boost/tti/detail/dnullptr.hpp>
#include <boost/tti/detail/dptmf.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#if defined(__SUNPRO_CC)
#define BOOST_TTI_DETAIL_TRAIT_HAS_TYPES_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_PMEMF,class BOOST_TTI_DETAIL_TP_C> \
struct BOOST_PP_CAT(trait,_detail_types) \
{ \
template<BOOST_TTI_DETAIL_TP_PMEMF> \
struct helper {}; \
\
template<class BOOST_TTI_DETAIL_TP_EC> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_EC::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_EC> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<sizeof(chkt<BOOST_TTI_DETAIL_TP_C>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
/**/
#else
#define BOOST_TTI_DETAIL_TRAIT_HAS_TYPES_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_PMEMF,class BOOST_TTI_DETAIL_TP_C> \
struct BOOST_PP_CAT(trait,_detail_types) \
{ \
template<BOOST_TTI_DETAIL_TP_PMEMF> \
struct helper; \
\
template<class BOOST_TTI_DETAIL_TP_EC> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_EC::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_EC> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<sizeof(chkt<BOOST_TTI_DETAIL_TP_C>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
/**/
#endif
#define BOOST_TTI_DETAIL_TRAIT_CTMF_INVOKE(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_TYPES_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_FS,class BOOST_TTI_DETAIL_TP_TAG> \
struct BOOST_PP_CAT(trait,_detail_ctmf_invoke) : \
BOOST_PP_CAT(trait,_detail_types) \
< \
typename BOOST_TTI_NAMESPACE::detail::ptmf_seq<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_R,BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_TAG>::type, \
BOOST_TTI_DETAIL_TP_T \
> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_CALL_TYPES_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_CTMF_INVOKE(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_FS,class BOOST_TTI_DETAIL_TP_TAG> \
struct BOOST_PP_CAT(trait,_detail_call_types) : \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_ctmf_invoke) \
< \
BOOST_TTI_DETAIL_TP_T, \
BOOST_TTI_DETAIL_TP_R, \
BOOST_TTI_DETAIL_TP_FS, \
BOOST_TTI_DETAIL_TP_TAG \
>, \
boost::mpl::false_ \
> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_CHECK_HAS_COMP_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_COMP_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_check_comp) : \
BOOST_PP_CAT(trait,_detail_hcmf)<BOOST_TTI_DETAIL_TP_T> \
{ \
BOOST_MPL_ASSERT((boost::function_types::is_member_function_pointer<BOOST_TTI_DETAIL_TP_T>)); \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_CALL_TYPES_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_CHECK_HAS_COMP_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_FS,class BOOST_TTI_DETAIL_TP_TAG> \
struct BOOST_PP_CAT(trait,_detail_hmf) : \
boost::mpl::eval_if \
< \
boost::mpl::and_ \
< \
boost::is_same<BOOST_TTI_DETAIL_TP_R,BOOST_TTI_NAMESPACE::detail::deftype>, \
boost::is_same<BOOST_TTI_DETAIL_TP_FS,boost::mpl::vector<> >, \
boost::is_same<BOOST_TTI_DETAIL_TP_TAG,boost::function_types::null_tag> \
>, \
BOOST_PP_CAT(trait,_detail_check_comp)<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_call_types)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_R,BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_TAG> \
> \
{ \
}; \
/**/
#endif // BOOST_TTI_DETAIL_MEM_FUN_HPP
@@ -0,0 +1,51 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_MEM_TYPE_HPP)
#define BOOST_TTI_DETAIL_MEM_TYPE_HPP
#include <boost/config.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/has_xxx.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/type_traits/is_class.hpp>
#define BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_MEMBER_TYPE_OP(trait,name) \
BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(BOOST_PP_CAT(trait,_detail_mpl), name, false) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_op) : \
BOOST_PP_CAT(trait,_detail_mpl)<BOOST_TTI_DETAIL_TP_T> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_MEMBER_TYPE(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_MEMBER_TYPE_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail) \
{ \
typedef typename \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_op)<BOOST_TTI_DETAIL_TP_T>, \
boost::mpl::false_ \
>::type type; \
\
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_MEMBER_TYPE(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_member_type) \
{ \
typedef typename BOOST_TTI_DETAIL_TP_T::name type; \
}; \
/**/
#endif // BOOST_TTI_DETAIL_MEM_TYPE_HPP
@@ -0,0 +1,29 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_METAFUNC_HPP)
#define BOOST_TTI_DETAIL_METAFUNC_HPP
#include <boost/mpl/has_xxx.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
namespace boost
{
namespace tti
{
namespace detail
{
BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(is_metafunction_class_apply, apply, false)
template <class BOOST_TTI_DETAIL_TP_T>
struct is_metafunction_class :
BOOST_TTI_NAMESPACE::detail::is_metafunction_class_apply<BOOST_TTI_DETAIL_TP_T>
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_METAFUNC_HPP
@@ -0,0 +1,23 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_NOTYPE_HPP)
#define BOOST_TTI_DETAIL_NOTYPE_HPP
namespace boost
{
namespace tti
{
namespace detail
{
struct notype
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_NOTYPE_HPP
@@ -0,0 +1,22 @@
// (C) Copyright Edward Diener 2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_NULLPTR_HPP)
#define BOOST_TTI_DETAIL_NULLPTR_HPP
#include <boost/config.hpp>
#if defined(BOOST_NO_CXX11_NULLPTR)
#define BOOST_TTI_DETAIL_NULLPTR 0
#else // !BOOST_NO_CXX11_NULLPTR
#define BOOST_TTI_DETAIL_NULLPTR nullptr
#endif // BOOST_NO_CXX11_NULLPTR
#endif // BOOST_TTI_DETAIL_NULLPTR_HPP
@@ -0,0 +1,36 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_PLACEHOLDER_HPP)
#define BOOST_TTI_DETAIL_PLACEHOLDER_HPP
#include <boost/mpl/lambda.hpp>
#include <boost/mpl/not.hpp>
#include <boost/type_traits/is_same.hpp>
namespace boost
{
namespace tti
{
namespace detail
{
template <class BOOST_TTI_DETAIL_TP_T>
struct is_placeholder_expression :
boost::mpl::not_
<
boost::is_same
<
typename boost::mpl::lambda<BOOST_TTI_DETAIL_TP_T>::type,
BOOST_TTI_DETAIL_TP_T
>
>
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_PLACEHOLDER_HPP
@@ -0,0 +1,46 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_PTMF_HPP)
#define BOOST_TTI_DETAIL_PTMF_HPP
#include <boost/config.hpp>
#include <boost/mpl/push_front.hpp>
#include <boost/function_types/member_function_pointer.hpp>
namespace boost
{
namespace tti
{
namespace detail
{
template
<
class BOOST_TTI_DETAIL_TP_T,
class BOOST_TTI_DETAIL_TP_R,
class BOOST_TTI_DETAIL_TP_FS,
class BOOST_TTI_DETAIL_TP_TAG
>
struct ptmf_seq
{
typedef typename
boost::function_types::member_function_pointer
<
typename
boost::mpl::push_front
<
typename
boost::mpl::push_front<BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_T>::type,
BOOST_TTI_DETAIL_TP_R
>::type,
BOOST_TTI_DETAIL_TP_TAG
>::type type;
};
}
}
}
#endif // BOOST_TTI_DETAIL_PTMF_HPP
@@ -0,0 +1,117 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_STATIC_MEM_DATA_HPP)
#define BOOST_TTI_DETAIL_STATIC_MEM_DATA_HPP
#include <boost/config.hpp>
#include <boost/function_types/is_function.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
#include <boost/tti/detail/dnullptr.hpp>
#if defined(BOOST_MSVC)
#define BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_DATA_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hsd_op) \
{ \
template<bool,typename BOOST_TTI_DETAIL_TP_U> \
struct menable_if; \
\
template<typename BOOST_TTI_DETAIL_TP_U> \
struct menable_if<true,BOOST_TTI_DETAIL_TP_U> \
{ \
typedef BOOST_TTI_DETAIL_TP_U type; \
}; \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static ::boost::type_traits::yes_type check2(BOOST_TTI_DETAIL_TP_V *); \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static ::boost::type_traits::no_type check2(BOOST_TTI_DETAIL_TP_U); \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static typename \
menable_if \
< \
sizeof(check2<BOOST_TTI_DETAIL_TP_U,BOOST_TTI_DETAIL_TP_V>(&BOOST_TTI_DETAIL_TP_U::name))==sizeof(::boost::type_traits::yes_type), \
::boost::type_traits::yes_type \
> \
::type \
has_matching_member(int); \
\
template<typename BOOST_TTI_DETAIL_TP_U,typename BOOST_TTI_DETAIL_TP_V> \
static ::boost::type_traits::no_type has_matching_member(...); \
\
template<class BOOST_TTI_DETAIL_TP_U,class BOOST_TTI_DETAIL_TP_V> \
struct ttc_sd \
{ \
typedef boost::mpl::bool_<sizeof(has_matching_member<BOOST_TTI_DETAIL_TP_V,BOOST_TTI_DETAIL_TP_U>(0))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
\
typedef typename ttc_sd<BOOST_TTI_DETAIL_TP_TYPE,BOOST_TTI_DETAIL_TP_T>::type type; \
}; \
/**/
#elif defined(__SUNPRO_CC)
#define BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_DATA_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hsd_op) \
{ \
template<BOOST_TTI_DETAIL_TP_TYPE *> \
struct helper {}; \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_U::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<(!boost::function_types::is_function<BOOST_TTI_DETAIL_TP_TYPE>::value) && (sizeof(chkt<BOOST_TTI_DETAIL_TP_T>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type))> type; \
}; \
/**/
#else
#define BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_DATA_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hsd_op) \
{ \
template<BOOST_TTI_DETAIL_TP_TYPE *> \
struct helper; \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_U::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<(!boost::function_types::is_function<BOOST_TTI_DETAIL_TP_TYPE>::value) && (sizeof(chkt<BOOST_TTI_DETAIL_TP_T>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type))> type; \
}; \
/**/
#endif // defined(BOOST_MSVC)
#define BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_DATA(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_DATA_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_hsd) : \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_hsd_op)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_TYPE>, \
boost::mpl::false_ \
> \
{ \
}; \
/**/
#endif // BOOST_TTI_DETAIL_STATIC_MEM_DATA_HPP
@@ -0,0 +1,103 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_STATIC_MEM_FUN_HPP)
#define BOOST_TTI_DETAIL_STATIC_MEM_FUN_HPP
#include <boost/function_types/is_function.hpp>
#include <boost/function_types/property_tags.hpp>
#include <boost/mpl/and.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/dnullptr.hpp>
#include <boost/tti/detail/dtfunction.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#include <boost/type_traits/is_class.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/type_traits/detail/yes_no_type.hpp>
#if defined(__SUNPRO_CC)
#define BOOST_TTI_DETAIL_TRAIT_IMPL_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_ihsmf) \
{ \
template<BOOST_TTI_DETAIL_TP_TYPE *> \
struct helper {}; \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_U::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<sizeof(chkt<BOOST_TTI_DETAIL_TP_T>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
/**/
#else
#define BOOST_TTI_DETAIL_TRAIT_IMPL_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_TYPE> \
struct BOOST_PP_CAT(trait,_detail_ihsmf) \
{ \
template<BOOST_TTI_DETAIL_TP_TYPE *> \
struct helper; \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::yes_type chkt(helper<&BOOST_TTI_DETAIL_TP_U::name> *); \
\
template<class BOOST_TTI_DETAIL_TP_U> \
static ::boost::type_traits::no_type chkt(...); \
\
typedef boost::mpl::bool_<sizeof(chkt<BOOST_TTI_DETAIL_TP_T>(BOOST_TTI_DETAIL_NULLPTR))==sizeof(::boost::type_traits::yes_type)> type; \
}; \
/**/
#endif
#define BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_FUNCTION_OP(trait,name) \
BOOST_TTI_DETAIL_TRAIT_IMPL_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_FS,class BOOST_TTI_DETAIL_TP_TAG> \
struct BOOST_PP_CAT(trait,_detail_hsmf_op) : \
BOOST_PP_CAT(trait,_detail_ihsmf) \
< \
BOOST_TTI_DETAIL_TP_T, \
typename \
boost::mpl::eval_if \
< \
boost::mpl::and_ \
< \
boost::function_types::is_function<BOOST_TTI_DETAIL_TP_R>, \
boost::is_same<BOOST_TTI_DETAIL_TP_FS,boost::mpl::vector<> >, \
boost::is_same<BOOST_TTI_DETAIL_TP_TAG,boost::function_types::null_tag> \
>, \
boost::mpl::identity<BOOST_TTI_DETAIL_TP_R>, \
BOOST_TTI_NAMESPACE::detail::tfunction_seq<BOOST_TTI_DETAIL_TP_R,BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_TAG> \
>::type \
> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_FUNCTION_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_R,class BOOST_TTI_DETAIL_TP_FS,class BOOST_TTI_DETAIL_TP_TAG> \
struct BOOST_PP_CAT(trait,_detail_hsmf) : \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_hsmf_op)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_R,BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_TAG>, \
boost::mpl::false_ \
> \
{ \
}; \
/**/
#endif // BOOST_TTI_DETAIL_STATIC_MEM_FUN_HPP
@@ -0,0 +1,34 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_TCLASS_HPP)
#define BOOST_TTI_DETAIL_TCLASS_HPP
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/type_traits/is_class.hpp>
namespace boost
{
namespace tti
{
namespace detail
{
template <class BOOST_TTI_DETAIL_TP_T>
struct tclass :
boost::mpl::eval_if
<
boost::is_class<BOOST_TTI_DETAIL_TP_T>,
BOOST_TTI_DETAIL_TP_T,
boost::mpl::identity<BOOST_TTI_DETAIL_TP_T>
>
{
};
}
}
}
#endif // BOOST_TTI_DETAIL_TCLASS_HPP
@@ -0,0 +1,67 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_TEMPLATE_HPP)
#define BOOST_TTI_DETAIL_TEMPLATE_HPP
#include <boost/config.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/has_xxx.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/debug/assert.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>
#include <boost/type_traits/is_class.hpp>
#define BOOST_TTI_DETAIL_IS_HELPER_BOOST_PP_NIL
#define BOOST_TTI_DETAIL_IS_NIL(param) \
BOOST_PP_IS_EMPTY \
( \
BOOST_PP_CAT(BOOST_TTI_DETAIL_IS_HELPER_,param) \
) \
/**/
#define BOOST_TTI_DETAIL_TRAIT_ASSERT_NOT_NIL(trait,name,params) \
BOOST_PP_ASSERT_MSG(0, "The parameter must be BOOST_PP_NIL") \
/**/
#define BOOST_TTI_DETAIL_TRAIT_CHECK_IS_NIL(trait,name,params) \
BOOST_PP_IIF \
( \
BOOST_TTI_DETAIL_IS_NIL(params), \
BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE, \
BOOST_TTI_DETAIL_TRAIT_ASSERT_NOT_NIL \
) \
(trait,name,params) \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_THT(trait,name) \
BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF(BOOST_PP_CAT(trait,_detail_mpl), name, false) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_tht) : \
BOOST_PP_CAT(trait,_detail_mpl)<BOOST_TTI_DETAIL_TP_T> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE(trait,name,params) \
BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_THT(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct trait \
{ \
typedef typename \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_tht)<BOOST_TTI_DETAIL_TP_T>, \
boost::mpl::false_ \
>::type type; \
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
#endif // !BOOST_TTI_DETAIL_TEMPLATE_HPP
@@ -0,0 +1,239 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_TEMPLATE_PARAMS_HPP)
#define BOOST_TTI_DETAIL_TEMPLATE_PARAMS_HPP
#include <boost/config.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/has_xxx.hpp>
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/arithmetic/sub.hpp>
#include <boost/preprocessor/array/elem.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/array/enum.hpp>
#include <boost/preprocessor/array/size.hpp>
#include <boost/type_traits/is_class.hpp>
#if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
#define BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS(z,n,args) \
BOOST_PP_ARRAY_ELEM(BOOST_PP_ADD(4,n),args) \
/**/
#define BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION(args,introspect_macro) \
template \
< \
typename BOOST_TTI_DETAIL_TP_T, \
typename BOOST_TTI_DETAIL_TP_FALLBACK_ \
= boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \
> \
struct BOOST_PP_ARRAY_ELEM(0, args) \
{ \
private: \
introspect_macro(args) \
public: \
static const bool value \
= BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< BOOST_TTI_DETAIL_TP_T >::value; \
typedef typename BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
< \
BOOST_TTI_DETAIL_TP_T \
>::type type; \
}; \
/**/
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#define BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE(z,n,args) \
template \
< \
template \
< \
BOOST_PP_ENUM_ ## z \
( \
BOOST_PP_SUB \
( \
BOOST_PP_ARRAY_SIZE(args), \
4 \
), \
BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS, \
args \
) \
> \
class BOOST_TTI_DETAIL_TM_V \
> \
struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE(args) \
BOOST_PP_REPEAT \
( \
BOOST_PP_ARRAY_ELEM(2, args), \
BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE, \
args \
) \
/**/
#define BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT(args) \
template< typename U > \
struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
{ \
BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE(args) \
BOOST_MPL_HAS_MEMBER_REJECT(args, BOOST_PP_NIL) \
BOOST_MPL_HAS_MEMBER_ACCEPT(args, BOOST_PP_NIL) \
BOOST_STATIC_CONSTANT \
( \
bool, value = BOOST_MPL_HAS_MEMBER_TEST(args) \
); \
typedef boost::mpl::bool_< value > type; \
}; \
/**/
#define BOOST_TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE(args) \
BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION \
( \
args, \
BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT \
) \
/**/
#else // !!BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#define BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE(z,n,args) \
template \
< \
template \
< \
BOOST_PP_ENUM_ ## z \
( \
BOOST_PP_SUB \
( \
BOOST_PP_ARRAY_SIZE(args), \
4 \
), \
BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS, \
args \
) \
> \
class BOOST_TTI_DETAIL_TM_U \
> \
struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE \
( \
args, \
n \
) \
{ \
typedef \
BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \
type; \
}; \
/**/
#define BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE(args) \
typedef void \
BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \
BOOST_PP_REPEAT \
( \
BOOST_PP_ARRAY_ELEM(2, args), \
BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE, \
args \
) \
/**/
#define BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE(args) \
BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE(args,BOOST_PP_NIL) \
BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE(args,BOOST_PP_NIL) \
template< typename BOOST_TTI_DETAIL_TP_U > \
struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
: BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< BOOST_TTI_DETAIL_TP_U > { \
}; \
/**/
#define BOOST_TTI_DETAIL_HAS_MEMBER_WITH_TEMPLATE_SFINAE(args) \
BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE \
( \
args \
) \
BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION \
( \
args, \
BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE \
) \
/**/
#endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#else // defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
#define BOOST_TTI_DETAIL_SAME(trait,name) \
BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF \
( \
trait, \
name, \
false \
) \
/**/
#define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tp) \
BOOST_TTI_DETAIL_SAME(trait,name) \
/**/
#endif // !BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE
#define BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS_OP(trait,name,tpArray) \
BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(BOOST_PP_CAT(trait,_detail),name,tpArray) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_cp_op) : \
BOOST_PP_CAT(trait,_detail)<BOOST_TTI_DETAIL_TP_T> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS_OP(trait,name,tpArray) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct trait \
{ \
typedef typename \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_cp_op)<BOOST_TTI_DETAIL_TP_T>, \
boost::mpl::false_ \
>::type type; \
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
#if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
BOOST_TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE \
( \
( BOOST_PP_ADD(BOOST_PP_ARRAY_SIZE(tpArray),4), ( trait, name, 1, false, BOOST_PP_ARRAY_ENUM(tpArray) ) ) \
) \
/**/
#else // BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
BOOST_TTI_DETAIL_HAS_MEMBER_WITH_TEMPLATE_SFINAE \
( \
( BOOST_PP_ADD(BOOST_PP_ARRAY_SIZE(tpArray),4), ( trait, name, 1, false, BOOST_PP_ARRAY_ENUM(tpArray) ) ) \
) \
/**/
#endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#endif // !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
#endif // BOOST_TTI_DETAIL_TEMPLATE_PARAMS_HPP
@@ -0,0 +1,35 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_TFUNCTION_HPP)
#define BOOST_TTI_DETAIL_TFUNCTION_HPP
#include <boost/config.hpp>
#include <boost/mpl/push_front.hpp>
#include <boost/function_types/function_type.hpp>
namespace boost
{
namespace tti
{
namespace detail
{
template
<
class BOOST_TTI_DETAIL_TP_R,
class BOOST_TTI_DETAIL_TP_FS,
class BOOST_TTI_DETAIL_TP_TAG
>
struct tfunction_seq
{
typedef typename boost::mpl::push_front<BOOST_TTI_DETAIL_TP_FS,BOOST_TTI_DETAIL_TP_R>::type ftseq;
typedef typename boost::function_types::function_type<ftseq,BOOST_TTI_DETAIL_TP_TAG>::type type;
};
}
}
}
#endif // BOOST_TTI_DETAIL_TFUNCTION_HPP
@@ -0,0 +1,80 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_TYPE_HPP)
#define BOOST_TTI_DETAIL_TYPE_HPP
#include <boost/config.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/has_xxx.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/ddeftype.hpp>
#include <boost/tti/detail/dlambda.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#include <boost/type_traits/is_class.hpp>
#define BOOST_TTI_DETAIL_TRAIT_INVOKE_HAS_TYPE(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_MFC> \
struct BOOST_PP_CAT(trait,_detail_type_invoke) : \
boost::mpl::apply<BOOST_TTI_DETAIL_TP_MFC,typename BOOST_TTI_DETAIL_TP_T::name> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_OP_CHOOSE(trait,name) \
BOOST_MPL_HAS_XXX_TRAIT_NAMED_DEF(BOOST_PP_CAT(trait,_detail_type_mpl), name, false) \
BOOST_TTI_DETAIL_TRAIT_INVOKE_HAS_TYPE(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_U,class BOOST_TTI_DETAIL_TP_B> \
struct BOOST_PP_CAT(trait,_detail_type_op_choose) \
{ \
BOOST_MPL_ASSERT((BOOST_TTI_NAMESPACE::detail::is_lambda_expression<BOOST_TTI_DETAIL_TP_U>)); \
typedef typename BOOST_PP_CAT(trait,_detail_type_invoke)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_U>::type type; \
}; \
\
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_U> \
struct BOOST_PP_CAT(trait,_detail_type_op_choose)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_U,boost::mpl::false_::type> : \
boost::mpl::false_ \
{ \
}; \
\
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_type_op_choose)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_NAMESPACE::detail::deftype,boost::mpl::true_::type> : \
boost::mpl::true_ \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_OP(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_OP_CHOOSE(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_U> \
struct BOOST_PP_CAT(trait,_detail_type_op) : \
BOOST_PP_CAT(trait,_detail_type_op_choose) \
< \
BOOST_TTI_DETAIL_TP_T, \
BOOST_TTI_DETAIL_TP_U, \
typename BOOST_PP_CAT(trait,_detail_type_mpl)<BOOST_TTI_DETAIL_TP_T>::type \
> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_TRAIT_HAS_TYPE(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_OP(trait,name) \
template<class BOOST_TTI_DETAIL_TP_T,class BOOST_TTI_DETAIL_TP_U> \
struct BOOST_PP_CAT(trait,_detail_type) : \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_type_op)<BOOST_TTI_DETAIL_TP_T,BOOST_TTI_DETAIL_TP_U>, \
boost::mpl::false_ \
> \
{ \
}; \
/**/
#endif // BOOST_TTI_DETAIL_TYPE_HPP
@@ -0,0 +1,164 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DETAIL_VM_TEMPLATE_PARAMS_HPP)
#define BOOST_TTI_DETAIL_VM_TEMPLATE_PARAMS_HPP
#include <boost/config.hpp>
#include <boost/preprocessor/config/config.hpp>
#if BOOST_PP_VARIADICS
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/has_xxx.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/preprocessor/arithmetic/add.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/control/iif.hpp>
#include <boost/preprocessor/detail/is_binary.hpp>
#include <boost/preprocessor/facilities/is_empty.hpp>
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/seq.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#include <boost/tti/detail/dtemplate.hpp>
#include <boost/tti/detail/dtemplate_params.hpp>
#include <boost/type_traits/is_class.hpp>
#if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#define BOOST_TTI_DETAIL_VM_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
BOOST_TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE \
( \
( BOOST_PP_ADD(BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),4), ( trait, name, 1, false, __VA_ARGS__ ) ) \
) \
/**/
#else // !!BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
#define BOOST_TTI_DETAIL_VM_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
BOOST_TTI_DETAIL_HAS_MEMBER_WITH_TEMPLATE_SFINAE \
( \
( BOOST_PP_ADD(BOOST_PP_VARIADIC_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)
#define BOOST_TTI_DETAIL_VM_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
BOOST_TTI_DETAIL_SAME(trait,name) \
/**/
#endif // !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
#define BOOST_TTI_DETAIL_VM_CHECK_MORE_THAN_TWO(trait,...) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL \
( \
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \
2 \
), \
BOOST_TTI_DETAIL_VM_TRAIT_CHOOSE_FROM_TWO, \
BOOST_TTI_DETAIL_VM_TRAIT_EXPAND_ARGUMENTS \
) \
(trait,__VA_ARGS__) \
/**/
#define BOOST_TTI_DETAIL_VM_TRAIT_CHOOSE_FROM_TWO(trait,...) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BINARY \
( \
BOOST_PP_VARIADIC_ELEM(1,__VA_ARGS__) \
), \
BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS, \
BOOST_TTI_DETAIL_VM_TRAIT_CHOOSE_IF_NIL \
) \
( \
trait, \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_PP_VARIADIC_ELEM(1,__VA_ARGS__) \
) \
/**/
#define BOOST_TTI_DETAIL_VM_IS_NIL(param) \
BOOST_PP_IS_EMPTY \
( \
BOOST_PP_CAT(BOOST_TTI_DETAIL_IS_HELPER_,param) \
) \
/**/
#define BOOST_TTI_DETAIL_VM_TRAIT_CHOOSE_IF_NIL(trait,name,param) \
BOOST_PP_IIF \
( \
BOOST_TTI_DETAIL_VM_IS_NIL(param), \
BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE, \
BOOST_TTI_DETAIL_VM_CALL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS \
) \
(trait,name,param) \
/**/
#define BOOST_TTI_DETAIL_VM_VARIADIC_TAIL(...) \
BOOST_PP_SEQ_ENUM \
( \
BOOST_PP_SEQ_TAIL \
( \
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
) \
) \
/**/
#define BOOST_TTI_DETAIL_VM_TRAIT_EXPAND_ARGUMENTS(trait,...) \
BOOST_TTI_DETAIL_VM_CALL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS \
( \
trait, \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_TTI_DETAIL_VM_VARIADIC_TAIL(__VA_ARGS__) \
) \
/**/
#define BOOST_TTI_DETAIL_VM_TRAIT_HAS_TEMPLATE(trait,...) \
BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE \
( \
trait, \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \
BOOST_PP_NIL \
) \
/**/
#define BOOST_TTI_DETAIL_VM_CT_INVOKE(trait,name,...) \
BOOST_TTI_DETAIL_VM_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(BOOST_PP_CAT(trait,_detail),name,__VA_ARGS__) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct BOOST_PP_CAT(trait,_detail_vm_ct_invoke) : \
BOOST_PP_CAT(trait,_detail)<BOOST_TTI_DETAIL_TP_T> \
{ \
}; \
/**/
#define BOOST_TTI_DETAIL_VM_CALL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,...) \
BOOST_TTI_DETAIL_VM_CT_INVOKE(trait,name,__VA_ARGS__) \
template<class BOOST_TTI_DETAIL_TP_T> \
struct trait \
{ \
typedef typename \
boost::mpl::eval_if \
< \
boost::is_class<BOOST_TTI_DETAIL_TP_T>, \
BOOST_PP_CAT(trait,_detail_vm_ct_invoke)<BOOST_TTI_DETAIL_TP_T>, \
boost::mpl::false_ \
>::type type; \
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
#endif // BOOST_PP_VARIADICS
#endif // BOOST_TTI_DETAIL_VM_TEMPLATE_PARAMS_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_DATA_GEN_HPP)
#define BOOST_TTI_DATA_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_DATA.
/**
name = the name of the member data.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_DATA_GEN(name) \
BOOST_PP_CAT(has_data_,name) \
/**/
#endif // BOOST_TTI_DATA_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_FUNCTION_GEN_HPP)
#define BOOST_TTI_FUNCTION_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_FUNCTION.
/**
name = the name of the static member function.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_FUNCTION_GEN(name) \
BOOST_PP_CAT(has_function_,name) \
/**/
#endif // BOOST_TTI_FUNCTION_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_MEMBER_DATA_GEN_HPP)
#define BOOST_TTI_MEMBER_DATA_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_MEMBER_DATA.
/**
name = the name of the member data.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_MEMBER_DATA_GEN(name) \
BOOST_PP_CAT(has_member_data_,name) \
/**/
#endif // BOOST_TTI_MEMBER_DATA_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_MEMBER_FUNCTION_GEN_HPP)
#define BOOST_TTI_MEMBER_FUNCTION_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_MEMBER_FUNCTION.
/**
name = the name of the member function.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_MEMBER_FUNCTION_GEN(name) \
BOOST_PP_CAT(has_member_function_,name) \
/**/
#endif // BOOST_TTI_MEMBER_FUNCTION_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_STATIC_MEMBER_DATA_GEN_HPP)
#define BOOST_TTI_STATIC_MEMBER_DATA_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_STATIC_MEMBER_DATA.
/**
name = the name of the static member data.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_STATIC_MEMBER_DATA_GEN(name) \
BOOST_PP_CAT(has_static_member_data_,name) \
/**/
#endif // BOOST_TTI_STATIC_MEMBER_DATA_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_STATIC_MEMBER_FUNCTION_GEN_HPP)
#define BOOST_TTI_STATIC_MEMBER_FUNCTION_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION.
/**
name = the name of the static member function.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_GEN(name) \
BOOST_PP_CAT(has_static_member_function_,name) \
/**/
#endif // BOOST_TTI_STATIC_MEMBER_FUNCTION_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_TEMPLATE_GEN_HPP)
#define BOOST_TTI_TEMPLATE_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_TEMPLATE.
/**
name = the name of the class template.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_TEMPLATE_GEN(name) \
BOOST_PP_CAT(has_template_,name) \
/**/
#endif // BOOST_TTI_TEMPLATE_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_TYPE_GEN_HPP)
#define BOOST_TTI_TYPE_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_HAS_TYPE.
/**
name = the name of the type.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_HAS_TYPE_GEN(name) \
BOOST_PP_CAT(has_type_,name) \
/**/
#endif // BOOST_TTI_TYPE_GEN_HPP
@@ -0,0 +1,31 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_MEMBER_TYPE_GEN_HPP)
#define BOOST_TTI_MEMBER_TYPE_GEN_HPP
#include <boost/preprocessor/cat.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the macro metafunction name for BOOST_TTI_MEMBER_TYPE.
/**
name = the name of the inner type.
returns = the generated macro metafunction name.
*/
#define BOOST_TTI_MEMBER_TYPE_GEN(name) \
BOOST_PP_CAT(member_type_,name) \
/**/
#endif // BOOST_TTI_MEMBER_TYPE_GEN_HPP
@@ -0,0 +1,25 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_NAMESPACE_GEN_HPP)
#define BOOST_TTI_NAMESPACE_GEN_HPP
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Generates the name of the Boost TTI namespace
/**
returns = the generated name of the Boost TTI namespace.
*/
#define BOOST_TTI_NAMESPACE boost::tti
#endif // BOOST_TTI_NAMESPACE_GEN_HPP
@@ -0,0 +1,98 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_HAS_DATA_HPP)
#define BOOST_TTI_HAS_DATA_HPP
#include <boost/config.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/type_traits/remove_const.hpp>
#include <boost/tti/gen/has_data_gen.hpp>
#include <boost/tti/detail/ddata.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Expands to a metafunction which tests whether member data or static member with a particular name and type exists.
/**
trait = the name of the metafunction.
name = the name of the inner member to introspect.
generates a metafunction called "trait" where 'trait' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_TYPE>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'
BOOST_TTI_TP_TYPE = The type of the member data or static member.
returns = 'value' is true if the 'name' exists, with the correct data type,
otherwise 'value' is false.
*/
#define BOOST_TTI_TRAIT_HAS_DATA(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_DATA(trait,name) \
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_TYPE> \
struct trait \
{ \
typedef typename \
BOOST_PP_CAT(trait,_detail_hd) \
< \
typename boost::remove_const<BOOST_TTI_TP_T>::type, \
BOOST_TTI_TP_TYPE \
>::type type; \
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
/// Expands to a metafunction which tests whether member data or static member data with a particular name and type exists.
/**
name = the name of the inner member.
generates a metafunction called "has_data_name" where 'name' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_TYPE>
struct has_data_name
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'
BOOST_TTI_TP_TYPE = The type of the member data or static member.
returns = 'value' is true if the 'name' exists, with the correct data type,
otherwise 'value' is false.
*/
#define BOOST_TTI_HAS_DATA(name) \
BOOST_TTI_TRAIT_HAS_DATA \
( \
BOOST_TTI_HAS_DATA_GEN(name), \
name \
) \
/**/
#endif // BOOST_TTI_HAS_DATA_HPP
@@ -0,0 +1,109 @@
// (C) Copyright Edward Diener 2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_HAS_FUNCTION_HPP)
#define BOOST_TTI_HAS_FUNCTION_HPP
#include <boost/config.hpp>
#include <boost/function_types/property_tags.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/dfunction.hpp>
#include <boost/tti/gen/has_function_gen.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Expands to a metafunction which tests whether a member function or a static member function with a particular name and signature exists.
/**
trait = the name of the metafunction within the tti namespace.
name = the name of the inner member.
generates a metafunction called "trait" where 'trait' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS,class BOOST_TTI_TP_TAG>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
BOOST_TTI_TP_R = the return type of the function
BOOST_TTI_TP_FS = (optional) the parameters of the function as a boost::mpl forward sequence
if function parameters are not empty.
BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the function
if the need for a tag exists.
returns = 'value' is true if the 'name' exists,
with the appropriate static member function type,
otherwise 'value' is false.
*/
#define BOOST_TTI_TRAIT_HAS_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_FUNCTION(trait,name) \
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS = boost::mpl::vector<>,class BOOST_TTI_TP_TAG = boost::function_types::null_tag> \
struct trait \
{ \
typedef typename \
BOOST_PP_CAT(trait,_detail_hf)<BOOST_TTI_TP_T,BOOST_TTI_TP_R,BOOST_TTI_TP_FS,BOOST_TTI_TP_TAG>::type type; \
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
/// Expands to a metafunction which tests whether a member function or a static member function with a particular name and signature exists.
/**
name = the name of the inner member.
generates a metafunction called "has_function_name" where 'name' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS,class BOOST_TTI_TP_TAG>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
BOOST_TTI_TP_R = the return type of the function
BOOST_TTI_TP_FS = (optional) the parameters of the function as a boost::mpl forward sequence
if function parameters are not empty.
BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the function
if the need for a tag exists.
returns = 'value' is true if the 'name' exists,
with the appropriate function type,
otherwise 'value' is false.
*/
#define BOOST_TTI_HAS_FUNCTION(name) \
BOOST_TTI_TRAIT_HAS_FUNCTION \
( \
BOOST_TTI_HAS_FUNCTION_GEN(name), \
name \
) \
/**/
#endif // BOOST_TTI_HAS_FUNCTION_HPP
@@ -0,0 +1,106 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_HAS_MEMBER_DATA_HPP)
#define BOOST_TTI_HAS_MEMBER_DATA_HPP
#include <boost/config.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/ddeftype.hpp>
#include <boost/tti/detail/dmem_data.hpp>
#include <boost/tti/gen/has_member_data_gen.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Expands to a metafunction which tests whether a member data with a particular name and type exists.
/**
trait = the name of the metafunction.
name = the name of the inner member to introspect.
generates a metafunction called "trait" where 'trait' is the macro parameter.
template<class BOOST_TTI_TP_ET,class BOOST_TTI_TP_TYPE>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_ET = the enclosing type in which to look for our 'name'
OR
The type of the member data in the form of a pointer
to member data.
BOOST_TTI_TP_TYPE = (optional) The type of the member data if the first
parameter is the enclosing type.
returns = 'value' is true if the 'name' exists, with the correct data type,
otherwise 'value' is false.
*/
#define BOOST_TTI_TRAIT_HAS_MEMBER_DATA(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_DATA(trait,name) \
template<class BOOST_TTI_TP_ET,class BOOST_TTI_TP_TYPE = BOOST_TTI_NAMESPACE::detail::deftype> \
struct trait \
{ \
typedef typename \
BOOST_PP_CAT(trait,_detail_hmd) \
< \
BOOST_TTI_TP_ET, \
BOOST_TTI_TP_TYPE \
>::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.
/**
name = the name of the inner member.
generates a metafunction called "has_member_data_name" where 'name' is the macro parameter.
template<class BOOST_TTI_TP_ET,class BOOST_TTI_TP_TYPE>
struct has_member_data_name
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_ET = the enclosing type in which to look for our 'name'
OR
The type of the member data in the form of a pointer
to member data.
BOOST_TTI_TP_TYPE = (optional) The type of the member data if the first
parameter is the enclosing type.
returns = 'value' is true if the 'name' exists, with the correct data type,
otherwise 'value' is false.
*/
#define BOOST_TTI_HAS_MEMBER_DATA(name) \
BOOST_TTI_TRAIT_HAS_MEMBER_DATA \
( \
BOOST_TTI_HAS_MEMBER_DATA_GEN(name), \
name \
) \
/**/
#endif // BOOST_TTI_HAS_MEMBER_DATA_HPP
@@ -0,0 +1,119 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_HAS_MEMBER_FUNCTION_HPP)
#define BOOST_TTI_HAS_MEMBER_FUNCTION_HPP
#include <boost/config.hpp>
#include <boost/function_types/property_tags.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/ddeftype.hpp>
#include <boost/tti/detail/dmem_fun.hpp>
#include <boost/tti/gen/has_member_function_gen.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Expands to a metafunction which tests whether a member function with a particular name and signature exists.
/**
trait = the name of the metafunction within the tti namespace.
name = the name of the inner member.
generates a metafunction called "trait" where 'trait' is the macro parameter.<br />
template<class BOOST_TTI_TP_T,class BOOST_TTI_R,class BOOST_TTI_FS,class BOOST_TTI_TAG>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'
OR
a pointer to member function as a single type.
BOOST_TTI_TP_R = (optional) the return type of the member function
if the first parameter is the enclosing type.
BOOST_TTI_TP_FS = (optional) the parameters of the member function as a boost::mpl forward sequence
if the first parameter is the enclosing type and the member function parameters
are not empty.
BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the member function
if the first parameter is the enclosing type and a tag is needed.
returns = 'value' is true if the 'name' exists,
with the appropriate member function type,
otherwise 'value' is false.
*/
#define BOOST_TTI_TRAIT_HAS_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R = BOOST_TTI_NAMESPACE::detail::deftype,class BOOST_TTI_TP_FS = boost::mpl::vector<>,class BOOST_TTI_TP_TAG = boost::function_types::null_tag> \
struct trait \
{ \
typedef typename \
BOOST_PP_CAT(trait,_detail_hmf)<BOOST_TTI_TP_T,BOOST_TTI_TP_R,BOOST_TTI_TP_FS,BOOST_TTI_TP_TAG>::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.
/**
name = the name of the inner member.
generates a metafunction called "has_member_function_name" where 'name' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS,class BOOST_TTI_TP_TAG>
struct has_member_function_name
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'
OR
a pointer to member function as a single type.
BOOST_TTI_TP_R = (optional) the return type of the member function
if the first parameter is the enclosing type.
BOOST_TTI_TP_FS = (optional) the parameters of the member function as a boost::mpl forward sequence
if the first parameter is the enclosing type and the member function parameters
are not empty.
BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the member function
if the first parameter is the enclosing type and a tag is needed.
returns = 'value' is true if the 'name' exists,
with the appropriate member function type,
otherwise 'value' is false.
*/
#define BOOST_TTI_HAS_MEMBER_FUNCTION(name) \
BOOST_TTI_TRAIT_HAS_MEMBER_FUNCTION \
( \
BOOST_TTI_HAS_MEMBER_FUNCTION_GEN(name), \
name \
) \
/**/
#endif // BOOST_TTI_HAS_MEMBER_FUNCTION_HPP
@@ -0,0 +1,87 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_HAS_STATIC_MEMBER_DATA_HPP)
#define BOOST_TTI_HAS_STATIC_MEMBER_DATA_HPP
#include <boost/config.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/gen/has_static_member_data_gen.hpp>
#include <boost/tti/detail/dstatic_mem_data.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Expands to a metafunction which tests whether a static member data with a particular name and type exists.
/**
trait = the name of the metafunction within the tti namespace.
name = the name of the inner member.
generates a metafunction called "trait" where 'trait' is the macro parameter.
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type.
BOOST_TTI_TP_TYPE = the static member data type,
in the form of a data type,
in which to look for our 'name'.
returns = 'value' is true if the 'name' exists,
with the BOOST_TTI_TP_TYPE type,
within the enclosing BOOST_TTI_TP_T type,
otherwise 'value' is false.
*/
#define BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_DATA(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_DATA(trait,name) \
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_TYPE> \
struct trait \
{ \
typedef typename \
BOOST_PP_CAT(trait,_detail_hsd)<BOOST_TTI_TP_T,BOOST_TTI_TP_TYPE>::type type; \
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
/// Expands to a metafunction which tests whether a static member data with a particular name and type exists.
/**
name = the name of the inner member.
generates a metafunction called "has_static_member_data_name" where 'name' is the macro parameter.
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type.
BOOST_TTI_TP_TYPE = the static member data type,
in the form of a data type,
in which to look for our 'name'.
returns = 'value' is true if the 'name' exists,
with the appropriate BOOST_TTI_TP_TYPE type,
within the enclosing BOOST_TTI_TP_T type,
otherwise 'value' is false.
*/
#define BOOST_TTI_HAS_STATIC_MEMBER_DATA(name) \
BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_DATA \
( \
BOOST_TTI_HAS_STATIC_MEMBER_DATA_GEN(name), \
name \
) \
/**/
#endif // BOOST_TTI_HAS_STATIC_MEMBER_DATA_HPP
@@ -0,0 +1,113 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_HPP)
#define BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_HPP
#include <boost/config.hpp>
#include <boost/function_types/property_tags.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/detail/dstatic_mem_fun.hpp>
#include <boost/tti/gen/has_static_member_function_gen.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Expands to a metafunction which tests whether a static member function with a particular name and signature exists.
/**
trait = the name of the metafunction within the tti namespace.
name = the name of the inner member.
generates a metafunction called "trait" where 'trait' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS,class BOOST_TTI_TP_TAG>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
BOOST_TTI_TP_R = the return type of the static member function
OR
the signature of a function in the form of Return_Type ( Parameter_Types )
BOOST_TTI_TP_FS = (optional) the parameters of the static member function as a boost::mpl forward sequence
if the second parameter is a return type and the function parameters exist.
BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the static member function
if the second parameter is a return type and the need for a tag exists.
returns = 'value' is true if the 'name' exists,
with the appropriate static member function type,
otherwise 'value' is false.
*/
#define BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_STATIC_MEMBER_FUNCTION(trait,name) \
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS = boost::mpl::vector<>,class BOOST_TTI_TP_TAG = boost::function_types::null_tag> \
struct trait \
{ \
typedef typename \
BOOST_PP_CAT(trait,_detail_hsmf)<BOOST_TTI_TP_T,BOOST_TTI_TP_R,BOOST_TTI_TP_FS,BOOST_TTI_TP_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.
/**
name = the name of the inner member.
generates a metafunction called "has_static_member_function_name" where 'name' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_R,class BOOST_TTI_TP_FS,class BOOST_TTI_TP_TAG>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
BOOST_TTI_TP_R = the return type of the static member function
OR
the signature of a function in the form of Return_Type ( Parameter_Types )
BOOST_TTI_TP_FS = (optional) the parameters of the static member function as a boost::mpl forward sequence
if the second parameter is a return type and the function parameters exist.
BOOST_TTI_TP_TAG = (optional) a boost::function_types tag to apply to the static member function
if the second parameter is a return type and the need for a tag exists.
returns = 'value' is true if the 'name' exists,
with the appropriate static member function type,
otherwise 'value' is false.
*/
#define BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION(name) \
BOOST_TTI_TRAIT_HAS_STATIC_MEMBER_FUNCTION \
( \
BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_GEN(name), \
name \
) \
/**/
#endif // BOOST_TTI_HAS_STATIC_MEMBER_FUNCTION_HPP
@@ -0,0 +1,348 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
#if !defined(BOOST_TTI_HAS_TEMPLATE_HPP)
#define BOOST_TTI_HAS_TEMPLATE_HPP
#include <boost/config.hpp>
#include <boost/tti/gen/has_template_gen.hpp>
#include <boost/preprocessor/config/config.hpp>
#include <boost/preprocessor/control/iif.hpp>
#if BOOST_PP_VARIADICS
#include <boost/preprocessor/comparison/equal.hpp>
#include <boost/preprocessor/variadic/elem.hpp>
#include <boost/preprocessor/variadic/size.hpp>
#include <boost/tti/detail/dvm_template_params.hpp>
/// Expands to a metafunction which tests whether an inner class template with a particular name exists.
/**
trait = the name of the metafunction.
... = variadic parameters.
The first variadic parameter is the inner class template name.
Following variadic parameters are optional.
If no following variadic parameters exist, then the inner class template
being introspected must be all template type parameters ( template parameters
starting with `class` or `typename` ) and any number of template type parameters
can occur.
If the second variadic parameter is BOOST_PP_NIL and no other variadic
parameter is given, then just as in the previous case the inner class template
being introspected must be all template type parameters ( template parameters
starting with `class` or `typename` ) and any number of template type parameters
can occur. This form is allowed in order to be consistent with using the
non-variadic form of this macro.
If the second variadic parameter is a Boost preprocessor library array and no other
variadic parameter is given, then the inner class template must have its template
parameters matching the sequence in the tuple portion of the Boost PP array. This
form is allowed in order to be consistent with using the non-variadic form of this
macro.
Otherwise the inner class template must have its template parameters matching the
sequence of the optional variadic parameters.
generates a metafunction called "trait" where 'trait' is the first macro parameter.
template<class BOOST_TTI_TP_T>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
returns = 'value' is true if the 'name' template exists within the enclosing type,
otherwise 'value' is false.
Examples:
1) Search for an inner class template called 'MyTemplate', with all template type parameters,
nested within the class 'MyClass' using a metafunction name of 'MyMeta'.
BOOST_TTI_TRAIT_HAS_TEMPLATE(MyMeta,MyTemplate)
or
BOOST_TTI_TRAIT_HAS_TEMPLATE(MyMeta,MyTemplate,BOOST_PP_NIL) // Non-variadic macro form
MyMeta<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
2) Search for an inner class template called 'MyTemplate', with template parameters
of 'class T,int x,template<class> class U', nested within the class 'MyClass'
using a metafunction name of 'MyMeta'.
BOOST_TTI_TRAIT_HAS_TEMPLATE(MyMeta,MyTemplate,class,int,template<class> class)
or
BOOST_TTI_TRAIT_HAS_TEMPLATE(MyMeta,MyTemplate,(3,(class,int,template<class> class))) // Non-variadic macro form
MyMeta<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
*/
#define BOOST_TTI_TRAIT_HAS_TEMPLATE(trait,...) \
BOOST_PP_IIF \
( \
BOOST_PP_EQUAL \
( \
BOOST_PP_VARIADIC_SIZE(__VA_ARGS__), \
1 \
), \
BOOST_TTI_DETAIL_VM_TRAIT_HAS_TEMPLATE, \
BOOST_TTI_DETAIL_VM_CHECK_MORE_THAN_TWO \
) \
(trait,__VA_ARGS__) \
/**/
/// Expands to a metafunction which tests whether an inner class template with a particular name exists.
/**
... = variadic parameters.
The first variadic parameter is the inner class template name.
Following variadic parameters are optional.
If no following variadic parameters exist, then the inner class template
being introspected must be all template type parameters ( template parameters
starting with `class` or `typename` ) and any number of template type parameters
can occur.
If the second variadic parameter is BOOST_PP_NIL and no other variadic
parameter is given, then just as in the previous case the inner class template
being introspected must be all template type parameters ( template parameters
starting with `class` or `typename` ) and any number of template type parameters
can occur. This form is allowed in order to be consistent with using the
non-variadic form of this macro.
If the second variadic parameter is a Boost preprocessor library array and no other
variadic parameter is given, then the inner class template must have its template
parameters matching the sequence in the tuple portion of the Boost PP array. This
form is allowed in order to be consistent with using the non-variadic form of this
macro.
Otherwise the inner class template must have its template parameters matching the
sequence of the optional variadic parameters.
generates a metafunction called "has_template_'name'" where 'name' is the first variadic parameter.
template<class BOOST_TTI_TP_T>
struct has_template_'name'
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
returns = 'value' is true if the 'name' template exists within the enclosing type,
otherwise 'value' is false.
Examples:
1) Search for an inner class template called 'MyTemplate', with all template type parameters,
nested within the class 'MyClass'.
BOOST_TTI_HAS_TEMPLATE(MyTemplate)
or
BOOST_TTI_HAS_TEMPLATE(MyTemplate,BOOST_PP_NIL) // Non-variadic macro form
has_template_MyTemplate<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
2) Search for an inner class template called 'MyTemplate' with template parameters
of 'class T,int x,template<class> class U' nested within the class 'MyClass'.
BOOST_TTI_HAS_TEMPLATE(MyTemplate,class,int,template<class> class)
or
BOOST_TTI_HAS_TEMPLATE(MyTemplate,(3,(class,int,template<class> class))) // Non-variadic macro form
has_template_MyTemplate<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
*/
#define BOOST_TTI_HAS_TEMPLATE(...) \
BOOST_TTI_TRAIT_HAS_TEMPLATE \
( \
BOOST_TTI_HAS_TEMPLATE_GEN \
( \
BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__) \
), \
__VA_ARGS__ \
) \
/**/
#else // !BOOST_PP_VARIADICS
#include <boost/preprocessor/detail/is_binary.hpp>
#include <boost/tti/detail/dtemplate.hpp>
#include <boost/tti/detail/dtemplate_params.hpp>
/// Expands to a metafunction which tests whether an inner class template with a particular name exists.
/**
trait = the name of the metafunction.
name = the inner class template name.
params = If the parameter is BOOST_PP_NIL the inner class template
being introspected must be all template type parameters ( template parameters
starting with `class` or `typename` ) and any number of template type parameters
can occur.
If the parameter is a Boost preprocessor library array, then the inner class
template must have its template parameters matching the sequence in the tuple portion
of the Boost PP array.
Otherwise a compiler error occurs.
generates a metafunction called "trait" where 'trait' is the first macro parameter.
template<class BOOST_TTI_TP_T>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
returns = 'value' is true if the 'name' template exists within the enclosing type,
otherwise 'value' is false.
Examples:
1) Search for an inner class template called 'MyTemplate', with all template type parameters,
nested within the class 'MyClass' using a metafunction name of 'MyMeta'.
BOOST_TTI_TRAIT_HAS_TEMPLATE(MyMeta,MyTemplate,BOOST_PP_NIL)
MyMeta<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
2) Search for an inner class template called 'MyTemplate', with template parameters
of 'class T,int x,template<class> class U', nested within the class 'MyClass'
using a metafunction name of 'MyMeta'.
BOOST_TTI_TRAIT_HAS_TEMPLATE(MyMeta,MyTemplate,(3,(class,int,template<class> class)))
MyMeta<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
*/
#define BOOST_TTI_TRAIT_HAS_TEMPLATE(trait,name,params) \
BOOST_PP_IIF \
( \
BOOST_PP_IS_BINARY(params), \
BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS, \
BOOST_TTI_DETAIL_TRAIT_CHECK_IS_NIL \
) \
(trait,name,params) \
/**/
/// Expands to a metafunction which tests whether an inner class template with a particular name exists.
/**
name = the inner class template name.
params = If the parameter is BOOST_PP_NIL the inner class template
being introspected must be all template type parameters ( template parameters
starting with `class` or `typename` ) and any number of template type parameters
can occur.
If the parameter is a Boost preprocessor library array, then the inner class
template must have its template parameters matching the sequence in the tuple portion
of the Boost PP array.
Otherwise a compiler error occurs.
generates a metafunction called "has_template_'name'" where 'name' is the first macro parameter.
template<class BOOST_TTI_TP_T>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
returns = 'value' is true if the 'name' template exists within the enclosing type,
otherwise 'value' is false.
Examples:
1) Search for an inner class template called 'MyTemplate', with all template type parameters,
nested within the class 'MyClass'.
BOOST_TTI_HAS_TEMPLATE(MyTemplate,BOOST_PP_NIL)
has_template_MyTemplate<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
2) Search for an inner class template called 'MyTemplate' with template parameters
of 'class T,int x,template<class> class U' nested within the class 'MyClass'.
BOOST_TTI_HAS_TEMPLATE(MyTemplate,(3,(class,int,template<class> class)))
has_template_MyTemplate<MyClass>::value
is a compile time boolean constant which is either 'true' or 'false'
if the nested template exists.
*/
#define BOOST_TTI_HAS_TEMPLATE(name,params) \
BOOST_TTI_TRAIT_HAS_TEMPLATE \
( \
BOOST_TTI_HAS_TEMPLATE_GEN(name), \
name, \
params \
) \
/**/
#endif // BOOST_PP_VARIADICS
#endif // BOOST_TTI_HAS_TEMPLATE_HPP
@@ -0,0 +1,165 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_HAS_TYPE_HPP)
#define BOOST_TTI_HAS_TYPE_HPP
#include <boost/config.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/gen/has_type_gen.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#include <boost/tti/detail/dtype.hpp>
#include <boost/tti/detail/ddeftype.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/**
BOOST_TTI_TRAIT_HAS_TYPE is a macro which expands to a metafunction.
The metafunction tests whether an inner type with a particular name exists
and, optionally, whether a lambda expression invoked with the inner type
is true or not.
trait = the name of the metafunction within the tti namespace.
name = the name of the inner type.
generates a metafunction called "trait" where 'trait' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_U>
struct trait
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
BOOST_TTI_TP_U = (optional) An optional template parameter, defaulting to a marker type.
If specified it is an MPL lambda expression which is invoked
with the inner type found and must return a constant boolean
value.
returns = 'value' depends on whether or not the optional BOOST_TTI_TP_U is specified.
If BOOST_TTI_TP_U is not specified, then 'value' is true if the 'name' type
exists within the enclosing type BOOST_TTI_TP_T; otherwise 'value' is false.
If BOOST_TTI_TP_U is specified , then 'value' is true if the 'name' type exists
within the enclosing type BOOST_TTI_TP_T and the lambda expression as specified
by BOOST_TTI_TP_U, invoked by passing the actual inner type of 'name', returns
a 'value' of true; otherwise 'value' is false.
The action taken with BOOST_TTI_TP_U occurs only when the 'name' type exists
within the enclosing type BOOST_TTI_TP_T.
Example usage:
BOOST_TTI_TRAIT_HAS_TYPE(LookFor,MyType) generates the metafunction LookFor in the current scope
to look for an inner type called MyType.
LookFor<EnclosingType>::value is true if MyType is an inner type of EnclosingType, otherwise false.
LookFor<EnclosingType,ALambdaExpression>::value is true if MyType is an inner type of EnclosingType
and invoking ALambdaExpression with the inner type returns a value of true, otherwise false.
A popular use of the optional MPL lambda expression is to check whether the type found is the same
as another type, when the type found is a typedef. In that case our example would be:
LookFor<EnclosingType,boost::is_same<_,SomeOtherType> >::value is true if MyType is an inner type
of EnclosingType and is the same type as SomeOtherType.
*/
#define BOOST_TTI_TRAIT_HAS_TYPE(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_TYPE(trait,name) \
template \
< \
class BOOST_TTI_TP_T, \
class BOOST_TTI_TP_U = BOOST_TTI_NAMESPACE::detail::deftype \
> \
struct trait \
{ \
typedef typename \
BOOST_PP_CAT(trait,_detail_type)<BOOST_TTI_TP_T,BOOST_TTI_TP_U>::type type; \
BOOST_STATIC_CONSTANT(bool,value=type::value); \
}; \
/**/
/**
BOOST_TTI_HAS_TYPE is a macro which expands to a metafunction.
The metafunction tests whether an inner type with a particular name exists
and, optionally, whether a lambda expression invoked with the inner type
is true or not.
name = the name of the inner type.
generates a metafunction called "has_type_'name'" where 'name' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_U>
struct has_type_'name'
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type in which to look for our 'name'.
BOOST_TTI_TP_U = (optional) An optional template parameter, defaulting to a marker type.
If specified it is an MPL lambda expression which is invoked
with the inner type found and must return a constant boolean
value.
returns = 'value' depends on whether or not the optional BOOST_TTI_TP_U is specified.
If BOOST_TTI_TP_U is not specified, then 'value' is true if the 'name' type
exists within the enclosing type BOOST_TTI_TP_T; otherwise 'value' is false.
If BOOST_TTI_TP_U is specified , then 'value' is true if the 'name' type exists
within the enclosing type BOOST_TTI_TP_T and the lambda expression as specified
by BOOST_TTI_TP_U, invoked by passing the actual inner type of 'name', returns
a 'value' of true; otherwise 'value' is false.
The action taken with BOOST_TTI_TP_U occurs only when the 'name' type exists
within the enclosing type BOOST_TTI_TP_T.
Example usage:
BOOST_TTI_HAS_TYPE(MyType) generates the metafunction has_type_MyType in the current scope
to look for an inner type called MyType.
has_type_MyType<EnclosingType>::value is true if MyType is an inner type of EnclosingType, otherwise false.
has_type_MyType<EnclosingType,ALambdaExpression>::value is true if MyType is an inner type of EnclosingType
and invoking ALambdaExpression with the inner type returns a value of true, otherwise false.
A popular use of the optional MPL lambda expression is to check whether the type found is the same
as another type, when the type found is a typedef. In that case our example would be:
has_type_MyType<EnclosingType,boost::is_same<_,SomeOtherType> >::value is true if MyType is an inner type
of EnclosingType and is the same type as SomeOtherType.
*/
#define BOOST_TTI_HAS_TYPE(name) \
BOOST_TTI_TRAIT_HAS_TYPE \
( \
BOOST_TTI_HAS_TYPE_GEN(name), \
name \
) \
/**/
#endif // BOOST_TTI_HAS_TYPE_HPP
@@ -0,0 +1,189 @@
// (C) Copyright Edward Diener 2011,2012,2013
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_MEMBER_TYPE_HPP)
#define BOOST_TTI_MEMBER_TYPE_HPP
#include <boost/config.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/not.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/tti/gen/member_type_gen.hpp>
#include <boost/tti/gen/namespace_gen.hpp>
#include <boost/tti/detail/dmem_type.hpp>
#include <boost/tti/detail/dnotype.hpp>
/*
The succeeding comments in this file are in doxygen format.
*/
/** \file
*/
/// Expands to a metafunction whose typedef 'type' is either the named type or a marker type.
/**
trait = the name of the metafunction within the tti namespace.
name = the name of the inner type.
generates a metafunction called "trait" where 'trait' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_MARKER_TYPE = boost::tti::detail::notype>
struct trait
{
typedef unspecified type;
typedef BOOST_TTI_TP_MARKER_TYPE boost_tti_marker_type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type.
BOOST_TTI_TP_MARKER_TYPE = (optional) a type to use as the marker type.
defaults to the internal boost::tti::detail::notype.
returns = 'type' is the inner type of 'name' if the inner type exists
within the enclosing type, else 'type' is a marker type.
if the end-user does not specify a marker type then
an internal boost::tti::detail::notype marker type is used.
The metafunction also encapsulates the type of the marker type as
a nested 'boost_tti_marker_type'.
The purpose of this macro is to encapsulate the 'name' type as the typedef 'type'
of a metafunction, but only if it exists within the enclosing type. This allows for
an evaluation of inner type existence, without generating a compiler error,
which can be used by other metafunctions in this library.
*/
#define BOOST_TTI_TRAIT_MEMBER_TYPE(trait,name) \
BOOST_TTI_DETAIL_TRAIT_HAS_TYPE_MEMBER_TYPE(trait,name) \
BOOST_TTI_DETAIL_TRAIT_MEMBER_TYPE(trait,name) \
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_MARKER_TYPE = BOOST_TTI_NAMESPACE::detail::notype> \
struct trait : \
boost::mpl::eval_if \
< \
BOOST_PP_CAT(trait,_detail)<BOOST_TTI_TP_T>, \
BOOST_PP_CAT(trait,_detail_member_type)<BOOST_TTI_TP_T>, \
boost::mpl::identity<BOOST_TTI_TP_MARKER_TYPE> \
> \
{ \
typedef BOOST_TTI_TP_MARKER_TYPE boost_tti_marker_type; \
}; \
/**/
/// Expands to a metafunction whose typedef 'type' is either the named type or a marker type.
/**
name = the name of the inner type.
generates a metafunction called "member_type_name" where 'name' is the macro parameter.
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_MARKER_TYPE = boost::tti::detail::notype>
struct member_type_name
{
typedef unspecified type;
typedef BOOST_TTI_TP_MARKER_TYPE boost_tti_marker_type;
};
The metafunction types and return:
BOOST_TTI_TP_T = the enclosing type.
BOOST_TTI_TP_MARKER_TYPE = (optional) a type to use as the marker type.
defaults to the internal boost::tti::detail::notype.
returns = 'type' is the inner type of 'name' if the inner type exists
within the enclosing type, else 'type' is a marker type.
if the end-user does not specify a marker type then
an internal boost::tti::detail::notype marker type is used.
The metafunction also encapsulates the type of the marker type as
a nested 'boost_tti_marker_type'.
The purpose of this macro is to encapsulate the 'name' type as the typedef 'type'
of a metafunction, but only if it exists within the enclosing type. This allows for
an evaluation of inner type existence, without generating a compiler error,
which can be used by other metafunctions in this library.
*/
#define BOOST_TTI_MEMBER_TYPE(name) \
BOOST_TTI_TRAIT_MEMBER_TYPE \
( \
BOOST_TTI_MEMBER_TYPE_GEN(name), \
name \
) \
/**/
namespace boost
{
namespace tti
{
/// A metafunction which checks whether the member 'type' returned from invoking the macro metafunction generated by BOOST_TTI_MEMBER_TYPE ( BOOST_TTI_TRAIT_MEMBER_TYPE ) is a valid type.
/**
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_MARKER_TYPE = boost::tti::detail::notype>
struct valid_member_type
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
BOOST_TTI_TP_T = returned inner 'type' from invoking the macro metafunction generated by BOOST_TTI_MEMBER_TYPE ( BOOST_TTI_TRAIT_MEMBER_TYPE ).
BOOST_TTI_TP_MARKER_TYPE = (optional) a type to use as the marker type.
defaults to the internal boost::tti::detail::notype.
returns = 'value' is true if the type is valid, otherwise 'value' is false.
A valid type means that the returned inner 'type' is not the marker type.
*/
template<class BOOST_TTI_TP_T,class BOOST_TTI_TP_MARKER_TYPE = BOOST_TTI_NAMESPACE::detail::notype>
struct valid_member_type :
boost::mpl::not_
<
boost::is_same<BOOST_TTI_TP_T,BOOST_TTI_TP_MARKER_TYPE>
>
{
};
/// A metafunction which checks whether the invoked macro metafunction generated by BOOST_TTI_MEMBER_TYPE ( BOOST_TTI_TRAIT_MEMBER_TYPE ) hold a valid type.
/**
template<class TTI_METAFUNCTION>
struct valid_member_metafunction
{
static const value = unspecified;
typedef mpl::bool_<true-or-false> type;
};
The metafunction types and return:
TTI_METAFUNCTION = The invoked macro metafunction generated by BOOST_TTI_MEMBER_TYPE ( BOOST_TTI_TRAIT_MEMBER_TYPE ).
returns = 'value' is true if the nested type of the invoked metafunction is valid, otherwise 'value' is false.
A valid type means that the invoked metafunction's inner 'type' is not the marker type.
*/
template<class TTI_METAFUNCTION>
struct valid_member_metafunction :
boost::mpl::not_
<
boost::is_same<typename TTI_METAFUNCTION::type,typename TTI_METAFUNCTION::boost_tti_marker_type>
>
{
};
}
}
#endif // BOOST_TTI_MEMBER_TYPE_HPP
@@ -0,0 +1,20 @@
// (C) Copyright Edward Diener 2011,2012
// Use, modification and distribution are subject to the Boost Software License,
// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt).
#if !defined(BOOST_TTI_INTROSPECTION_HPP)
#define BOOST_TTI_INTROSPECTION_HPP
#include "has_data.hpp"
#include "has_function.hpp"
#include "has_member_data.hpp"
#include "has_member_function.hpp"
#include "has_static_member_data.hpp"
#include "has_static_member_function.hpp"
#include "has_template.hpp"
#include "has_type.hpp"
#include "member_type.hpp"
#endif // BOOST_TTI_INTROSPECTION_HPP