1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
3 Copyright (c) 2011 Eric Niebler
4 Copyright (c) 2018 Kohei Takahashi
5
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 ==============================================================================*/
9 #include <boost/core/lightweight_test.hpp>
10 #include <boost/fusion/container/vector/vector.hpp>
11 #include <boost/fusion/container/generation/make_vector.hpp>
12 #include <boost/fusion/algorithm/iteration/for_each.hpp>
13 #include <boost/fusion/sequence/comparison/equal_to.hpp>
14 #include <boost/fusion/sequence/io/out.hpp>
15 #include "../sequence/tree.hpp"
16
17 struct print
18 {
19 template <typename T>
operator ()print20 void operator()(T const& v) const
21 {
22 std::cout << "[ " << v << " ] ";
23 }
24 };
25
26 struct increment
27 {
28 template <typename T>
operator ()increment29 void operator()(T& v) const
30 {
31 ++v;
32 }
33 };
34
35 struct mutable_increment : increment
36 {
37 template <typename T>
operator ()mutable_increment38 void operator()(T& v)
39 {
40 return increment::operator()(v);
41 }
42 };
43
44 template <typename F, typename Tree>
test(Tree tree,Tree const & expected)45 void test(Tree tree, Tree const& expected)
46 {
47 boost::fusion::for_each(tree, F());
48 BOOST_TEST_EQ(tree, expected);
49 }
50
51 int
main()52 main()
53 {
54 using namespace boost::fusion;
55
56 {
57 for_each(
58 make_tree(
59 make_vector(double(0),'B')
60 , make_tree(
61 make_vector(1,2,long(3))
62 , make_tree(make_vector('a','b','c'))
63 , make_tree(make_vector(short('d'),'e','f'))
64 )
65 , make_tree(
66 make_vector(4,5,6)
67 , make_tree(make_vector(float(1),'h','i'))
68 , make_tree(make_vector('j','k','l'))
69 )
70 )
71 , print()
72 );
73 std::cout << std::endl;
74 }
75
76 {
77 test<increment>(
78 make_tree(
79 make_vector(double(0),'B')
80 , make_tree(
81 make_vector(1,2,long(3))
82 , make_tree(make_vector('a','b','c'))
83 , make_tree(make_vector(short('d'),'e','f'))
84 )
85 , make_tree(
86 make_vector(4,5,6)
87 , make_tree(make_vector(float(1),'h','i'))
88 , make_tree(make_vector('j','k','l'))
89 )
90 )
91 , make_tree(
92 make_vector(double(1),'C')
93 , make_tree(
94 make_vector(2,3,long(4))
95 , make_tree(make_vector('b','c','d'))
96 , make_tree(make_vector(short('e'),'f','g'))
97 )
98 , make_tree(
99 make_vector(5,6,7)
100 , make_tree(make_vector(float(2),'i','j'))
101 , make_tree(make_vector('k','l','m'))
102 )
103 )
104 );
105 }
106
107 {
108 test<mutable_increment>(
109 make_tree(
110 make_vector(double(0),'B')
111 , make_tree(
112 make_vector(1,2,long(3))
113 , make_tree(make_vector('a','b','c'))
114 , make_tree(make_vector(short('d'),'e','f'))
115 )
116 , make_tree(
117 make_vector(4,5,6)
118 , make_tree(make_vector(float(1),'h','i'))
119 , make_tree(make_vector('j','k','l'))
120 )
121 )
122 , make_tree(
123 make_vector(double(1),'C')
124 , make_tree(
125 make_vector(2,3,long(4))
126 , make_tree(make_vector('b','c','d'))
127 , make_tree(make_vector(short('e'),'f','g'))
128 )
129 , make_tree(
130 make_vector(5,6,7)
131 , make_tree(make_vector(float(2),'i','j'))
132 , make_tree(make_vector('k','l','m'))
133 )
134 )
135 );
136 }
137
138 return boost::report_errors();
139 }
140
141