1 /*=============================================================================
2 Copyright (c) 2010 Christopher Schmidt
3
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #include <boost/detail/lightweight_test.hpp>
8 #include <boost/fusion/sequence.hpp>
9 #include <boost/fusion/support.hpp>
10 #include <boost/fusion/container/list.hpp>
11 #include <boost/fusion/container/vector.hpp>
12 #include <boost/fusion/container/generation/make_vector.hpp>
13 #include <boost/fusion/adapted/struct/adapt_assoc_struct_named.hpp>
14 #include <boost/mpl/assert.hpp>
15 #include <boost/mpl/not.hpp>
16 #include <boost/type_traits/is_same.hpp>
17 #include <boost/static_assert.hpp>
18 #include <iostream>
19 #include <string>
20
21 namespace ns
22 {
23 struct x_member;
24 struct y_member;
25 struct z_member;
26
27 struct point
28 {
29 int x;
30 int y;
31 };
32 }
33
34
35 #if BOOST_PP_VARIADICS
36
37 BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
38 ns::point,
39 point,
40 (x, ns::x_member)
41 (auto, y, ns::y_member)
42 )
43
44 #else // BOOST_PP_VARIADICS
45
46 BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
47 ns::point,
48 point,
49 (int, x, ns::x_member)
50 (auto, y, ns::y_member)
51 )
52
53 #endif
54
55 struct empty_struct {};
56 BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(empty_struct, renamed_empty_struct,)
57
58 int
main()59 main()
60 {
61 using namespace boost::fusion;
62
63 std::cout << tuple_open('[');
64 std::cout << tuple_close(']');
65 std::cout << tuple_delimiter(", ");
66
67 {
68 BOOST_MPL_ASSERT((traits::is_view<adapted::point>));
69 BOOST_STATIC_ASSERT(traits::is_view<adapted::point>::value);
70 ns::point basep = {123, 456};
71 adapted::point p(basep);
72
73 std::cout << at_c<0>(p) << std::endl;
74 std::cout << at_c<1>(p) << std::endl;
75 std::cout << p << std::endl;
76 BOOST_TEST(p == make_vector(123, 456));
77
78 at_c<0>(p) = 6;
79 at_c<1>(p) = 9;
80 BOOST_TEST(p == make_vector(6, 9));
81
82 BOOST_STATIC_ASSERT(boost::fusion::result_of::size<adapted::point>::value == 2);
83 BOOST_STATIC_ASSERT(!boost::fusion::result_of::empty<adapted::point>::value);
84
85 BOOST_TEST(front(p) == 6);
86 BOOST_TEST(back(p) == 9);
87 }
88
89 {
90 vector<int, float> v1(4, 2.f);
91 ns::point basev2 = {5, 3};
92 adapted::point v2(basev2);
93
94 vector<long, double> v3(5, 4.);
95 BOOST_TEST(v1 < v2);
96 BOOST_TEST(v1 <= v2);
97 BOOST_TEST(v2 > v1);
98 BOOST_TEST(v2 >= v1);
99 BOOST_TEST(v2 < v3);
100 BOOST_TEST(v2 <= v3);
101 BOOST_TEST(v3 > v2);
102 BOOST_TEST(v3 >= v2);
103 }
104
105 {
106 // conversion from adapted::point to vector
107 ns::point basep = {5, 3};
108 adapted::point p(basep);
109 vector<int, long> v(p);
110 v = p;
111 }
112
113 {
114 // conversion from adapted::point to list
115 ns::point basep = {5, 3};
116 adapted::point p(basep);
117 list<int, long> l(p);
118 l = p;
119 }
120
121 {
122 // assoc stuff
123 BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<adapted::point, ns::x_member>));
124 BOOST_MPL_ASSERT((boost::fusion::result_of::has_key<adapted::point, ns::y_member>));
125 BOOST_MPL_ASSERT((boost::mpl::not_<boost::fusion::result_of::has_key<adapted::point, ns::z_member> >));
126
127 BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<adapted::point, ns::x_member>::type, int>));
128 BOOST_MPL_ASSERT((boost::is_same<boost::fusion::result_of::value_at_key<adapted::point, ns::y_member>::type, int>));
129
130 ns::point basep = {5, 3};
131 adapted::point p(basep);
132
133 BOOST_TEST(at_key<ns::x_member>(p) == 5);
134 BOOST_TEST(at_key<ns::y_member>(p) == 3);
135 }
136
137 return boost::report_errors();
138 }
139
140