LCOV - code coverage report
Current view: top level - usr/include/boost/parameter - keyword.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 KEYWORD_050328_HPP
       8             : #define KEYWORD_050328_HPP
       9             : 
      10             : #include <boost/parameter/aux_/tag.hpp>
      11             : #include <boost/parameter/aux_/default.hpp>
      12             : #include <boost/parameter/keyword_fwd.hpp>
      13             : #include <boost/parameter/config.hpp>
      14             : 
      15             : #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
      16             : #include <boost/core/enable_if.hpp>
      17             : #include <utility>
      18             : 
      19             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
      20             : #include <boost/mp11/integral.hpp>
      21             : #include <boost/mp11/utility.hpp>
      22             : #include <type_traits>
      23             : #else
      24             : #include <boost/mpl/bool.hpp>
      25             : #include <boost/mpl/if.hpp>
      26             : #include <boost/mpl/eval_if.hpp>
      27             : #include <boost/type_traits/is_same.hpp>
      28             : #include <boost/type_traits/is_scalar.hpp>
      29             : #include <boost/type_traits/is_const.hpp>
      30             : #endif
      31             : 
      32             : namespace boost { namespace parameter {
      33             : 
      34             :     // Instances of unique specializations of keyword<...> serve to
      35             :     // associate arguments with parameter names.  For example:
      36             :     //
      37             :     //     struct rate_;             // parameter names
      38             :     //     struct skew_;
      39             :     //
      40             :     //     namespace
      41             :     //     {
      42             :     //         keyword<rate_> rate;  // keywords
      43             :     //         keyword<skew_> skew;
      44             :     //     }
      45             :     //
      46             :     //     ...
      47             :     //
      48             :     //     f(rate = 1, skew = 2.4);
      49             :     template <typename Tag>
      50             :     struct keyword
      51             :     {
      52             :         typedef Tag tag;
      53             : 
      54             :         inline BOOST_CONSTEXPR keyword()
      55             :         {
      56             :         }
      57             : 
      58             :         template <typename T>
      59             :         inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
      60             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
      61             :             ::boost::mp11::mp_if<
      62             :                 ::std::is_scalar<T>
      63             :               , ::boost::mp11::mp_true
      64             :               , ::boost::mp11::mp_if<
      65             :                     ::std::is_same<
      66             :                         typename Tag::qualifier
      67             :                       , ::boost::parameter::in_reference
      68             :                     >
      69             :                   , ::boost::mp11::mp_true
      70             :                   , ::std::is_same<
      71             :                         typename Tag::qualifier
      72             :                       , ::boost::parameter::forward_reference
      73             :                     >
      74             :                 >
      75             :             >
      76             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
      77             :             typename ::boost::mpl::eval_if<
      78             :                 ::boost::is_scalar<T>
      79             :               , ::boost::mpl::true_
      80             :               , ::boost::mpl::eval_if<
      81             :                     ::boost::is_same<
      82             :                         typename Tag::qualifier
      83             :                       , ::boost::parameter::in_reference
      84             :                     >
      85             :                   , ::boost::mpl::true_
      86             :                   , ::boost::mpl::if_<
      87             :                         ::boost::is_same<
      88             :                             typename Tag::qualifier
      89             :                           , ::boost::parameter::forward_reference
      90             :                         >
      91             :                       , ::boost::mpl::true_
      92             :                       , ::boost::mpl::false_
      93             :                     >
      94             :                 >
      95             :             >::type
      96             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
      97             :           , ::boost::parameter::aux::tag<Tag,T const&>
      98             :         >::type
      99             :             operator=(T const& x) const
     100             :         {
     101             :             typedef typename ::boost::parameter::aux
     102             :             ::tag<Tag,T const&>::type result;
     103             :             return result(x);
     104             :         }
     105             : 
     106             :         template <typename Default>
     107             :         inline BOOST_CONSTEXPR typename ::boost::enable_if<
     108             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     109             :             ::boost::mp11::mp_if<
     110             :                 ::std::is_scalar<Default>
     111             :               , ::boost::mp11::mp_true
     112             :               , ::boost::mp11::mp_if<
     113             :                     ::std::is_same<
     114             :                         typename Tag::qualifier
     115             :                       , ::boost::parameter::in_reference
     116             :                     >
     117             :                   , ::boost::mp11::mp_true
     118             :                   , ::std::is_same<
     119             :                         typename Tag::qualifier
     120             :                       , ::boost::parameter::forward_reference
     121             :                     >
     122             :                 >
     123             :             >
     124             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     125             :             typename ::boost::mpl::eval_if<
     126             :                 ::boost::is_scalar<Default>
     127             :               , ::boost::mpl::true_
     128             :               , ::boost::mpl::eval_if<
     129             :                     ::boost::is_same<
     130             :                         typename Tag::qualifier
     131             :                       , ::boost::parameter::in_reference
     132             :                     >
     133             :                   , ::boost::mpl::true_
     134             :                   , ::boost::mpl::if_<
     135             :                         ::boost::is_same<
     136             :                             typename Tag::qualifier
     137             :                           , ::boost::parameter::forward_reference
     138             :                         >
     139             :                       , ::boost::mpl::true_
     140             :                       , ::boost::mpl::false_
     141             :                     >
     142             :                 >
     143             :             >::type
     144             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     145             :           , ::boost::parameter::aux::default_<Tag,Default const>
     146             :         >::type
     147             :             operator|(Default const& d) const
     148             :         {
     149             :             return ::boost::parameter::aux::default_<Tag,Default const>(d);
     150             :         }
     151             : 
     152             :         template <typename T>
     153             :         inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
     154             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     155             :             ::boost::mp11::mp_if<
     156             :                 ::boost::mp11::mp_if<
     157             :                     ::std::is_same<
     158             :                         typename Tag::qualifier
     159             :                       , ::boost::parameter::out_reference
     160             :                     >
     161             :                   , ::boost::mp11::mp_true
     162             :                   , ::std::is_same<
     163             :                         typename Tag::qualifier
     164             :                       , ::boost::parameter::forward_reference
     165             :                     >
     166             :                 >
     167             :               , ::boost::mp11::mp_if<
     168             :                     ::std::is_const<T>
     169             :                   , ::boost::mp11::mp_false
     170             :                   , ::boost::mp11::mp_true
     171             :                 >
     172             :               , ::boost::mp11::mp_false
     173             :             >
     174             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     175             :             typename ::boost::mpl::eval_if<
     176             :                 typename ::boost::mpl::if_<
     177             :                     ::boost::is_same<
     178             :                         typename Tag::qualifier
     179             :                       , ::boost::parameter::out_reference
     180             :                     >
     181             :                   , ::boost::mpl::true_
     182             :                   , ::boost::is_same<
     183             :                         typename Tag::qualifier
     184             :                       , ::boost::parameter::forward_reference
     185             :                     >
     186             :                 >::type
     187             :               , ::boost::mpl::if_<
     188             :                     ::boost::is_const<T>
     189             :                   , ::boost::mpl::false_
     190             :                   , ::boost::mpl::true_
     191             :                 >
     192             :               , ::boost::mpl::false_
     193             :             >::type
     194             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     195             :           , ::boost::parameter::aux::tag<Tag,T&>
     196             :         >::type
     197             :             operator=(T& x) const
     198             :         {
     199             :             typedef typename ::boost::parameter::aux
     200             :             ::tag<Tag,T&>::type result;
     201             :             return result(x);
     202             :         }
     203             : 
     204             :         template <typename Default>
     205             :         inline BOOST_CONSTEXPR typename ::boost::enable_if<
     206             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     207             :             ::boost::mp11::mp_if<
     208             :                 ::boost::mp11::mp_if<
     209             :                     ::std::is_same<
     210             :                         typename Tag::qualifier
     211             :                       , ::boost::parameter::out_reference
     212             :                     >
     213             :                   , ::boost::mp11::mp_true
     214             :                   , ::std::is_same<
     215             :                         typename Tag::qualifier
     216             :                       , ::boost::parameter::forward_reference
     217             :                     >
     218             :                 >
     219             :               , ::boost::mp11::mp_if<
     220             :                     ::std::is_const<Default>
     221             :                   , ::boost::mp11::mp_false
     222             :                   , ::boost::mp11::mp_true
     223             :                 >
     224             :               , ::boost::mp11::mp_false
     225             :             >
     226             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     227             :             typename ::boost::mpl::eval_if<
     228             :                 typename ::boost::mpl::if_<
     229             :                     ::boost::is_same<
     230             :                         typename Tag::qualifier
     231             :                       , ::boost::parameter::out_reference
     232             :                     >
     233             :                   , ::boost::mpl::true_
     234             :                   , ::boost::is_same<
     235             :                         typename Tag::qualifier
     236             :                       , ::boost::parameter::forward_reference
     237             :                     >
     238             :                 >::type
     239             :               , ::boost::mpl::if_<
     240             :                     ::boost::is_const<Default>
     241             :                   , ::boost::mpl::false_
     242             :                   , ::boost::mpl::true_
     243             :                 >
     244             :               , ::boost::mpl::false_
     245             :             >::type
     246             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     247             :           , ::boost::parameter::aux::default_<Tag,Default>
     248             :         >::type
     249             :             operator|(Default& d) const
     250             :         {
     251             :             return ::boost::parameter::aux::default_<Tag,Default>(d);
     252             :         }
     253             : 
     254             :         template <typename Default>
     255             :         inline BOOST_CONSTEXPR
     256             :         ::boost::parameter::aux::lazy_default<Tag,Default const>
     257           0 :             operator||(Default const& d) const
     258             :         {
     259             :             return ::boost::parameter::aux
     260           0 :             ::lazy_default<Tag,Default const>(d);
     261             :         }
     262             : 
     263             :         template <typename Default>
     264             :         inline BOOST_CONSTEXPR
     265             :         ::boost::parameter::aux::lazy_default<Tag,Default>
     266             :             operator||(Default& d) const
     267             :         {
     268             :             return ::boost::parameter::aux::lazy_default<Tag,Default>(d);
     269             :         }
     270             : 
     271             :         template <typename T>
     272             :         inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
     273             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     274             :             ::boost::mp11::mp_if<
     275             :                 ::std::is_scalar<T>
     276             :               , ::boost::mp11::mp_false
     277             :               , ::boost::mp11::mp_if<
     278             :                     ::std::is_same<
     279             :                         typename Tag::qualifier
     280             :                       , ::boost::parameter::in_reference
     281             :                     >
     282             :                   , ::boost::mp11::mp_true
     283             :                   , ::std::is_same<
     284             :                         typename Tag::qualifier
     285             :                       , ::boost::parameter::forward_reference
     286             :                     >
     287             :                 >
     288             :             >
     289             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     290             :             typename ::boost::mpl::eval_if<
     291             :                 ::boost::is_scalar<T>
     292             :               , ::boost::mpl::false_
     293             :               , ::boost::mpl::eval_if<
     294             :                     ::boost::is_same<
     295             :                         typename Tag::qualifier
     296             :                       , ::boost::parameter::in_reference
     297             :                     >
     298             :                   , ::boost::mpl::true_
     299             :                   , ::boost::mpl::if_<
     300             :                         ::boost::is_same<
     301             :                             typename Tag::qualifier
     302             :                           , ::boost::parameter::forward_reference
     303             :                         >
     304             :                       , ::boost::mpl::true_
     305             :                       , ::boost::mpl::false_
     306             :                     >
     307             :                 >
     308             :             >::type
     309             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     310             :           , ::boost::parameter::aux::tag<Tag,T const>
     311             :         >::type
     312             :             operator=(T const&& x) const
     313             :         {
     314             :             typedef typename ::boost::parameter::aux
     315             :             ::tag<Tag,T const>::type result;
     316             :             return result(::std::forward<T const>(x));
     317             :         }
     318             : 
     319             :         template <typename T>
     320             :         inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
     321             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     322             :             ::boost::mp11::mp_if<
     323             :                 ::std::is_scalar<T>
     324             :               , ::boost::mp11::mp_false
     325             :               , ::boost::mp11::mp_if<
     326             :                     ::std::is_same<
     327             :                         typename Tag::qualifier
     328             :                       , ::boost::parameter::consume_reference
     329             :                     >
     330             :                   , ::boost::mp11::mp_true
     331             :                   , ::std::is_same<
     332             :                         typename Tag::qualifier
     333             :                       , ::boost::parameter::forward_reference
     334             :                     >
     335             :                 >
     336             :             >
     337             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     338             :             typename ::boost::mpl::eval_if<
     339             :                 ::boost::is_scalar<T>
     340             :               , ::boost::mpl::false_
     341             :               , ::boost::mpl::eval_if<
     342             :                     ::boost::is_same<
     343             :                         typename Tag::qualifier
     344             :                       , ::boost::parameter::consume_reference
     345             :                     >
     346             :                   , ::boost::mpl::true_
     347             :                   , ::boost::mpl::if_<
     348             :                         ::boost::is_same<
     349             :                             typename Tag::qualifier
     350             :                           , ::boost::parameter::forward_reference
     351             :                         >
     352             :                       , ::boost::mpl::true_
     353             :                       , ::boost::mpl::false_
     354             :                     >
     355             :                 >
     356             :             >::type
     357             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     358             :           , ::boost::parameter::aux::tag<Tag,T>
     359             :         >::type
     360             :             operator=(T&& x) const
     361             :         {
     362             :             typedef typename ::boost::parameter::aux::tag<Tag,T>::type result;
     363             :             return result(::std::forward<T>(x));
     364             :         }
     365             : 
     366             :         template <typename Default>
     367             :         inline BOOST_CONSTEXPR typename ::boost::enable_if<
     368             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     369             :             ::boost::mp11::mp_if<
     370             :                 ::std::is_scalar<Default>
     371             :               , ::boost::mp11::mp_false
     372             :               , ::boost::mp11::mp_if<
     373             :                     ::std::is_same<
     374             :                         typename Tag::qualifier
     375             :                       , ::boost::parameter::in_reference
     376             :                     >
     377             :                   , ::boost::mp11::mp_true
     378             :                   , ::std::is_same<
     379             :                         typename Tag::qualifier
     380             :                       , ::boost::parameter::forward_reference
     381             :                     >
     382             :                 >
     383             :             >
     384             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     385             :             typename ::boost::mpl::eval_if<
     386             :                 ::boost::is_scalar<Default>
     387             :               , ::boost::mpl::false_
     388             :               , ::boost::mpl::eval_if<
     389             :                     ::boost::is_same<
     390             :                         typename Tag::qualifier
     391             :                       , ::boost::parameter::in_reference
     392             :                     >
     393             :                   , ::boost::mpl::true_
     394             :                   , ::boost::mpl::if_<
     395             :                         ::boost::is_same<
     396             :                             typename Tag::qualifier
     397             :                           , ::boost::parameter::forward_reference
     398             :                         >
     399             :                       , ::boost::mpl::true_
     400             :                       , ::boost::mpl::false_
     401             :                     >
     402             :                 >
     403             :             >::type
     404             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     405             :           , ::boost::parameter::aux::default_r_<Tag,Default const>
     406             :         >::type
     407             :             operator|(Default const&& d) const
     408             :         {
     409             :             return ::boost::parameter::aux::default_r_<Tag,Default const>(
     410             :                 ::std::forward<Default const>(d)
     411             :             );
     412             :         }
     413             : 
     414             :         template <typename Default>
     415             :         inline BOOST_CONSTEXPR typename ::boost::enable_if<
     416             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     417             :             ::boost::mp11::mp_if<
     418             :                 ::std::is_scalar<Default>
     419             :               , ::boost::mp11::mp_false
     420             :               , ::boost::mp11::mp_if<
     421             :                     ::std::is_same<
     422             :                         typename Tag::qualifier
     423             :                       , ::boost::parameter::consume_reference
     424             :                     >
     425             :                   , ::boost::mp11::mp_true
     426             :                   , ::std::is_same<
     427             :                         typename Tag::qualifier
     428             :                       , ::boost::parameter::forward_reference
     429             :                     >
     430             :                 >
     431             :             >
     432             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     433             :             typename ::boost::mpl::eval_if<
     434             :                 ::boost::is_scalar<Default>
     435             :               , ::boost::mpl::false_
     436             :               , ::boost::mpl::eval_if<
     437             :                     ::boost::is_same<
     438             :                         typename Tag::qualifier
     439             :                       , ::boost::parameter::consume_reference
     440             :                     >
     441             :                   , ::boost::mpl::true_
     442             :                   , ::boost::mpl::if_<
     443             :                         ::boost::is_same<
     444             :                             typename Tag::qualifier
     445             :                           , ::boost::parameter::forward_reference
     446             :                         >
     447             :                       , ::boost::mpl::true_
     448             :                       , ::boost::mpl::false_
     449             :                     >
     450             :                 >
     451             :             >::type
     452             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     453             :           , ::boost::parameter::aux::default_r_<Tag,Default>
     454             :         >::type
     455           0 :             operator|(Default&& d) const
     456             :         {
     457             :             return ::boost::parameter::aux
     458           0 :             ::default_r_<Tag,Default>(::std::forward<Default>(d));
     459             :         }
     460             : 
     461             :      public: // Insurance against ODR violations
     462             :         // Users will need to define their keywords in header files.  To
     463             :         // prevent ODR violations, it's important that the keyword used in
     464             :         // every instantiation of a function template is the same object.
     465             :         // We provide a reference to a common instance of each keyword
     466             :         // object and prevent construction by users.
     467             :         static ::boost::parameter::keyword<Tag> const instance;
     468             : 
     469             :         // This interface is deprecated.
     470             :         static ::boost::parameter::keyword<Tag>& get()
     471             :         {
     472             :             return const_cast< ::boost::parameter::keyword<Tag>&>(instance);
     473             :         }
     474             :     };
     475             : 
     476             :     template <typename Tag>
     477             :     ::boost::parameter::keyword<Tag> const ::boost::parameter
     478             :     ::keyword<Tag>::instance = ::boost::parameter::keyword<Tag>();
     479             : }} // namespace boost::parameter
     480             : 
     481             : #else   // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
     482             : 
     483             : #if !defined(BOOST_NO_SFINAE)
     484             : #include <boost/mpl/bool.hpp>
     485             : #include <boost/mpl/if.hpp>
     486             : #include <boost/mpl/eval_if.hpp>
     487             : #include <boost/core/enable_if.hpp>
     488             : #include <boost/type_traits/is_same.hpp>
     489             : #include <boost/type_traits/is_scalar.hpp>
     490             : #include <boost/type_traits/is_const.hpp>
     491             : #endif  // BOOST_NO_SFINAE
     492             : 
     493             : namespace boost { namespace parameter {
     494             : 
     495             :     // Instances of unique specializations of keyword<...> serve to
     496             :     // associate arguments with parameter names.  For example:
     497             :     //
     498             :     //     struct rate_;             // parameter names
     499             :     //     struct skew_;
     500             :     //
     501             :     //     namespace
     502             :     //     {
     503             :     //         keyword<rate_> rate;  // keywords
     504             :     //         keyword<skew_> skew;
     505             :     //     }
     506             :     //
     507             :     //     ...
     508             :     //
     509             :     //     f(rate = 1, skew = 2.4);
     510             :     template <typename Tag>
     511             :     struct keyword
     512             :     {
     513             :         typedef Tag tag;
     514             : 
     515             :         inline BOOST_CONSTEXPR keyword()
     516             :         {
     517             :         }
     518             : 
     519             :         template <typename T>
     520             : #if defined(BOOST_NO_SFINAE)
     521             :         inline typename ::boost::parameter::aux::tag<Tag,T const&>::type
     522             : #else
     523             :         inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
     524             :             typename ::boost::mpl::eval_if<
     525             :                 ::boost::is_scalar<T>
     526             :               , ::boost::mpl::true_
     527             :               , ::boost::mpl::eval_if<
     528             :                     ::boost::is_same<
     529             :                         typename Tag::qualifier
     530             :                       , ::boost::parameter::in_reference
     531             :                     >
     532             :                   , ::boost::mpl::true_
     533             :                   , ::boost::mpl::if_<
     534             :                         ::boost::is_same<
     535             :                             typename Tag::qualifier
     536             :                           , ::boost::parameter::forward_reference
     537             :                         >
     538             :                       , ::boost::mpl::true_
     539             :                       , ::boost::mpl::false_
     540             :                     >
     541             :                 >
     542             :             >::type
     543             :           , ::boost::parameter::aux::tag<Tag,T const&>
     544             :         >::type
     545             : #endif  // BOOST_NO_SFINAE
     546             :             operator=(T const& x) const
     547             :         {
     548             :             typedef typename ::boost::parameter::aux
     549             :             ::tag<Tag,T const&>::type result;
     550             :             return result(x);
     551             :         }
     552             : 
     553             :         template <typename Default>
     554             : #if defined(BOOST_NO_SFINAE)
     555             :         inline ::boost::parameter::aux::default_<Tag,Default const>
     556             : #else
     557             :         inline BOOST_CONSTEXPR typename ::boost::enable_if<
     558             :             typename ::boost::mpl::eval_if<
     559             :                 ::boost::is_scalar<Default>
     560             :               , ::boost::mpl::true_
     561             :               , ::boost::mpl::eval_if<
     562             :                     ::boost::is_same<
     563             :                         typename Tag::qualifier
     564             :                       , ::boost::parameter::in_reference
     565             :                     >
     566             :                   , ::boost::mpl::true_
     567             :                   , ::boost::mpl::if_<
     568             :                         ::boost::is_same<
     569             :                             typename Tag::qualifier
     570             :                           , ::boost::parameter::forward_reference
     571             :                         >
     572             :                       , ::boost::mpl::true_
     573             :                       , ::boost::mpl::false_
     574             :                     >
     575             :                 >
     576             :             >::type
     577             :           , ::boost::parameter::aux::default_<Tag,Default const>
     578             :         >::type
     579             : #endif  // BOOST_NO_SFINAE
     580             :             operator|(Default const& d) const
     581             :         {
     582             :             return ::boost::parameter::aux::default_<Tag,Default const>(d);
     583             :         }
     584             : 
     585             :         template <typename T>
     586             : #if defined(BOOST_NO_SFINAE)
     587             :         inline typename ::boost::parameter::aux::tag<Tag,T&>::type
     588             : #else
     589             :         inline BOOST_CONSTEXPR typename ::boost::lazy_enable_if<
     590             :             typename ::boost::mpl::eval_if<
     591             :                 typename ::boost::mpl::if_<
     592             :                     ::boost::is_same<
     593             :                         typename Tag::qualifier
     594             :                       , ::boost::parameter::out_reference
     595             :                     >
     596             :                   , ::boost::mpl::true_
     597             :                   , ::boost::is_same<
     598             :                         typename Tag::qualifier
     599             :                       , ::boost::parameter::forward_reference
     600             :                     >
     601             :                 >::type
     602             :               , ::boost::mpl::if_<
     603             :                     ::boost::is_const<T>
     604             :                   , ::boost::mpl::false_
     605             :                   , ::boost::mpl::true_
     606             :                 >
     607             :               , ::boost::mpl::false_
     608             :             >::type
     609             :           , ::boost::parameter::aux::tag<Tag,T&>
     610             :         >::type
     611             : #endif  // BOOST_NO_SFINAE
     612             :             operator=(T& x) const
     613             :         {
     614             :             typedef typename ::boost::parameter::aux
     615             :             ::tag<Tag,T&>::type result;
     616             :             return result(x);
     617             :         }
     618             : 
     619             :         template <typename Default>
     620             : #if defined(BOOST_NO_SFINAE)
     621             :         inline ::boost::parameter::aux::default_<Tag,Default>
     622             : #else
     623             :         inline BOOST_CONSTEXPR typename ::boost::enable_if<
     624             :             typename ::boost::mpl::eval_if<
     625             :                 typename ::boost::mpl::if_<
     626             :                     ::boost::is_same<
     627             :                         typename Tag::qualifier
     628             :                       , ::boost::parameter::out_reference
     629             :                     >
     630             :                   , ::boost::mpl::true_
     631             :                   , ::boost::is_same<
     632             :                         typename Tag::qualifier
     633             :                       , ::boost::parameter::forward_reference
     634             :                     >
     635             :                 >::type
     636             :               , ::boost::mpl::if_<
     637             :                     ::boost::is_const<Default>
     638             :                   , ::boost::mpl::false_
     639             :                   , ::boost::mpl::true_
     640             :                 >
     641             :               , ::boost::mpl::false_
     642             :             >::type
     643             :           , ::boost::parameter::aux::default_<Tag,Default>
     644             :         >::type
     645             : #endif  // BOOST_NO_SFINAE
     646             :             operator|(Default& d) const
     647             :         {
     648             :             return ::boost::parameter::aux::default_<Tag,Default>(d);
     649             :         }
     650             : 
     651             :         template <typename Default>
     652             :         inline BOOST_CONSTEXPR
     653             :         ::boost::parameter::aux::lazy_default<Tag,Default const>
     654             :             operator||(Default const& d) const
     655             :         {
     656             :             return ::boost::parameter::aux
     657             :             ::lazy_default<Tag,Default const>(d);
     658             :         }
     659             : 
     660             :         template <typename Default>
     661             :         inline BOOST_CONSTEXPR
     662             :         ::boost::parameter::aux::lazy_default<Tag,Default>
     663             :             operator||(Default& d) const
     664             :         {
     665             :             return ::boost::parameter::aux::lazy_default<Tag,Default>(d);
     666             :         }
     667             : 
     668             :      public: // Insurance against ODR violations
     669             :         // Users will need to define their keywords in header files.  To
     670             :         // prevent ODR violations, it's important that the keyword used in
     671             :         // every instantiation of a function template is the same object.
     672             :         // We provide a reference to a common instance of each keyword
     673             :         // object and prevent construction by users.
     674             :         static ::boost::parameter::keyword<Tag> const instance;
     675             : 
     676             :         // This interface is deprecated.
     677             :         static ::boost::parameter::keyword<Tag>& get()
     678             :         {
     679             :             return const_cast< ::boost::parameter::keyword<Tag>&>(instance);
     680             :         }
     681             :     };
     682             : 
     683             :     template <typename Tag>
     684             :     ::boost::parameter::keyword<Tag> const ::boost::parameter
     685             :     ::keyword<Tag>::instance = ::boost::parameter::keyword<Tag>();
     686             : }} // namespace boost::parameter
     687             : 
     688             : #endif  // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
     689             : 
     690             : #include <boost/parameter/aux_/name.hpp>
     691             : #include <boost/preprocessor/stringize.hpp>
     692             : 
     693             : // Reduces boilerplate required to declare and initialize keywords without
     694             : // violating ODR.  Declares a keyword tag type with the given name in
     695             : // namespace tag_namespace, and declares and initializes a reference in an
     696             : // anonymous namespace to a singleton instance of that type.
     697             : #if defined(BOOST_PARAMETER_CAN_USE_MP11)
     698             : #define BOOST_PARAMETER_KEYWORD(tag_namespace, name)                         \
     699             :     namespace tag_namespace                                                  \
     700             :     {                                                                        \
     701             :         struct name                                                          \
     702             :         {                                                                    \
     703             :             static BOOST_CONSTEXPR char const* keyword_name()                \
     704             :             {                                                                \
     705             :                 return BOOST_PP_STRINGIZE(name);                             \
     706             :             }                                                                \
     707             :             using _ = BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(name);            \
     708             :             using _1 = _;                                                    \
     709             :             BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_BINDING(binding_fn, name);  \
     710             :             BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_VALUE(fn, name);            \
     711             :             using qualifier = ::boost::parameter::forward_reference;         \
     712             :         };                                                                   \
     713             :     }                                                                        \
     714             :     namespace                                                                \
     715             :     {                                                                        \
     716             :         ::boost::parameter::keyword<tag_namespace::name> const& name         \
     717             :             = ::boost::parameter::keyword<tag_namespace::name>::instance;    \
     718             :     }
     719             : /**/
     720             : #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
     721             : #define BOOST_PARAMETER_KEYWORD(tag_namespace, name)                         \
     722             :     namespace tag_namespace                                                  \
     723             :     {                                                                        \
     724             :         struct name                                                          \
     725             :         {                                                                    \
     726             :             static BOOST_CONSTEXPR char const* keyword_name()                \
     727             :             {                                                                \
     728             :                 return BOOST_PP_STRINGIZE(name);                             \
     729             :             }                                                                \
     730             :             typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(name) _;            \
     731             :             typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(name) _1;           \
     732             :             typedef ::boost::parameter::forward_reference qualifier;         \
     733             :         };                                                                   \
     734             :     }                                                                        \
     735             :     namespace                                                                \
     736             :     {                                                                        \
     737             :         ::boost::parameter::keyword<tag_namespace::name> const& name         \
     738             :             = ::boost::parameter::keyword<tag_namespace::name>::instance;    \
     739             :     }
     740             : /**/
     741             : #endif  // BOOST_PARAMETER_CAN_USE_MP11
     742             : 
     743             : #endif  // include guard
     744             : 

Generated by: LCOV version 1.14