• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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