Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-11-15 09:20:38

0001 // Copyright Cromwell D. Enage 2018.
0002 // Distributed under the Boost Software License, Version 1.0.
0003 // (See accompanying file LICENSE_1_0.txt or copy at
0004 // http://www.boost.org/LICENSE_1_0.txt)
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 }}} // namespace boost::parameter::aux
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 }}} // namespace boost::parameter::aux
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 }}} // namespace boost::parameter::aux
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 }}} // namespace boost::parameter::aux
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 }}} // namespace boost::parameter::aux
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 }}} // namespace boost::parameter::aux
0195 
0196 #endif  // BOOST_PARAMETER_CAN_USE_MP11
0197 #endif  // include guard
0198