Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-07-11 08:28:18

0001 //-----------------------------------------------------------------------------
0002 // boost variant/detail/substitute.hpp header file
0003 // See http://www.boost.org for updates, documentation, and revision history.
0004 //-----------------------------------------------------------------------------
0005 //
0006 // Copyright (c) 2003
0007 // Eric Friedman
0008 //
0009 // Distributed under the Boost Software License, Version 1.0. (See
0010 // accompanying file LICENSE_1_0.txt or copy at
0011 // http://www.boost.org/LICENSE_1_0.txt)
0012 
0013 #ifndef BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
0014 #define BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP
0015 
0016 #include <boost/mpl/aux_/config/ctps.hpp>
0017 
0018 #include <boost/variant/detail/substitute_fwd.hpp>
0019 #include <boost/variant/variant_fwd.hpp>
0020 #include <boost/mpl/aux_/lambda_arity_param.hpp>
0021 #include <boost/mpl/aux_/preprocessor/params.hpp>
0022 #include <boost/mpl/aux_/preprocessor/repeat.hpp>
0023 #include <boost/mpl/int_fwd.hpp>
0024 #include <boost/mpl/limits/arity.hpp>
0025 #include <boost/preprocessor/empty.hpp>
0026 
0027 namespace boost {
0028 namespace detail { namespace variant {
0029 
0030 ///////////////////////////////////////////////////////////////////////////////
0031 // (detail) metafunction substitute
0032 //
0033 // Substitutes one type for another in the given type expression.
0034 //
0035 
0036 //
0037 // primary template
0038 //
0039 template <
0040       typename T, typename Dest, typename Source
0041       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
0042           typename Arity /* = ... (see substitute_fwd.hpp) */
0043         )
0044     >
0045 struct substitute
0046 {
0047     typedef T type;
0048 };
0049 
0050 //
0051 // tag substitution specializations
0052 //
0053 
0054 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(CV_) \
0055     template <typename Dest, typename Source> \
0056     struct substitute< \
0057           CV_ Source \
0058         , Dest \
0059         , Source \
0060           BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
0061         > \
0062     { \
0063         typedef CV_ Dest type; \
0064     }; \
0065     /**/
0066 
0067 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG( BOOST_PP_EMPTY() )
0068 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const)
0069 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(volatile)
0070 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG(const volatile)
0071 
0072 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_SUBSTITUTE_TAG
0073 
0074 //
0075 // pointer specializations
0076 //
0077 #define BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(CV_) \
0078     template <typename T, typename Dest, typename Source> \
0079     struct substitute< \
0080           T * CV_ \
0081         , Dest \
0082         , Source \
0083           BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>) \
0084         > \
0085     { \
0086         typedef typename substitute< \
0087               T, Dest, Source \
0088             >::type * CV_ type; \
0089     }; \
0090     /**/
0091 
0092 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER( BOOST_PP_EMPTY() )
0093 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const)
0094 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(volatile)
0095 BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER(const volatile)
0096 
0097 #undef BOOST_VARIANT_AUX_ENABLE_RECURSIVE_IMPL_HANDLE_POINTER
0098 
0099 //
0100 // reference specializations
0101 //
0102 template <typename T, typename Dest, typename Source>
0103 struct substitute<
0104       T&
0105     , Dest
0106     , Source
0107       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
0108     >
0109 {
0110     typedef typename substitute<
0111           T, Dest, Source
0112         >::type & type;
0113 };
0114 
0115 //
0116 // template expression (i.e., F<...>) specializations
0117 //
0118 
0119 template <
0120       template <typename...> class F
0121     , typename... Ts
0122     , typename Dest
0123     , typename Source
0124       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(typename Arity)
0125     >
0126 struct substitute<
0127       F<Ts...>
0128     , Dest
0129     , Source
0130       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(Arity)
0131     >
0132 {
0133     typedef F<typename substitute<
0134           Ts, Dest, Source
0135         >::type...> type;
0136 };
0137 
0138 //
0139 // function specializations
0140 //
0141 template <
0142       typename R
0143     , typename... A
0144     , typename Dest
0145     , typename Source
0146     >
0147 struct substitute<
0148       R (*)(A...)
0149     , Dest
0150     , Source
0151       BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(mpl::int_<-1>)
0152     >
0153 {
0154 private:
0155     typedef typename substitute< R, Dest, Source >::type r;
0156 
0157 public:
0158     typedef r (*type)(typename substitute<
0159           A, Dest, Source
0160         >::type...);
0161 };
0162 
0163 }} // namespace detail::variant
0164 } // namespace boost
0165 
0166 #endif // BOOST_VARIANT_DETAIL_SUBSTITUTE_HPP