• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright David Abrahams, Daniel Wallin 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_TEST_BASICS_HPP
8 #define BOOST_PARAMETER_TEST_BASICS_HPP
9 
10 #include <boost/parameter.hpp>
11 
12 #if (BOOST_PARAMETER_MAX_ARITY < 4)
13 #error Define BOOST_PARAMETER_MAX_ARITY as 4 or greater.
14 #endif
15 #if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) && \
16     (BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY < 5)
17 #error Define BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY \
18 as 5 or greater.
19 #endif
20 
21 #if !defined(BOOST_PARAMETER_CAN_USE_MP11)
22 #include <boost/mpl/bool.hpp>
23 #include <boost/mpl/if.hpp>
24 #include <boost/mpl/assert.hpp>
25 #include <boost/type_traits/is_same.hpp>
26 #endif
27 
28 #include <boost/core/lightweight_test.hpp>
29 
30 namespace test {
31 
32     BOOST_PARAMETER_NAME(name)
33     BOOST_PARAMETER_NAME(value)
34     BOOST_PARAMETER_NAME(index)
35     BOOST_PARAMETER_NAME(tester)
36 
37     struct f_parameters // vc6 is happier with inheritance than with a typedef
38       : boost::parameter::parameters<
39             test::tag::tester
40           , test::tag::name
41           , test::tag::value
42           , test::tag::index
43         >
44     {
45     };
46 
value_default()47     inline double value_default()
48     {
49         return 666.222;
50     }
51 
52     template <typename T>
equal(T const & x,T const & y)53     inline bool equal(T const& x, T const& y)
54     {
55         return x == y;
56     }
57 
58     template <typename Name, typename Value, typename Index>
59     struct values_t
60     {
values_ttest::values_t61         values_t(Name const& n_, Value const& v_, Index const& i_)
62           : n(n_), v(v_), i(i_)
63         {
64         }
65 
66         template <typename Name_, typename Value_, typename Index_>
67         void
operator ()test::values_t68             operator()(
69                 Name_ const& n_
70               , Value_ const& v_
71               , Index_ const& i_
72             ) const
73         {
74 #if defined(BOOST_PARAMETER_CAN_USE_MP11)
75             static_assert(
76                 std::is_same<Index,Index_>::value
77               , "Index == Index_"
78             );
79             static_assert(
80                 std::is_same<Value,Value_>::value
81               , "Value == Value_"
82             );
83             static_assert(
84                 std::is_same<Name,Name_>::value
85               , "Name == Name_"
86             );
87 #else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)
88             BOOST_MPL_ASSERT((
89                 typename boost::mpl::if_<
90                     boost::is_same<Index,Index_>
91                   , boost::mpl::true_
92                   , boost::mpl::false_
93                 >::type
94             ));
95             BOOST_MPL_ASSERT((
96                 typename boost::mpl::if_<
97                     boost::is_same<Value,Value_>
98                   , boost::mpl::true_
99                   , boost::mpl::false_
100                 >::type
101             ));
102             BOOST_MPL_ASSERT((
103                 typename boost::mpl::if_<
104                     boost::is_same<Name,Name_>
105                   , boost::mpl::true_
106                   , boost::mpl::false_
107                 >::type
108             ));
109 #endif  // BOOST_PARAMETER_CAN_USE_MP11
110             BOOST_TEST(test::equal(n, n_));
111             BOOST_TEST(test::equal(v, v_));
112             BOOST_TEST(test::equal(i, i_));
113         }
114 
115         Name const& n;
116         Value const& v;
117         Index const& i;
118     };
119 
120     template <typename Name, typename Value, typename Index>
121     inline test::values_t<Name,Value,Index>
values(Name const & n,Value const & v,Index const & i)122         values(Name const& n, Value const& v, Index const& i)
123     {
124         return test::values_t<Name,Value,Index>(n, v, i);
125     }
126 } // namespace test
127 
128 #endif  // include guard
129 
130