nview.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*=============================================================================
  2. Copyright (c) 2009 Hartmut Kaiser
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. ==============================================================================*/
  6. #include <boost/detail/lightweight_test.hpp>
  7. #include <boost/fusion/include/vector.hpp>
  8. #include <boost/fusion/include/struct.hpp>
  9. #include <boost/fusion/include/equal_to.hpp>
  10. #include <boost/fusion/include/io.hpp>
  11. #include <boost/fusion/include/nview.hpp>
  12. #include <string>
  13. #include <iostream>
  14. struct test {
  15. int int_;
  16. std::string string_;
  17. double double_;
  18. };
  19. BOOST_FUSION_ADAPT_STRUCT(
  20. test,
  21. (int, int_)
  22. (std::string, string_)
  23. (double, double_)
  24. )
  25. namespace fusion = boost::fusion;
  26. template <typename Sequence>
  27. bool check_size(Sequence const& s, int seqsize)
  28. {
  29. return fusion::size(s) == seqsize;
  30. }
  31. template <typename Sequence, typename T>
  32. bool check_deref_begin(Sequence const& s, T val)
  33. {
  34. return fusion::deref(fusion::begin(s)) == val;
  35. }
  36. template <typename Sequence, typename T>
  37. bool check_deref_next(Sequence const& s, T val)
  38. {
  39. return fusion::deref(fusion::next(fusion::begin(s))) == val;
  40. }
  41. template <int N, typename Sequence, typename T>
  42. bool check_deref_advance(Sequence const& s, T val)
  43. {
  44. return fusion::deref(fusion::advance_c<N>(fusion::begin(s))) == val;
  45. }
  46. template <typename Sequence, typename T>
  47. bool check_deref_prior(Sequence const& s, T val)
  48. {
  49. return fusion::deref(fusion::prior(fusion::end(s))) == val;
  50. }
  51. template <int N, typename Sequence, typename T>
  52. bool check_at(Sequence const& s, T val)
  53. {
  54. return fusion::at_c<N>(s) == val;
  55. }
  56. template <typename Sequence>
  57. bool check_distance(Sequence const& s, int val)
  58. {
  59. return fusion::distance(fusion::begin(s), fusion::end(s)) == val;
  60. }
  61. int main()
  62. {
  63. test t;
  64. t.int_ = 1;
  65. t.string_ = "test";
  66. t.double_ = 2.0;
  67. using fusion::as_nview;
  68. // check size()
  69. {
  70. BOOST_TEST(check_size(as_nview<0>(t), 1));
  71. BOOST_TEST(check_size(as_nview<2, 1>(t), 2));
  72. BOOST_TEST(check_size(as_nview<2, 1, 0>(t), 3));
  73. BOOST_TEST(check_size(as_nview<2, 1, 0, 2, 0>(t), 5));
  74. }
  75. // check deref/begin
  76. {
  77. BOOST_TEST(check_deref_begin(as_nview<0>(t), 1));
  78. BOOST_TEST(check_deref_begin(as_nview<2, 1>(t), 2.0));
  79. BOOST_TEST(check_deref_begin(as_nview<1, 2, 0>(t), "test"));
  80. BOOST_TEST(check_deref_begin(as_nview<2, 1, 0, 2, 0>(t), 2.0));
  81. }
  82. // check deref/next
  83. {
  84. BOOST_TEST(check_deref_next(as_nview<2, 1>(t), "test"));
  85. BOOST_TEST(check_deref_next(as_nview<1, 2, 0>(t), 2.0));
  86. BOOST_TEST(check_deref_next(as_nview<2, 0, 1, 2, 0>(t), 1));
  87. }
  88. // check deref/advance
  89. {
  90. BOOST_TEST(check_deref_advance<0>(as_nview<2, 1>(t), 2.0));
  91. BOOST_TEST(check_deref_advance<2>(as_nview<1, 2, 0>(t), 1));
  92. BOOST_TEST(check_deref_advance<4>(as_nview<2, 0, 1, 2, 0>(t), 1));
  93. }
  94. // check deref/prior
  95. {
  96. BOOST_TEST(check_deref_prior(as_nview<2, 1>(t), "test"));
  97. BOOST_TEST(check_deref_prior(as_nview<1, 2, 0>(t), 1));
  98. BOOST_TEST(check_deref_prior(as_nview<2, 0, 1, 2, 0>(t), 1));
  99. }
  100. // check at
  101. {
  102. BOOST_TEST(check_at<0>(as_nview<0>(t), 1));
  103. BOOST_TEST(check_at<1>(as_nview<2, 1>(t), "test"));
  104. BOOST_TEST(check_at<2>(as_nview<1, 2, 0>(t), 1));
  105. BOOST_TEST(check_at<4>(as_nview<2, 1, 0, 2, 0>(t), 1));
  106. }
  107. // check distance
  108. {
  109. BOOST_TEST(check_distance(as_nview<0>(t), 1));
  110. BOOST_TEST(check_distance(as_nview<2, 1>(t), 2));
  111. BOOST_TEST(check_distance(as_nview<1, 2, 0>(t), 3));
  112. BOOST_TEST(check_distance(as_nview<2, 1, 0, 2, 0>(t), 5));
  113. }
  114. return boost::report_errors();
  115. }