LCOV - code coverage report
Current view: top level - usr/include/boost/parameter/aux_ - tagged_argument.hpp (source / functions) Hit Total Coverage
Test: ROSE Lines: 0 4 0.0 %
Date: 2022-12-08 13:48:47 Functions: 0 0 -
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Copyright Daniel Wallin, David Abrahams 2005.
       2             : // Copyright Cromwell D. Enage 2017.
       3             : // Distributed under the Boost Software License, Version 1.0.
       4             : // (See accompanying file LICENSE_1_0.txt or copy at
       5             : // http://www.boost.org/LICENSE_1_0.txt)
       6             : 
       7             : #ifndef BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
       8             : #define BOOST_PARAMETER_TAGGED_ARGUMENT_050328_HPP
       9             : 
      10             : namespace boost { namespace parameter { namespace aux {
      11             : 
      12             :     struct error_const_lvalue_bound_to_out_parameter;
      13             :     struct error_lvalue_bound_to_consume_parameter;
      14             :     struct error_rvalue_bound_to_out_parameter;
      15             : }}} // namespace boost::parameter::aux
      16             : 
      17             : #include <boost/parameter/keyword_fwd.hpp>
      18             : #include <boost/parameter/config.hpp>
      19             : #include <boost/mpl/eval_if.hpp>
      20             : #include <boost/type_traits/is_same.hpp>
      21             : #include <boost/type_traits/remove_const.hpp>
      22             : 
      23             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
      24             : #include <boost/mp11/integral.hpp>
      25             : #include <boost/mp11/utility.hpp>
      26             : #include <type_traits>
      27             : #endif
      28             : 
      29             : namespace boost { namespace parameter { namespace aux {
      30             : 
      31             :     template <typename Keyword, typename Arg>
      32             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
      33             :     using tagged_argument_type = ::boost::mp11::mp_if<
      34             :         ::boost::mp11::mp_if<
      35             :             ::std::is_scalar<Arg>
      36             :           , ::boost::mp11::mp_false
      37             :           , ::std::is_same<
      38             :                 typename Keyword::qualifier
      39             :               , ::boost::parameter::consume_reference
      40             :             >
      41             :         >
      42             :       , ::boost::parameter::aux::error_lvalue_bound_to_consume_parameter
      43             :       , ::boost::mp11::mp_if<
      44             :             ::std::is_const<Arg>
      45             :           , ::boost::mp11::mp_if<
      46             :                 ::std::is_same<
      47             :                     typename Keyword::qualifier
      48             :                   , ::boost::parameter::out_reference
      49             :                 >
      50             :               , ::boost::parameter::aux
      51             :                 ::error_const_lvalue_bound_to_out_parameter
      52             :               , ::std::remove_const<Arg>
      53             :             >
      54             :           , ::boost::mp11::mp_identity<Arg>
      55             :         >
      56             :     >;
      57             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
      58             :     struct tagged_argument_type
      59             :       : ::boost::mpl::eval_if<
      60             :             ::boost::is_same<
      61             :                 typename Keyword::qualifier
      62             :               , ::boost::parameter::out_reference
      63             :             >
      64             :           , ::boost::parameter::aux::error_const_lvalue_bound_to_out_parameter
      65             :           , ::boost::remove_const<Arg>
      66             :         >
      67             :     {
      68             :     };
      69             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
      70             : }}} // namespace boost::parameter::aux
      71             : 
      72             : #include <boost/parameter/aux_/tagged_argument_fwd.hpp>
      73             : #include <boost/parameter/aux_/is_tagged_argument.hpp>
      74             : #include <boost/parameter/aux_/default.hpp>
      75             : #include <boost/parameter/aux_/void.hpp>
      76             : #include <boost/parameter/aux_/arg_list.hpp>
      77             : #include <boost/parameter/aux_/result_of0.hpp>
      78             : #include <boost/mpl/bool.hpp>
      79             : #include <boost/mpl/if.hpp>
      80             : #include <boost/mpl/identity.hpp>
      81             : #include <boost/mpl/apply_wrap.hpp>
      82             : #include <boost/type_traits/is_const.hpp>
      83             : #include <boost/type_traits/is_function.hpp>
      84             : #include <boost/type_traits/is_scalar.hpp>
      85             : #include <boost/type_traits/remove_reference.hpp>
      86             : 
      87             : #if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
      88             : #include <boost/function.hpp>
      89             : #else
      90             : #include <functional>
      91             : #endif
      92             : 
      93             : #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
      94             : #include <boost/core/enable_if.hpp>
      95             : #include <utility>
      96             : 
      97             : namespace boost { namespace parameter { namespace aux {
      98             : 
      99             :     // Holds an lvalue reference to an argument of type Arg associated with
     100             :     // keyword Keyword
     101             :     template <typename Keyword, typename Arg>
     102             :     class tagged_argument
     103             :       : public ::boost::parameter::aux::tagged_argument_base
     104             :     {
     105             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     106             :         using arg_type = typename ::boost::parameter::aux
     107             :         ::tagged_argument_type<Keyword,Arg>::type;
     108             : #else
     109             :         typedef typename ::boost::mpl::eval_if<
     110             :             typename ::boost::mpl::eval_if<
     111             :                 ::boost::is_scalar<Arg>
     112             :               , ::boost::mpl::false_
     113             :               , ::boost::is_same<
     114             :                     typename Keyword::qualifier
     115             :                   , ::boost::parameter::consume_reference
     116             :                 >
     117             :             >::type
     118             :           , ::boost::parameter::aux::error_lvalue_bound_to_consume_parameter
     119             :           , ::boost::mpl::eval_if<
     120             :                 ::boost::is_const<Arg>
     121             :               , ::boost::parameter::aux::tagged_argument_type<Keyword,Arg>
     122             :               , ::boost::mpl::identity<Arg>
     123             :             >
     124             :         >::type arg_type;
     125             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     126             : 
     127             :      public:
     128             :         typedef Keyword key_type;
     129             : 
     130             :         // Wrap plain (non-UDT) function objects in either
     131             :         // a boost::function or a std::function. -- Cromwell D. Enage
     132             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     133             :         using value_type = ::boost::mp11::mp_if<
     134             :             ::std::is_function<arg_type>
     135             :           , ::std::function<arg_type>
     136             :           , Arg
     137             :         >;
     138             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     139             :         typedef typename ::boost::mpl::if_<
     140             :             ::boost::is_function<arg_type>
     141             : #if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
     142             :           , ::boost::function<arg_type>
     143             : #else
     144             :           , ::std::function<arg_type>
     145             : #endif
     146             :           , Arg
     147             :         >::type value_type;
     148             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     149             : 
     150             :         // If Arg is void_, then this type will evaluate to void_&.  If the
     151             :         // supplied argument is a plain function, then this type will evaluate
     152             :         // to a reference-to-const function wrapper type.  If the supplied
     153             :         // argument is an lvalue, then Arg will be deduced to the lvalue
     154             :         // reference. -- Cromwell D. Enage
     155             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     156             :         using reference = ::boost::mp11::mp_if<
     157             :             ::std::is_function<arg_type>
     158             :           , value_type const&
     159             :           , Arg&
     160             :         >;
     161             : #else
     162             :         typedef typename ::boost::mpl::if_<
     163             :             ::boost::is_function<arg_type>
     164             :           , value_type const&
     165             :           , Arg&
     166             :         >::type reference;
     167             : #endif
     168             : 
     169             :      private:
     170             :         // Store plain functions by value, everything else by reference.
     171             :         // -- Cromwell D. Enage
     172             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     173             :         ::boost::mp11::mp_if<
     174             :             ::std::is_function<arg_type>
     175             :           , value_type
     176             :           , reference
     177             :         > value;
     178             : #else
     179             :         typename ::boost::mpl::if_<
     180             :             ::boost::is_function<arg_type>
     181             :           , value_type
     182             :           , reference
     183             :         >::type value;
     184             : #endif
     185             : 
     186             :      public:
     187           0 :         inline explicit BOOST_CONSTEXPR tagged_argument(reference x)
     188             :           : value(x)
     189             :         {
     190             :         }
     191             : 
     192           0 :         inline BOOST_CONSTEXPR tagged_argument(tagged_argument const& copy)
     193           0 :           : value(copy.value)
     194             :         {
     195             :         }
     196             : 
     197             :         // A metafunction class that, given a keyword and a default type,
     198             :         // returns the appropriate result type for a keyword lookup given
     199             :         // that default.
     200             :         struct binding
     201             :         {
     202             :             template <typename KW, typename Default, typename Reference>
     203             :             struct apply
     204             :               : ::boost::mpl::eval_if<
     205             :                     ::boost::is_same<KW,key_type>
     206             :                   , ::boost::mpl::if_<Reference,reference,value_type>
     207             :                   , ::boost::mpl::identity<Default>
     208             :                 >
     209             :             {
     210             :             };
     211             : 
     212             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     213             :             template <typename KW, typename Default, typename Reference>
     214             :             using fn = ::boost::mp11::mp_if<
     215             :                 ::std::is_same<KW,key_type>
     216             :               , ::boost::mp11::mp_if<Reference,reference,value_type>
     217             :               , Default
     218             :             >;
     219             : #endif
     220             :         };
     221             : 
     222             : #if !defined(BOOST_PARAMETER_CAN_USE_MP11)
     223             :         // Comma operator to compose argument list without using parameters<>.
     224             :         // Useful for argument lists with undetermined length.
     225             :         template <typename Keyword2, typename Arg2>
     226             :         inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
     227             :             ::boost::parameter::aux::tagged_argument<Keyword,Arg>
     228             :           , ::boost::parameter::aux::arg_list<
     229             :                 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     230             :             >
     231             :         >
     232             :             operator,(
     233             :                 ::boost::parameter::aux
     234             :                 ::tagged_argument<Keyword2,Arg2> const& x
     235             :             ) const
     236             :         {
     237             :             return ::boost::parameter::aux::arg_list<
     238             :                 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
     239             :               , ::boost::parameter::aux::arg_list<
     240             :                     ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     241             :                 >
     242             :             >(
     243             :                 *this
     244             :               , ::boost::parameter::aux::arg_list<
     245             :                     ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     246             :                 >(x, ::boost::parameter::aux::empty_arg_list())
     247             :             );
     248             :         }
     249             : 
     250             :         template <typename Keyword2, typename Arg2>
     251             :         inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
     252             :             ::boost::parameter::aux::tagged_argument<Keyword,Arg>
     253             :           , ::boost::parameter::aux::arg_list<
     254             :                 ::boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
     255             :             >
     256             :         >
     257             :             operator,(
     258             :                 ::boost::parameter::aux
     259             :                 ::tagged_argument_rref<Keyword2,Arg2> const& x
     260             :             ) const
     261             :         {
     262             :             return ::boost::parameter::aux::arg_list<
     263             :                 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
     264             :               , boost::parameter::aux::arg_list<
     265             :                     boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
     266             :                 >
     267             :             >(
     268             :                 *this
     269             :               , ::boost::parameter::aux::arg_list<
     270             :                     ::boost::parameter::aux
     271             :                     ::tagged_argument_rref<Keyword2,Arg2>
     272             :                 >(x, ::boost::parameter::aux::empty_arg_list())
     273             :             );
     274             :         }
     275             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     276             : 
     277             :         // Accessor interface.
     278           0 :         inline BOOST_CONSTEXPR reference get_value() const
     279             :         {
     280             :             return this->value;
     281             :         }
     282             : 
     283             :         inline BOOST_CONSTEXPR reference
     284             :             operator[](::boost::parameter::keyword<Keyword> const&) const
     285             :         {
     286             :             return this->get_value();
     287             :         }
     288             : 
     289             :         template <typename Default>
     290             :         inline BOOST_CONSTEXPR reference
     291             :             operator[](
     292             :                 ::boost::parameter::aux::default_<key_type,Default> const&
     293             :             ) const
     294             :         {
     295             :             return this->get_value();
     296             :         }
     297             : 
     298             :         template <typename F>
     299             :         inline BOOST_CONSTEXPR reference
     300             :             operator[](
     301             :                 ::boost::parameter::aux::lazy_default<key_type,F> const&
     302             :             ) const
     303             :         {
     304             :             return this->get_value();
     305             :         }
     306             : 
     307             :         template <typename KW, typename Default>
     308             :         inline BOOST_CONSTEXPR Default&
     309             :             operator[](
     310             :                 ::boost::parameter::aux::default_<KW,Default> const& x
     311             :             ) const
     312             :         {
     313             :             return x.value;
     314             :         }
     315             : 
     316             :         template <typename KW, typename Default>
     317             :         inline BOOST_CONSTEXPR Default&&
     318             :             operator[](
     319             :                 ::boost::parameter::aux::default_r_<KW,Default> const& x
     320             :             ) const
     321             :         {
     322             :             return ::std::forward<Default>(x.value);
     323             :         }
     324             : 
     325             :         template <typename KW, typename F>
     326             :         inline BOOST_CONSTEXPR
     327             :         typename ::boost::parameter::aux::result_of0<F>::type
     328             :             operator[](
     329             :                 ::boost::parameter::aux::lazy_default<KW,F> const& x
     330             :             ) const
     331             :         {
     332             :             return x.compute_default();
     333             :         }
     334             : 
     335             :         template <typename ParameterRequirements>
     336             :         static BOOST_CONSTEXPR typename ParameterRequirements::has_default
     337             :             satisfies(ParameterRequirements*);
     338             : 
     339             :         template <typename HasDefault, typename Predicate>
     340             :         static BOOST_CONSTEXPR
     341             :         typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
     342             :             satisfies(
     343             :                 ::boost::parameter::aux::parameter_requirements<
     344             :                     key_type
     345             :                   , Predicate
     346             :                   , HasDefault
     347             :                 >*
     348             :             );
     349             : 
     350             :         // MPL sequence support
     351             :         // Convenience for users
     352             :         typedef ::boost::parameter::aux::tagged_argument<Keyword,Arg> type;
     353             :         // For the benefit of iterators
     354             :         typedef ::boost::parameter::aux::empty_arg_list tail_type;
     355             :         // For dispatching to sequence intrinsics
     356             :         typedef ::boost::parameter::aux::arg_list_tag tag;
     357             :     };
     358             : 
     359             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     360             :     template <typename Keyword>
     361             :     using tagged_argument_rref_key = ::boost::mp11::mp_if<
     362             :         ::std::is_same<
     363             :             typename Keyword::qualifier
     364             :           , ::boost::parameter::out_reference
     365             :         >
     366             :       , ::boost::parameter::aux::error_rvalue_bound_to_out_parameter
     367             :       , ::boost::mp11::mp_identity<Keyword>
     368             :     >;
     369             : #endif
     370             : 
     371             :     // Holds an rvalue reference to an argument of type Arg associated with
     372             :     // keyword Keyword
     373             :     template <typename Keyword, typename Arg>
     374             :     struct tagged_argument_rref
     375             :       : ::boost::parameter::aux::tagged_argument_base
     376             :     {
     377             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     378             :         using key_type = typename ::boost::parameter::aux
     379             :         ::tagged_argument_rref_key<Keyword>::type;
     380             : #else
     381             :         typedef typename ::boost::mpl::eval_if<
     382             :             ::boost::is_same<
     383             :                 typename Keyword::qualifier
     384             :               , ::boost::parameter::out_reference
     385             :             >
     386             :           , ::boost::parameter::aux::error_rvalue_bound_to_out_parameter
     387             :           , ::boost::mpl::identity<Keyword>
     388             :         >::type key_type;
     389             : #endif
     390             :         typedef Arg value_type;
     391             :         typedef Arg&& reference;
     392             : 
     393             :      private:
     394             :         reference value;
     395             : 
     396             :      public:
     397             :         inline explicit BOOST_CONSTEXPR tagged_argument_rref(reference x)
     398             :           : value(::std::forward<Arg>(x))
     399             :         {
     400             :         }
     401             : 
     402             :         inline BOOST_CONSTEXPR tagged_argument_rref(
     403             :             tagged_argument_rref const& copy
     404             :         ) : value(::std::forward<Arg>(copy.value))
     405             :         {
     406             :         }
     407             : 
     408             :         // A metafunction class that, given a keyword and a default type,
     409             :         // returns the appropriate result type for a keyword lookup given
     410             :         // that default.
     411             :         struct binding
     412             :         {
     413             :             template <typename KW, typename Default, typename Reference>
     414             :             struct apply
     415             :             {
     416             :                 typedef typename ::boost::mpl::eval_if<
     417             :                     ::boost::is_same<KW,key_type>
     418             :                   , ::boost::mpl::if_<Reference,reference,value_type>
     419             :                   , ::boost::mpl::identity<Default>
     420             :                 >::type type;
     421             :             };
     422             : 
     423             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     424             :             template <typename KW, typename Default, typename Reference>
     425             :             using fn = ::boost::mp11::mp_if<
     426             :                 ::std::is_same<KW,key_type>
     427             :               , ::boost::mp11::mp_if<Reference,reference,value_type>
     428             :               , Default
     429             :             >;
     430             : #endif
     431             :         };
     432             : 
     433             : #if !defined(BOOST_PARAMETER_CAN_USE_MP11)
     434             :         // Comma operator to compose argument list without using parameters<>.
     435             :         // Useful for argument lists with undetermined length.
     436             :         template <typename Keyword2, typename Arg2>
     437             :         inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
     438             :             ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
     439             :           , ::boost::parameter::aux::arg_list<
     440             :                 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     441             :             >
     442             :         >
     443             :             operator,(
     444             :                 ::boost::parameter::aux
     445             :                 ::tagged_argument<Keyword2,Arg2> const& x
     446             :             ) const
     447             :         {
     448             :             return boost::parameter::aux::arg_list<
     449             :                 ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
     450             :               , ::boost::parameter::aux::arg_list<
     451             :                     ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     452             :                 >
     453             :             >(
     454             :                 *this
     455             :               , ::boost::parameter::aux::arg_list<
     456             :                     ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     457             :                 >(x, ::boost::parameter::aux::empty_arg_list())
     458             :             );
     459             :         }
     460             : 
     461             :         template <typename Keyword2, typename Arg2>
     462             :         inline BOOST_CONSTEXPR ::boost::parameter::aux::arg_list<
     463             :             ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
     464             :           , ::boost::parameter::aux::arg_list<
     465             :                 ::boost::parameter::aux::tagged_argument_rref<Keyword2,Arg2>
     466             :             >
     467             :         >
     468             :             operator,(
     469             :                 ::boost::parameter::aux
     470             :                 ::tagged_argument_rref<Keyword2,Arg2> const& x
     471             :             ) const
     472             :         {
     473             :             return ::boost::parameter::aux::arg_list<
     474             :                 ::boost::parameter::aux::tagged_argument_rref<Keyword,Arg>
     475             :               , ::boost::parameter::aux::arg_list<
     476             :                     ::boost::parameter::aux
     477             :                     ::tagged_argument_rref<Keyword2,Arg2>
     478             :                 >
     479             :             >(
     480             :                 *this
     481             :               , ::boost::parameter::aux::arg_list<
     482             :                     ::boost::parameter::aux::tagged_argument_rref<
     483             :                         Keyword2
     484             :                       , Arg2
     485             :                     >
     486             :                 >(x, ::boost::parameter::aux::empty_arg_list())
     487             :             );
     488             :         }
     489             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     490             : 
     491             :         // Accessor interface.
     492             :         inline BOOST_CONSTEXPR reference get_value() const
     493             :         {
     494             :             return ::std::forward<Arg>(this->value);
     495             :         }
     496             : 
     497             :         inline BOOST_CONSTEXPR reference
     498             :             operator[](::boost::parameter::keyword<Keyword> const&) const
     499             :         {
     500             :             return this->get_value();
     501             :         }
     502             : 
     503             :         template <typename Default>
     504             :         inline BOOST_CONSTEXPR reference
     505             :             operator[](
     506             :                 ::boost::parameter::aux::default_<key_type,Default> const&
     507             :             ) const
     508             :         {
     509             :             return this->get_value();
     510             :         }
     511             : 
     512             :         template <typename Default>
     513             :         inline BOOST_CONSTEXPR reference
     514             :             operator[](
     515             :                 ::boost::parameter::aux::default_r_<key_type,Default> const&
     516             :             ) const
     517             :         {
     518             :             return this->get_value();
     519             :         }
     520             : 
     521             :         template <typename F>
     522             :         inline BOOST_CONSTEXPR reference
     523             :             operator[](
     524             :                 ::boost::parameter::aux::lazy_default<key_type,F> const&
     525             :             ) const
     526             :         {
     527             :             return this->get_value();
     528             :         }
     529             : 
     530             :         template <typename KW, typename Default>
     531             :         inline BOOST_CONSTEXPR Default&
     532             :             operator[](
     533             :                 ::boost::parameter::aux::default_<KW,Default> const& x
     534             :             ) const
     535             :         {
     536             :             return x.value;
     537             :         }
     538             : 
     539             :         template <typename KW, typename Default>
     540             :         inline BOOST_CONSTEXPR Default&&
     541             :             operator[](
     542             :                 ::boost::parameter::aux::default_r_<KW,Default> const& x
     543             :             ) const
     544             :         {
     545             :             return ::std::forward<Default>(x.value);
     546             :         }
     547             : 
     548             :         template <typename KW, typename F>
     549             :         inline BOOST_CONSTEXPR
     550             :         typename ::boost::parameter::aux::result_of0<F>::type
     551             :             operator[](
     552             :                 ::boost::parameter::aux::lazy_default<KW,F> const& x
     553             :             ) const
     554             :         {
     555             :             return x.compute_default();
     556             :         }
     557             : 
     558             :         template <typename ParameterRequirements>
     559             :         static BOOST_CONSTEXPR typename ParameterRequirements::has_default
     560             :             satisfies(ParameterRequirements*);
     561             : 
     562             :         template <typename HasDefault, typename Predicate>
     563             :         static BOOST_CONSTEXPR
     564             :         typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
     565             :             satisfies(
     566             :                 ::boost::parameter::aux::parameter_requirements<
     567             :                     key_type
     568             :                   , Predicate
     569             :                   , HasDefault
     570             :                 >*
     571             :             );
     572             : 
     573             :         // MPL sequence support
     574             :         // Convenience for users
     575             :         typedef ::boost::parameter::aux
     576             :         ::tagged_argument_rref<Keyword,Arg> type;
     577             :         // For the benefit of iterators
     578             :         typedef ::boost::parameter::aux::empty_arg_list tail_type;
     579             :         // For dispatching to sequence intrinsics
     580             :         typedef ::boost::parameter::aux::arg_list_tag tag;
     581             :     };
     582             : }}} // namespace boost::parameter::aux
     583             : 
     584             : #else   // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
     585             : 
     586             : namespace boost { namespace parameter { namespace aux {
     587             : 
     588             :     // Holds an lvalue reference to an argument of type Arg associated with
     589             :     // keyword Keyword
     590             :     template <typename Keyword, typename Arg>
     591             :     class tagged_argument
     592             :       : public ::boost::parameter::aux::tagged_argument_base
     593             :     {
     594             :         typedef typename ::boost::remove_const<Arg>::type arg_type;
     595             : 
     596             :      public:
     597             :         typedef Keyword key_type;
     598             : 
     599             :         // Wrap plain (non-UDT) function objects in either
     600             :         // a boost::function or a std::function. -- Cromwell D. Enage
     601             :         typedef typename ::boost::mpl::if_<
     602             :             ::boost::is_function<arg_type>
     603             : #if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL)
     604             :           , ::boost::function<arg_type>
     605             : #else
     606             :           , ::std::function<arg_type>
     607             : #endif
     608             :           , Arg
     609             :         >::type value_type;
     610             : 
     611             :         // If Arg is void_, then this type will evaluate to void_&.  If the
     612             :         // supplied argument is a plain function, then this type will evaluate
     613             :         // to a reference-to-const function wrapper type.  If the supplied
     614             :         // argument is an lvalue, then Arg will be deduced to the lvalue
     615             :         // reference. -- Cromwell D. Enage
     616             :         typedef typename ::boost::mpl::if_<
     617             :             ::boost::is_function<arg_type>
     618             :           , value_type const&
     619             :           , Arg&
     620             :         >::type reference;
     621             : 
     622             :      private:
     623             :         // Store plain functions by value, everything else by reference.
     624             :         // -- Cromwell D. Enage
     625             :         typename ::boost::mpl::if_<
     626             :             ::boost::is_function<arg_type>
     627             :           , value_type
     628             :           , reference
     629             :         >::type value;
     630             : 
     631             :      public:
     632             :         inline explicit BOOST_CONSTEXPR tagged_argument(reference x)
     633             :           : value(x)
     634             :         {
     635             :         }
     636             : 
     637             :         inline BOOST_CONSTEXPR tagged_argument(tagged_argument const& copy)
     638             :           : value(copy.value)
     639             :         {
     640             :         }
     641             : 
     642             :         // A metafunction class that, given a keyword and a default type,
     643             :         // returns the appropriate result type for a keyword lookup given
     644             :         // that default.
     645             :         struct binding
     646             :         {
     647             :             template <typename KW, typename Default, typename Reference>
     648             :             struct apply
     649             :             {
     650             :                 typedef typename ::boost::mpl::eval_if<
     651             :                     ::boost::is_same<KW,key_type>
     652             :                   , ::boost::mpl::if_<Reference,reference,value_type>
     653             :                   , ::boost::mpl::identity<Default>
     654             :                 >::type type;
     655             :             };
     656             :         };
     657             : 
     658             :         // Comma operator to compose argument list without using parameters<>.
     659             :         // Useful for argument lists with undetermined length.
     660             :         template <typename Keyword2, typename Arg2>
     661             :         inline ::boost::parameter::aux::arg_list<
     662             :             ::boost::parameter::aux::tagged_argument<Keyword,Arg>
     663             :           , ::boost::parameter::aux::arg_list<
     664             :                 ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     665             :             > 
     666             :         >
     667             :             operator,(
     668             :                 ::boost::parameter::aux
     669             :                 ::tagged_argument<Keyword2,Arg2> const& x
     670             :             ) const
     671             :         {
     672             :             return ::boost::parameter::aux::arg_list<
     673             :                 ::boost::parameter::aux::tagged_argument<Keyword,Arg>
     674             :               , ::boost::parameter::aux::arg_list<
     675             :                     ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     676             :                 > 
     677             :             >(
     678             :                 *this
     679             :               , ::boost::parameter::aux::arg_list<
     680             :                     ::boost::parameter::aux::tagged_argument<Keyword2,Arg2>
     681             :                 >(x, ::boost::parameter::aux::empty_arg_list())
     682             :             );
     683             :         }
     684             : 
     685             :         // Accessor interface.
     686             :         inline BOOST_CONSTEXPR reference get_value() const
     687             :         {
     688             :             return this->value;
     689             :         }
     690             : 
     691             :         inline BOOST_CONSTEXPR reference
     692             :             operator[](::boost::parameter::keyword<Keyword> const&) const
     693             :         {
     694             :             return this->get_value();
     695             :         }
     696             : 
     697             : #if defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || \
     698             :     BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
     699             :         template <typename KW, typename Default>
     700             :         inline BOOST_CONSTEXPR Default&
     701             :             get_with_default(
     702             :                 ::boost::parameter::aux::default_<KW,Default> const& x
     703             :               , int
     704             :             ) const
     705             :         {
     706             :             return x.value;
     707             :         }
     708             : 
     709             :         template <typename Default>
     710             :         inline BOOST_CONSTEXPR reference
     711             :             get_with_default(
     712             :                 ::boost::parameter::aux::default_<key_type,Default> const&
     713             :               , long
     714             :             ) const
     715             :         {
     716             :             return this->get_value();
     717             :         }
     718             : 
     719             :         template <typename KW, typename Default>
     720             :         inline BOOST_CONSTEXPR typename ::boost::mpl::apply_wrap3<
     721             :             binding
     722             :           , KW
     723             :           , Default&
     724             :           , ::boost::mpl::true_
     725             :         >::type
     726             :             operator[](
     727             :                 ::boost::parameter::aux::default_<KW,Default> const& x
     728             :             ) const
     729             :         {
     730             :             return this->get_with_default(x, 0L);
     731             :         }
     732             : 
     733             :         template <typename KW, typename F>
     734             :         inline BOOST_CONSTEXPR
     735             :         typename ::boost::parameter::aux::result_of0<F>::type
     736             :             get_with_lazy_default(
     737             :                 ::boost::parameter::aux::lazy_default<KW,F> const& x
     738             :               , int
     739             :             ) const
     740             :         {
     741             :             return x.compute_default();
     742             :         }
     743             : 
     744             :         template <typename F>
     745             :         inline BOOST_CONSTEXPR reference
     746             :             get_with_lazy_default(
     747             :                 ::boost::parameter::aux::lazy_default<key_type,F> const&
     748             :               , long
     749             :             ) const
     750             :         {
     751             :             return this->get_value();
     752             :         }
     753             : 
     754             :         template <typename KW, typename F>
     755             :         inline BOOST_CONSTEXPR typename ::boost::mpl::apply_wrap3<
     756             :             binding
     757             :           , KW
     758             :           , typename ::boost::parameter::aux::result_of0<F>::type
     759             :           , ::boost::mpl::true_
     760             :         >::type
     761             :             operator[](
     762             :                 ::boost::parameter::aux::lazy_default<KW,F> const& x
     763             :             ) const
     764             :         {
     765             :             return this->get_with_lazy_default(x, 0L);
     766             :         }
     767             : #else   // No function template ordering or Borland workarounds needed.
     768             :         template <typename Default>
     769             :         inline BOOST_CONSTEXPR reference
     770             :             operator[](
     771             :                 ::boost::parameter::aux::default_<key_type,Default> const&
     772             :             ) const
     773             :         {
     774             :             return this->get_value();
     775             :         }
     776             : 
     777             :         template <typename F>
     778             :         inline BOOST_CONSTEXPR reference
     779             :             operator[](
     780             :                 ::boost::parameter::aux::lazy_default<key_type,F> const&
     781             :             ) const
     782             :         {
     783             :             return this->get_value();
     784             :         }
     785             : 
     786             :         template <typename KW, typename Default>
     787             :         inline BOOST_CONSTEXPR Default&
     788             :             operator[](
     789             :                 ::boost::parameter::aux::default_<KW,Default> const& x
     790             :             ) const
     791             :         {
     792             :             return x.value;
     793             :         }
     794             : 
     795             :         template <typename KW, typename F>
     796             :         inline BOOST_CONSTEXPR
     797             :         typename ::boost::parameter::aux::result_of0<F>::type
     798             :             operator[](
     799             :                 ::boost::parameter::aux::lazy_default<KW,F> const& x
     800             :             ) const
     801             :         {
     802             :             return x.compute_default();
     803             :         }
     804             : 
     805             :         template <typename ParameterRequirements>
     806             :         static BOOST_CONSTEXPR typename ParameterRequirements::has_default
     807             :             satisfies(ParameterRequirements*);
     808             : 
     809             :         template <typename HasDefault, typename Predicate>
     810             :         static BOOST_CONSTEXPR
     811             :         typename ::boost::mpl::apply_wrap1<Predicate,value_type>::type
     812             :             satisfies(
     813             :                 ::boost::parameter::aux::parameter_requirements<
     814             :                     key_type
     815             :                   , Predicate
     816             :                   , HasDefault
     817             :                 >*
     818             :             );
     819             : #endif  // Function template ordering, Borland workarounds needed.
     820             : 
     821             :         // MPL sequence support
     822             :         // Convenience for users
     823             :         typedef ::boost::parameter::aux::tagged_argument<Keyword,Arg> type;
     824             :         // For the benefit of iterators
     825             :         typedef ::boost::parameter::aux::empty_arg_list tail_type;
     826             :         // For dispatching to sequence intrinsics
     827             :         typedef ::boost::parameter::aux::arg_list_tag tag;
     828             : 
     829             : #if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
     830             :         // warning suppression
     831             :      private:
     832             :         void operator=(type const&);
     833             : #endif
     834             :     };
     835             : }}} // namespace boost::parameter::aux
     836             : 
     837             : #endif  // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
     838             : 
     839             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     840             : 
     841             : namespace boost { namespace parameter { namespace aux {
     842             : 
     843             :     template <typename TaggedArg>
     844             :     struct tagged_argument_list_of_1 : public TaggedArg
     845             :     {
     846             :         using base_type = TaggedArg;
     847             : 
     848             :         inline explicit BOOST_CONSTEXPR tagged_argument_list_of_1(
     849             :             typename base_type::reference x
     850             :         ) : base_type(static_cast<typename base_type::reference>(x))
     851             :         {
     852             :         }
     853             : 
     854             :         inline BOOST_CONSTEXPR tagged_argument_list_of_1(
     855             :             tagged_argument_list_of_1 const& copy
     856             :         ) : base_type(static_cast<base_type const&>(copy))
     857             :         {
     858             :         }
     859             : 
     860             :         using base_type::operator[];
     861             :         using base_type::satisfies;
     862             : 
     863             :         template <typename TA2>
     864             :         inline BOOST_CONSTEXPR ::boost::parameter::aux::flat_like_arg_list<
     865             :             ::boost::parameter::aux
     866             :             ::flat_like_arg_tuple<typename TaggedArg::key_type,TaggedArg>
     867             :           , ::boost::parameter::aux::flat_like_arg_tuple<
     868             :                 typename TA2::base_type::key_type
     869             :               , typename TA2::base_type
     870             :             >
     871             :         >
     872             :             operator,(TA2 const& x) const
     873             :         {
     874             :             return boost::parameter::aux::flat_like_arg_list<
     875             :                 ::boost::parameter::aux
     876             :                 ::flat_like_arg_tuple<typename TaggedArg::key_type,TaggedArg>
     877             :               , ::boost::parameter::aux::flat_like_arg_tuple<
     878             :                     typename TA2::base_type::key_type
     879             :                   , typename TA2::base_type
     880             :                 >
     881             :             >(
     882             :                 static_cast<base_type const&>(*this)
     883             :               , ::boost::parameter::aux::arg_list<typename TA2::base_type>(
     884             :                     static_cast<typename TA2::base_type const&>(x)
     885             :                   , ::boost::parameter::aux::empty_arg_list()
     886             :                 )
     887             :             );
     888             :         }
     889             :     };
     890             : }}} // namespace boost::parameter::aux
     891             : 
     892             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     893             : #endif  // include guard
     894             : 

Generated by: LCOV version 1.14