diff --git a/include/boost/mpl/empty_base.hpp b/include/boost/mpl/empty_base.hpp new file mode 100644 index 0000000..1c9421e --- /dev/null +++ b/include/boost/mpl/empty_base.hpp @@ -0,0 +1,61 @@ +//----------------------------------------------------------------------------- +// boost mpl/empty_base.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2001-02 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_EMPTY_BASE_HPP_INCLUDED +#define BOOST_MPL_EMPTY_BASE_HPP_INCLUDED + +#include "boost/type_traits/is_empty.hpp" +#include "boost/mpl/bool_c.hpp" +#include "boost/config.hpp" + +// should be always the last #include directive +#include "boost/type_traits/detail/bool_trait_def.hpp" + +namespace boost { +namespace mpl { + +// empty base class, guaranteed to have no members; inheritance from +// 'empty_base' through the 'inherit' metafunction is a no-op - see +// "mpl/inherit.hpp" header for the details +struct empty_base {}; + +template< typename T > +struct is_empty_base + : false_c +{ +#if defined(BOOST_MSVC) && BOOST_MSVC < 1300 + using false_c::value; +#endif +}; + +template<> +struct is_empty_base + : true_c +{ +#if defined(BOOST_MSVC) && BOOST_MSVC < 1300 + using true_c::value; +#endif +}; + +} // namespace mpl + +BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_empty, mpl::empty_base, true) + +} // namespace boost + +#include "boost/type_traits/detail/bool_trait_undef.hpp" + +#endif // BOOST_MPL_EMPTY_BASE_HPP_INCLUDED diff --git a/include/boost/mpl/inherit.hpp b/include/boost/mpl/inherit.hpp new file mode 100644 index 0000000..2189628 --- /dev/null +++ b/include/boost/mpl/inherit.hpp @@ -0,0 +1,220 @@ +//----------------------------------------------------------------------------- +// boost mpl/inherit.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2001-02 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#if !defined(BOOST_PP_IS_ITERATING) + +///// header body + +#ifndef BOOST_MPL_INHERIT_HPP_INCLUDED +#define BOOST_MPL_INHERIT_HPP_INCLUDED + +#if !defined(BOOST_MPL_PREPROCESSING_MODE) +# include "boost/mpl/empty_base.hpp" +# include "boost/mpl/aux_/void_spec.hpp" +# include "boost/mpl/aux_/lambda_support.hpp" +#endif + +#include "boost/mpl/aux_/config/use_preprocessed.hpp" + +#if 0 //defined(BOOST_MPL_USE_PREPROCESSED_HEADERS) + //&& !defined(BOOST_MPL_PREPROCESSING_MODE) + +# define BOOST_MPL_PREPROCESSED_HEADER inherit.hpp +# include "boost/mpl/aux_/include_preprocessed.hpp" + +#else + +# include "boost/mpl/aux_/preprocessor/params.hpp" +# include "boost/mpl/aux_/preprocessor/default_params.hpp" +# include "boost/mpl/limits/arity.hpp" + +# include "boost/preprocessor/iterate.hpp" +# include "boost/preprocessor/dec.hpp" +# include "boost/preprocessor/cat.hpp" +# include "boost/config.hpp" + +namespace boost { +namespace mpl { + +// 'inherit' metafunction; returns an unspecified class type +// produced by public derivation from all metafunction's parameters +// (T1,T2,..,Tn), except the parameters of 'empty_base' class type; +// regardless the position and number of 'empty_base' parameters in the +// metafunction's argument list, derivation from them is always a no-op; +// for instance: +// inherit::type == her +// inherit::type == struct unspecified : her, my {}; +// inherit::type == her +// inherit::type == her +// inherit::type == struct unspecified : her, my {}; +// inherit::type == empty_base + +#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) + +template< + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(T1) + , typename BOOST_MPL_AUX_VOID_SPEC_PARAM(T2) + > +struct inherit2 + : T1, T2 +{ + typedef inherit2 type; +}; + +template< typename T1 > +struct inherit2 +{ + typedef T1 type; +}; + +template< typename T2 > +struct inherit2 +{ + typedef T2 type; +}; + +// needed to disambiguate the previous two in case when both +// T1 and T2 == empty_base +template<> +struct inherit2 +{ + typedef empty_base type; +}; + +#else + +namespace aux { + +template< bool C1, bool C2 > +struct inherit2_impl +{ + template< typename Derived, typename T1, typename T2 > struct result_ + : T1, T2 + { + typedef Derived type_; + }; +}; + +template<> +struct inherit2_impl +{ + template< typename Derived, typename T1, typename T2 > struct result_ + : T1 + { + typedef T1 type_; + }; +}; + +template<> +struct inherit2_impl +{ + template< typename Derived, typename T1, typename T2 > struct result_ + : T2 + { + typedef T2 type_; + }; +}; + +template<> +struct inherit2_impl +{ + template< typename Derived, typename T1, typename T2 > struct result_ + { + typedef T1 type_; + }; +}; + +} // namespace aux + +template< + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(T1) + , typename BOOST_MPL_AUX_VOID_SPEC_PARAM(T2) + > +struct inherit2 + : aux::inherit2_impl< + is_empty_base::value + , is_empty_base::value + >::template result_< inherit2,T1,T2 > +{ + typedef typename inherit2::type_ type; + BOOST_MPL_AUX_LAMBDA_SUPPORT(2,inherit2,(T1,T2)) +}; + +#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + +BOOST_MPL_AUX_VOID_SPEC(2, inherit2) + +#define BOOST_PP_ITERATION_PARAMS_1 \ + (3,(3, BOOST_MPL_METAFUNCTION_MAX_ARITY, "boost/mpl/inherit.hpp")) +#include BOOST_PP_ITERATE() + +} // namespace mpl +} // namespace boost + +#endif // BOOST_MPL_USE_PREPROCESSED_HEADERS +#endif // BOOST_MPL_INHERIT_HPP_INCLUDED + +///// iteration + +#else +#define n BOOST_PP_FRAME_ITERATION(1) + +template< + BOOST_MPL_PP_DEFAULT_PARAMS(n, typename T, void_) + > +struct BOOST_PP_CAT(inherit,n) + : inherit2< + typename BOOST_PP_CAT(inherit,BOOST_PP_DEC(n))< + BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(n), T) + >::type + , BOOST_PP_CAT(T,n) + > +{ + BOOST_MPL_AUX_LAMBDA_SUPPORT(n,BOOST_PP_CAT(inherit,n),(BOOST_MPL_PP_PARAMS(n, T))) +}; + +BOOST_MPL_AUX_VOID_SPEC(n, BOOST_PP_CAT(inherit,n)) + +#if n == BOOST_MPL_METAFUNCTION_MAX_ARITY +//: primary template +template< + BOOST_MPL_PP_DEFAULT_PARAMS(n, typename T, empty_base) + > +struct inherit + : BOOST_PP_CAT(inherit,n) +{ +}; + +// 'void_' specialization +template<> +struct inherit< BOOST_MPL_AUX_VOID_SPEC_PARAMS(n) > +{ + template< + BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(0, typename T, empty_base) + > + struct apply + : inherit< BOOST_MPL_PP_PARAMS(n, T) > + { + }; +}; + +BOOST_MPL_AUX_VOID_SPEC_LAMBDA(n, inherit) +BOOST_MPL_AUX_VOID_SPEC_ARITY(n, inherit) +BOOST_MPL_AUX_VOID_SPEC_TEMPLATE_ARITY(n, n, inherit) +#endif + +#undef n +#endif // BOOST_PP_IS_ITERATING diff --git a/include/boost/mpl/inherit_linearly.hpp b/include/boost/mpl/inherit_linearly.hpp new file mode 100644 index 0000000..d643c34 --- /dev/null +++ b/include/boost/mpl/inherit_linearly.hpp @@ -0,0 +1,44 @@ +//----------------------------------------------------------------------------- +// boost mpl/inherit_linearly.hpp header file +// See http://www.boost.org for updates, documentation, and revision history. +//----------------------------------------------------------------------------- +// +// Copyright (c) 2001-02 +// Aleksey Gurtovoy +// +// Permission to use, copy, modify, distribute and sell this software +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appears in all copies and +// that both the copyright notice and this permission notice appear in +// supporting documentation. No representations are made about the +// suitability of this software for any purpose. It is provided "as is" +// without express or implied warranty. + +#ifndef BOOST_MPL_INHERIT_FRONT_TO_BACK_HPP_INCLUDED +#define BOOST_MPL_INHERIT_FRONT_TO_BACK_HPP_INCLUDED + +#include "boost/mpl/fold.hpp" +#include "boost/mpl/empty_base.hpp" +#include "boost/mpl/aux_/void_spec.hpp" +#include "boost/mpl/aux_/lambda_support.hpp" + +namespace boost { +namespace mpl { + +template< + typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Types_) + , typename BOOST_MPL_AUX_VOID_SPEC_PARAM(Node_) + , typename Root_ = empty_base + > +struct inherit_linearly + : fold +{ + BOOST_MPL_AUX_LAMBDA_SUPPORT(3,inherit_linearly,(Types_,Node_,Root_)) +}; + +BOOST_MPL_AUX_VOID_SPEC(2, inherit_linearly) + +} // namespace mpl +} // namespace boost + +#endif // BOOST_MPL_INHERIT_FRONT_TO_BACK_HPP_INCLUDED