1// Copyright David Abrahams, Daniel Wallin 2005.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5
6#include <boost/parameter/config.hpp>
7
8#if (BOOST_PARAMETER_MAX_ARITY < 4)
9#error Define BOOST_PARAMETER_MAX_ARITY as 4 or greater.
10#endif
11#if !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) && \
12 (BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY < 5)
13#error Define BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY \
14as 5 or greater.
15#endif
16
17#include <boost/parameter/name.hpp>
18
19namespace test {
20
21 BOOST_PARAMETER_NAME(w)
22 BOOST_PARAMETER_NAME(x)
23 BOOST_PARAMETER_NAME(y)
24 BOOST_PARAMETER_NAME(z)
25} // namespace test
26
27#if !defined(BOOST_PARAMETER_CAN_USE_MP11)
28#include <boost/mpl/bool.hpp>
29#include <boost/mpl/if.hpp>
30#include <boost/type_traits/is_convertible.hpp>
31
32namespace test {
33
34 struct f_predicate
35 {
36 template <typename T, typename Args>
37 struct apply
38 : boost::mpl::if_<
39 boost::is_convertible<T,int>
40 , boost::mpl::true_
41 , boost::mpl::false_
42 >
43 {
44 };
45 };
46} // namespace test
47
48#endif // BOOST_PARAMETER_CAN_USE_MP11
49
50#include <boost/parameter/parameters.hpp>
51
52#if defined(BOOST_PARAMETER_CAN_USE_MP11)
53#include <boost/mp11/bind.hpp>
54#include <type_traits>
55#endif
56
57namespace test {
58
59 struct f_parameters // vc6 is happier with inheritance than with a typedef
60 : boost::parameter::parameters<
61 boost::parameter::required<test::tag::w>
62#if defined(BOOST_PARAMETER_CAN_USE_MP11)
63 , boost::parameter::optional<
64 test::tag::x
65 , boost::mp11::mp_bind<std::is_convertible,boost::mp11::_1,int>
66 >
67 , boost::parameter::optional<
68 test::tag::y
69 , boost::mp11::mp_bind<std::is_convertible,boost::mp11::_1,int>
70 >
71 , boost::parameter::optional<
72 test::tag::z
73 , boost::mp11::mp_bind<std::is_convertible,boost::mp11::_1,int>
74 >
75#else
76 , boost::parameter::optional<test::tag::x,test::f_predicate>
77 , boost::parameter::optional<test::tag::y,test::f_predicate>
78 , boost::parameter::optional<test::tag::z,test::f_predicate>
79#endif // BOOST_PARAMETER_CAN_USE_MP11
80 >
81 {
82 };
83} // namespace test
84
85#include <boost/parameter/macros.hpp>
86#include <boost/core/lightweight_test.hpp>
87
88namespace test {
89
90#if defined(BOOST_NO_VOID_RETURNS)
91 BOOST_PARAMETER_FUN(int, f, 1, 4, f_parameters)
92#else
93 BOOST_PARAMETER_FUN(void, f, 1, 4, f_parameters)
94#endif
95 {
96 BOOST_TEST_EQ(p[test::_w][0], p[test::_x | -1]);
97 BOOST_TEST_EQ(p[test::_w][1], p[test::_y | -2]);
98 BOOST_TEST_EQ(p[test::_w][2], p[test::_z | -3]);
99#if defined(BOOST_NO_VOID_RETURNS)
100 return 0;
101#endif
102 }
103} // namespace test
104
105int main()
106{
107 int a[3];
108 a[0] = 1;
109 a[1] = 2;
110 a[2] = 3;
111 test::f(p0: test::_x = 1, p1: test::_y = 2, p2: test::_z = 3, p3: test::_w = a);
112 a[1] = -2;
113 a[2] = -3;
114 test::f(p0: test::_x = 1, p1: test::_w = a);
115 a[0] = -1;
116 a[1] = 2;
117 test::f(p0: test::_y = 2, p1: test::_w = a);
118 a[1] = -2;
119 a[2] = 3;
120 test::f(p0: test::_z = 3, p1: test::_w = a);
121 a[0] = 1;
122 test::f(p0: test::_z = 3, p1: test::_x = 1, p2: test::_w = a);
123 return boost::report_errors();
124}
125
126

source code of boost/libs/parameter/test/earwicker.cpp