segmented_for_each.cpp 4.0 KB

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