123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- // (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
|