File indexing completed on 2024-11-15 09:20:38
0001
0002
0003
0004
0005
0006 #ifndef BOOST_PARAMETER_AUGMENT_PREDICATE_HPP
0007 #define BOOST_PARAMETER_AUGMENT_PREDICATE_HPP
0008
0009 #include <boost/parameter/keyword_fwd.hpp>
0010 #include <boost/mpl/bool.hpp>
0011 #include <boost/mpl/if.hpp>
0012 #include <boost/mpl/eval_if.hpp>
0013 #include <boost/type_traits/is_lvalue_reference.hpp>
0014 #include <boost/type_traits/is_scalar.hpp>
0015 #include <boost/type_traits/is_same.hpp>
0016
0017 namespace boost { namespace parameter { namespace aux {
0018
0019 template <typename V, typename R, typename Tag>
0020 struct augment_predicate_check_consume_ref
0021 : ::boost::mpl::eval_if<
0022 ::boost::is_scalar<V>
0023 , ::boost::mpl::true_
0024 , ::boost::mpl::eval_if<
0025 ::boost::is_same<
0026 typename Tag::qualifier
0027 , ::boost::parameter::consume_reference
0028 >
0029 , ::boost::mpl::if_<
0030 ::boost::is_lvalue_reference<R>
0031 , ::boost::mpl::false_
0032 , ::boost::mpl::true_
0033 >
0034 , boost::mpl::true_
0035 >
0036 >::type
0037 {
0038 };
0039 }}}
0040
0041 #include <boost/type_traits/is_const.hpp>
0042
0043 namespace boost { namespace parameter { namespace aux {
0044
0045 template <typename V, typename R, typename Tag>
0046 struct augment_predicate_check_out_ref
0047 : ::boost::mpl::eval_if<
0048 ::boost::is_same<
0049 typename Tag::qualifier
0050 , ::boost::parameter::out_reference
0051 >
0052 , ::boost::mpl::eval_if<
0053 ::boost::is_lvalue_reference<R>
0054 , ::boost::mpl::if_<
0055 ::boost::is_const<V>
0056 , ::boost::mpl::false_
0057 , ::boost::mpl::true_
0058 >
0059 , ::boost::mpl::false_
0060 >
0061 , ::boost::mpl::true_
0062 >::type
0063 {
0064 };
0065 }}}
0066
0067 #include <boost/parameter/aux_/lambda_tag.hpp>
0068 #include <boost/mpl/apply_wrap.hpp>
0069 #include <boost/mpl/lambda.hpp>
0070
0071 namespace boost { namespace parameter { namespace aux {
0072
0073 template <
0074 typename Predicate
0075 , typename R
0076 , typename Tag
0077 , typename T
0078 , typename Args
0079 >
0080 class augment_predicate
0081 {
0082 typedef typename ::boost::mpl::lambda<
0083 Predicate
0084 , ::boost::parameter::aux::lambda_tag
0085 >::type _actual_predicate;
0086
0087 public:
0088 typedef typename ::boost::mpl::eval_if<
0089 typename ::boost::mpl::if_<
0090 ::boost::parameter::aux
0091 ::augment_predicate_check_consume_ref<T,R,Tag>
0092 , ::boost::parameter::aux
0093 ::augment_predicate_check_out_ref<T,R,Tag>
0094 , ::boost::mpl::false_
0095 >::type
0096 , ::boost::mpl::apply_wrap2<_actual_predicate,T,Args>
0097 , ::boost::mpl::false_
0098 >::type type;
0099 };
0100 }}}
0101
0102 #include <boost/parameter/config.hpp>
0103
0104 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
0105 #include <boost/mp11/integral.hpp>
0106 #include <boost/mp11/utility.hpp>
0107 #include <type_traits>
0108
0109 namespace boost { namespace parameter { namespace aux {
0110
0111 template <typename V, typename R, typename Tag>
0112 using augment_predicate_check_consume_ref_mp11 = ::boost::mp11::mp_if<
0113 ::std::is_scalar<V>
0114 , ::boost::mp11::mp_true
0115 , ::boost::mp11::mp_if<
0116 ::std::is_same<
0117 typename Tag::qualifier
0118 , ::boost::parameter::consume_reference
0119 >
0120 , ::boost::mp11::mp_if<
0121 ::std::is_lvalue_reference<R>
0122 , ::boost::mp11::mp_false
0123 , ::boost::mp11::mp_true
0124 >
0125 , boost::mp11::mp_true
0126 >
0127 >;
0128
0129 template <typename V, typename R, typename Tag>
0130 using augment_predicate_check_out_ref_mp11 = ::boost::mp11::mp_if<
0131 ::std::is_same<
0132 typename Tag::qualifier
0133 , ::boost::parameter::out_reference
0134 >
0135 , ::boost::mp11::mp_if<
0136 ::std::is_lvalue_reference<R>
0137 , ::boost::mp11::mp_if<
0138 ::std::is_const<V>
0139 , ::boost::mp11::mp_false
0140 , ::boost::mp11::mp_true
0141 >
0142 , ::boost::mp11::mp_false
0143 >
0144 , ::boost::mp11::mp_true
0145 >;
0146 }}}
0147
0148 #include <boost/mp11/list.hpp>
0149
0150 namespace boost { namespace parameter { namespace aux {
0151
0152 template <
0153 typename Predicate
0154 , typename R
0155 , typename Tag
0156 , typename T
0157 , typename Args
0158 >
0159 struct augment_predicate_mp11_impl
0160 {
0161 using type = ::boost::mp11::mp_if<
0162 ::boost::mp11::mp_if<
0163 ::boost::parameter::aux
0164 ::augment_predicate_check_consume_ref_mp11<T,R,Tag>
0165 , ::boost::parameter::aux
0166 ::augment_predicate_check_out_ref_mp11<T,R,Tag>
0167 , ::boost::mp11::mp_false
0168 >
0169 , ::boost::mp11
0170 ::mp_apply_q<Predicate,::boost::mp11::mp_list<T,Args> >
0171 , ::boost::mp11::mp_false
0172 >;
0173 };
0174 }}}
0175
0176 #include <boost/parameter/aux_/has_nested_template_fn.hpp>
0177
0178 namespace boost { namespace parameter { namespace aux {
0179
0180 template <
0181 typename Predicate
0182 , typename R
0183 , typename Tag
0184 , typename T
0185 , typename Args
0186 >
0187 using augment_predicate_mp11 = ::boost::mp11::mp_if<
0188 ::boost::parameter::aux::has_nested_template_fn<Predicate>
0189 , ::boost::parameter::aux
0190 ::augment_predicate_mp11_impl<Predicate,R,Tag,T,Args>
0191 , ::boost::parameter::aux
0192 ::augment_predicate<Predicate,R,Tag,T,Args>
0193 >;
0194 }}}
0195
0196 #endif
0197 #endif
0198