github-176.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*=============================================================================
  2. Copyright (c) 2018 Kohei Takahashi
  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/fusion/sequence/intrinsic/at.hpp>
  7. #include <boost/fusion/sequence/intrinsic/at_key.hpp>
  8. #include <boost/fusion/container/vector.hpp>
  9. #include <boost/fusion/container/list.hpp>
  10. #include <boost/fusion/container/deque.hpp>
  11. #include <boost/fusion/container/map.hpp>
  12. #include <boost/fusion/container/set.hpp>
  13. #include <boost/fusion/tuple/tuple.hpp>
  14. #include <boost/core/lightweight_test.hpp>
  15. template <typename Sequence>
  16. void test_at()
  17. {
  18. Sequence seq;
  19. // zero initialized
  20. BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 0);
  21. BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 0);
  22. BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 0);
  23. int (&arr)[3] = boost::fusion::deref(boost::fusion::begin(seq));
  24. arr[0] = 2;
  25. arr[1] = 4;
  26. arr[2] = 6;
  27. BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 2);
  28. BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 4);
  29. BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 6);
  30. boost::fusion::at_c<0>(seq)[1] = 42;
  31. BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 2);
  32. BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 42);
  33. BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 6);
  34. }
  35. template <typename T> inline T& value(T& v) { return v; }
  36. template <typename K, typename T> inline T& value(boost::fusion::pair<K, T>& v) { return v.second; }
  37. template <typename Sequence>
  38. void test_at_key()
  39. {
  40. Sequence seq;
  41. // zero initialized
  42. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[0] == 0);
  43. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[1] == 0);
  44. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[2] == 0);
  45. int (&arr)[3] = value(boost::fusion::deref(boost::fusion::begin(seq)));
  46. arr[0] = 2;
  47. arr[1] = 4;
  48. arr[2] = 6;
  49. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[0] == 2);
  50. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[1] == 4);
  51. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[2] == 6);
  52. boost::fusion::at_key<int[3]>(seq)[1] = 42;
  53. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[0] == 2);
  54. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[1] == 42);
  55. BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[2] == 6);
  56. }
  57. int main()
  58. {
  59. using namespace boost::fusion;
  60. test_at<vector<int[3]> >();
  61. test_at<deque<int[3]> >();
  62. test_at<list<int[3]> >();
  63. test_at<tuple<int[3]> >();
  64. #if !BOOST_WORKAROUND(BOOST_GCC, / 100 == 406) || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)
  65. // FIXME: gcc 4.6 w/ c++0x doesn't like set with array...
  66. test_at_key<set<int[3]> >();
  67. #endif
  68. test_at_key<map<pair<int[3], int[3]> > >();
  69. return boost::report_errors();
  70. }