summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '3rdParty/Boost/src/boost/tti/member_type.hpp')
-rw-r--r--3rdParty/Boost/src/boost/tti/member_type.hpp189
1 files changed, 189 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/tti/member_type.hpp b/3rdParty/Boost/src/boost/tti/member_type.hpp
new file mode 100644
index 0000000..6d60289
--- /dev/null
+++ b/3rdParty/Boost/src/boost/tti/member_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