File indexing completed on 2025-07-11 08:28:18
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
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
0032
0033
0034
0035
0036
0037
0038
0039 template <
0040 typename T, typename Dest, typename Source
0041 BOOST_MPL_AUX_LAMBDA_ARITY_PARAM(
0042 typename Arity
0043 )
0044 >
0045 struct substitute
0046 {
0047 typedef T type;
0048 };
0049
0050
0051
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
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
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
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
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 }}
0164 }
0165
0166 #endif