• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*=============================================================================
2     Copyright (c) 2018 Kohei Takahashi
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 
8 #include <boost/fusion/sequence/intrinsic/at.hpp>
9 #include <boost/fusion/sequence/intrinsic/at_key.hpp>
10 #include <boost/fusion/container/vector.hpp>
11 #include <boost/fusion/container/list.hpp>
12 #include <boost/fusion/container/deque.hpp>
13 #include <boost/fusion/container/map.hpp>
14 #include <boost/fusion/container/set.hpp>
15 #include <boost/fusion/tuple/tuple.hpp>
16 #include <boost/core/lightweight_test.hpp>
17 
18 template <typename Sequence>
test_at()19 void test_at()
20 {
21     Sequence seq;
22 
23     // zero initialized
24     BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 0);
25     BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 0);
26     BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 0);
27 
28     int (&arr)[3] = boost::fusion::deref(boost::fusion::begin(seq));
29 
30     arr[0] = 2;
31     arr[1] = 4;
32     arr[2] = 6;
33 
34     BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 2);
35     BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 4);
36     BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 6);
37 
38     boost::fusion::at_c<0>(seq)[1] = 42;
39 
40     BOOST_TEST(boost::fusion::at_c<0>(seq)[0] == 2);
41     BOOST_TEST(boost::fusion::at_c<0>(seq)[1] == 42);
42     BOOST_TEST(boost::fusion::at_c<0>(seq)[2] == 6);
43 }
44 
value(T & v)45 template <typename T> inline T& value(T& v) { return v; }
value(boost::fusion::pair<K,T> & v)46 template <typename K, typename T> inline T& value(boost::fusion::pair<K, T>& v) { return v.second; }
47 
48 template <typename Sequence>
test_at_key()49 void test_at_key()
50 {
51     Sequence seq;
52 
53     // zero initialized
54     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[0] == 0);
55     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[1] == 0);
56     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[2] == 0);
57 
58     int (&arr)[3] = value(boost::fusion::deref(boost::fusion::begin(seq)));
59 
60     arr[0] = 2;
61     arr[1] = 4;
62     arr[2] = 6;
63 
64     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[0] == 2);
65     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[1] == 4);
66     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[2] == 6);
67 
68     boost::fusion::at_key<int[3]>(seq)[1] = 42;
69 
70     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[0] == 2);
71     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[1] == 42);
72     BOOST_TEST(boost::fusion::at_key<int[3]>(seq)[2] == 6);
73 }
74 
main()75 int main()
76 {
77     using namespace boost::fusion;
78 
79     test_at<vector<int[3]> >();
80     test_at<deque<int[3]> >();
81     test_at<list<int[3]> >();
82     test_at<tuple<int[3]> >();
83 
84 #if !BOOST_WORKAROUND(BOOST_GCC, / 100 == 406) || defined(BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS)
85     // FIXME: gcc 4.6 w/ c++0x doesn't like set with array...
86     test_at_key<set<int[3]> >();
87 #endif
88     test_at_key<map<pair<int[3], int[3]> > >();
89     return boost::report_errors();
90 }
91