1 | /* |
2 | * variadic_to_vmpl_unit_test.hpp |
3 | * |
4 | * Created on: Aug 19, 2015 |
5 | * Author: i-bird |
6 | */ |
7 | |
8 | #ifndef SRC_UTIL_VARIADIC_TO_VMPL_UNIT_TEST_HPP_ |
9 | #define SRC_UTIL_VARIADIC_TO_VMPL_UNIT_TEST_HPP_ |
10 | |
11 | #include "util/variadic_to_vmpl.hpp" |
12 | #include "util/util_debug.hpp" |
13 | #include <typeinfo> |
14 | |
15 | //! [v_transform metafunction] |
16 | template <typename T> |
17 | struct F |
18 | { |
19 | //! meta-function implementation |
20 | typedef aggregate<T> type; |
21 | }; |
22 | //! [v_transform metafunction] |
23 | |
24 | //! [v_transform_two metafunction] |
25 | template <typename arg0, typename T> |
26 | struct Ftwo |
27 | { |
28 | //! meta-function implementation |
29 | typedef aggregate<T> type; |
30 | }; |
31 | //! [v_transform_two metafunction] |
32 | |
33 | BOOST_AUTO_TEST_CASE( variadic_to_vmpl_test) |
34 | { |
35 | { |
36 | //! [v_transform usage] |
37 | |
38 | typedef boost::mpl::vector<float,float,float[3]> bfv; |
39 | |
40 | // tbvf is boost::fusion::vector<scalar<float>,scalar<float>,scalar<float[3]>> |
41 | typedef v_transform<F,bfv>::type tbfv; |
42 | |
43 | bool val = std::is_same<boost::mpl::at<tbfv,boost::mpl::int_<0>>::type,aggregate<float>>::value; |
44 | BOOST_REQUIRE_EQUAL(val,true); |
45 | |
46 | val = std::is_same<boost::mpl::at<tbfv,boost::mpl::int_<1>>::type,aggregate<float>>::value; |
47 | BOOST_REQUIRE_EQUAL(val,true); |
48 | |
49 | val = std::is_same<boost::mpl::at<tbfv,boost::mpl::int_<2>>::type,aggregate<float[3]>>::value; |
50 | BOOST_REQUIRE_EQUAL(val,true); |
51 | |
52 | //! [v_transform usage] |
53 | } |
54 | |
55 | { |
56 | //! [v_transform_two usage] |
57 | |
58 | typedef boost::mpl::vector<float,float,float[3]> bfv; |
59 | |
60 | // tbvf is boost::fusion::vector<scalar<float>,scalar<float>,scalar<float[3]>> |
61 | typedef v_transform_two<Ftwo,float,bfv>::type tbfv; |
62 | |
63 | bool val = std::is_same<boost::mpl::at<tbfv,boost::mpl::int_<0>>::type,aggregate<float>>::value; |
64 | BOOST_REQUIRE_EQUAL(val,true); |
65 | |
66 | val = std::is_same<boost::mpl::at<tbfv,boost::mpl::int_<1>>::type,aggregate<float>>::value; |
67 | BOOST_REQUIRE_EQUAL(val,true); |
68 | |
69 | val = std::is_same<boost::mpl::at<tbfv,boost::mpl::int_<2>>::type,aggregate<float[3]>>::value; |
70 | BOOST_REQUIRE_EQUAL(val,true); |
71 | |
72 | //! [v_transform_two usage] |
73 | } |
74 | |
75 | { |
76 | //! [to_boost_vmpl usage] |
77 | |
78 | typedef to_boost_vmpl<1,4,5,9>::type bfv; |
79 | |
80 | bool val = std::is_same<boost::mpl::at<bfv,boost::mpl::int_<0>>::type,boost::mpl::int_<1>>::value; |
81 | BOOST_REQUIRE_EQUAL(val,true); |
82 | |
83 | val = std::is_same<boost::mpl::at<bfv,boost::mpl::int_<1>>::type,boost::mpl::int_<4>>::value; |
84 | BOOST_REQUIRE_EQUAL(val,true); |
85 | |
86 | val = std::is_same<boost::mpl::at<bfv,boost::mpl::int_<2>>::type,boost::mpl::int_<5>>::value; |
87 | BOOST_REQUIRE_EQUAL(val,true); |
88 | |
89 | val = std::is_same<boost::mpl::at<bfv,boost::mpl::int_<3>>::type,boost::mpl::int_<9>>::value; |
90 | BOOST_REQUIRE_EQUAL(val,true); |
91 | |
92 | //! [to_boost_vmpl usage] |
93 | } |
94 | |
95 | { |
96 | //! [vmpl_sum_constant usage] |
97 | |
98 | typedef to_boost_vmpl<1,4,5,9>::type bfv; |
99 | |
100 | typedef vmpl_sum_constant<5,bfv>::type vsc; |
101 | |
102 | BOOST_REQUIRE_EQUAL(boost::mpl::size<vsc>::type::value,4); |
103 | |
104 | bool val = std::is_same<boost::mpl::at<vsc,boost::mpl::int_<0>>::type,boost::mpl::int_<6>>::value; |
105 | BOOST_REQUIRE_EQUAL(val,true); |
106 | |
107 | val = std::is_same<boost::mpl::at<vsc,boost::mpl::int_<1>>::type,boost::mpl::int_<9>>::value; |
108 | BOOST_REQUIRE_EQUAL(val,true); |
109 | |
110 | val = std::is_same<boost::mpl::at<vsc,boost::mpl::int_<2>>::type,boost::mpl::int_<10>>::value; |
111 | BOOST_REQUIRE_EQUAL(val,true); |
112 | |
113 | val = std::is_same<boost::mpl::at<vsc,boost::mpl::int_<3>>::type,boost::mpl::int_<14>>::value; |
114 | BOOST_REQUIRE_EQUAL(val,true); |
115 | |
116 | //! [vmpl_sum_constant usage] |
117 | } |
118 | } |
119 | |
120 | BOOST_AUTO_TEST_CASE( lin_vmpl_test ) |
121 | { |
122 | typedef boost::mpl::vector<boost::mpl::int_<16>,boost::mpl::int_<17>,boost::mpl::int_<18>> vector; |
123 | |
124 | typedef boost::mpl::vector<boost::mpl::int_<1>,boost::mpl::int_<2>,boost::mpl::int_<3>> offset; |
125 | |
126 | int lino = Lin_vmpl_off<vector,offset>(0,0,0); |
127 | int lin = Lin_vmpl<vector>(0,0,0); |
128 | |
129 | BOOST_REQUIRE_EQUAL(lino,1+2*16+3*16*17); |
130 | BOOST_REQUIRE_EQUAL(lin,0); |
131 | |
132 | lino = Lin_vmpl_off<vector,offset>(0,1,0); |
133 | lin = Lin_vmpl<vector>(0,1,0); |
134 | |
135 | BOOST_REQUIRE_EQUAL(lino,1+3*16+3*16*17); |
136 | BOOST_REQUIRE_EQUAL(lin,16); |
137 | |
138 | lino = Lin_vmpl_off<vector,offset>(0,0,1); |
139 | lin = Lin_vmpl<vector>(0,0,1); |
140 | |
141 | BOOST_REQUIRE_EQUAL(lino,1+2*16+4*16*17); |
142 | BOOST_REQUIRE_EQUAL(lin,16*17); |
143 | } |
144 | |
145 | #endif /* SRC_UTIL_VARIADIC_TO_VMPL_UNIT_TEST_HPP_ */ |
146 | |