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()19void 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)45template <typename T> inline T& value(T& v) { return v; } value(boost::fusion::pair<K,T> & v)46template <typename K, typename T> inline T& value(boost::fusion::pair<K, T>& v) { return v.second; } 47 48 template <typename Sequence> test_at_key()49void 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()75int 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