get_elements_test.cc
Go to the documentation of this file.
1 /**
2  * @file get_elements_test.cc
3  * @brief Test of `util::get_elements()`.
4  * @author Gianluca Petrillo (petrillo@slac.stanford.edu)
5  * @date December 13, 2019
6  *
7  */
8 
9 
10 // testing library
13 // #include "larcorealg/CoreUtils/DebugUtils.h"
14 
15 // Boost libraries
16 #define BOOST_TEST_MODULE ( get_elements_test )
17 #include <boost/test/unit_test.hpp>
18 
19 // C/C++ libraries
20 #include <vector>
21 #include <tuple>
22 #include <utility> // std::as_const(), std::is_same_v
23 #include <cstddef> // std::size_t
24 
25 
26 // -----------------------------------------------------------------------------
28 
29  struct A {};
30 
31  std::vector<std::tuple<int, void const*, A>> data {
32  { 0, nullptr, A{} },
33  { 1, nullptr, A{} }
34  };
35 
36  //
37  // read-only access
38  //
39  {
40  auto iItem = data.cbegin();
41  for (auto&& [ index, a ]: util::get_elements<0U, 2U>(std::as_const(data))) {
42  static_assert(std::is_same_v<decltype(index), int const&>);
43  static_assert(std::is_same_v<decltype(a), A const&>);
44  BOOST_TEST(index == std::get<0U>(*iItem));
45  BOOST_TEST(&index == &std::get<0U>(*iItem));
46  BOOST_TEST(&a == &std::get<2U>(*iItem));
47  ++iItem;
48  }
49  BOOST_TEST((iItem == data.cend()));
50  }
51 
52  //
53  // read/write access
54  //
55  {
56  auto iItem = data.cbegin();
57  for (auto&& [ index, a ]: util::get_elements<0U, 2U>(data)) {
58  static_assert(std::is_same_v<decltype(index), int&>);
59  static_assert(std::is_same_v<decltype(a), A&>);
60  BOOST_TEST(index == std::get<0U>(*iItem));
61  BOOST_TEST(&index == &std::get<0U>(*iItem));
62  BOOST_TEST(&a == &std::get<2U>(*iItem));
63  ++iItem;
64  }
65  BOOST_TEST((iItem == data.cend()));
66  }
67 
68 } // test_get_elements()
69 
70 
72 
73  struct A {};
74 
75  std::vector<std::tuple<int, void const*, A>> const data {
76  { 0, nullptr, A{} },
77  { 1, nullptr, A{} }
78  };
79 
80  //
81  // read-only access
82  //
83  {
84  auto iItem = data.cbegin();
85  for (auto&& [ index, a ]: util::get_elements<0U, 2U>(std::as_const(data))) {
86  static_assert(std::is_same_v<decltype(index), int const&>);
87  static_assert(std::is_same_v<decltype(a), A const&>);
88  BOOST_TEST(index == std::get<0U>(*iItem));
89  BOOST_TEST(&index == &std::get<0U>(*iItem));
90  BOOST_TEST(&a == &std::get<2U>(*iItem));
91  ++iItem;
92  }
93  BOOST_TEST((iItem == data.cend()));
94  }
95 
96  //
97  // read/write access
98  //
99  {
100  auto iItem = data.cbegin();
101  for (auto&& [ index, a ]: util::get_elements<0U, 2U>(data)) {
102  static_assert(std::is_same_v<decltype(index), int const&>);
103  static_assert(std::is_same_v<decltype(a), A const&>);
104  BOOST_TEST(index == std::get<0U>(*iItem));
105  BOOST_TEST(&index == &std::get<0U>(*iItem));
106  BOOST_TEST(&a == &std::get<2U>(*iItem));
107  ++iItem;
108  }
109  BOOST_TEST((iItem == data.cend()));
110  }
111 
112 } // test_get_const_elements()
113 
114 
115 
116 // -----------------------------------------------------------------------------
118 
119  struct A {};
120 
121  std::vector<std::tuple<int, void const*, A>> data {
122  { 0, nullptr, A{} },
123  { 1, nullptr, A{} }
124  };
125 
126  //
127  // read-only access
128  //
129  {
130  auto iItem = data.cbegin();
131  for (auto&& index: util::get_elements<0U>(std::as_const(data))) {
132  static_assert(std::is_same_v<decltype(index), int const&>);
133  BOOST_TEST(index == std::get<0U>(*iItem));
134  BOOST_TEST(&index == &std::get<0U>(*iItem));
135  ++iItem;
136  }
137  BOOST_TEST((iItem == data.cend()));
138  }
139 
140  //
141  // read/write access
142  //
143  {
144  auto iItem = data.cbegin();
145  for (auto&& index: util::get_elements<0U>(data)) {
146  static_assert(std::is_same_v<decltype(index), int&>);
147  BOOST_TEST(index == std::get<0U>(*iItem));
148  BOOST_TEST(&index == &std::get<0U>(*iItem));
149  ++iItem;
150  }
151  BOOST_TEST((iItem == data.cend()));
152  }
153 
154 } // test_get_elements_single()
155 
156 
158 
159  struct A {};
160 
161  std::vector<std::tuple<int, void const*, A>> const data {
162  { 0, nullptr, A{} },
163  { 1, nullptr, A{} }
164  };
165 
166  //
167  // read-only access
168  //
169  {
170  auto iItem = data.cbegin();
171  for (auto&& index: util::get_elements<0U>(std::as_const(data))) {
172  static_assert(std::is_same_v<decltype(index), int const&>);
173  BOOST_TEST(index == std::get<0U>(*iItem));
174  BOOST_TEST(&index == &std::get<0U>(*iItem));
175  ++iItem;
176  }
177  BOOST_TEST((iItem == data.cend()));
178  }
179 
180  //
181  // read/write access
182  //
183  {
184  auto iItem = data.cbegin();
185  for (auto&& index: util::get_elements<0U>(data)) {
186  static_assert(std::is_same_v<decltype(index), int const&>);
187  BOOST_TEST(index == std::get<0U>(*iItem));
188  BOOST_TEST(&index == &std::get<0U>(*iItem));
189  ++iItem;
190  }
191  BOOST_TEST((iItem == data.cend()));
192  }
193 
194 } // test_get_const_elements_single()
195 
196 
197 // -----------------------------------------------------------------------------
199 
200  /*
201  * The promise:
202  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
203  * std::vector<std::tuple<char, int, float>> data
204  * { { 'z', 0, 1.0F }, { 'o', 1, 3.0F }, { 't', 2, 9.0F } };
205  * std::map<char, double> factors;
206  *
207  * for (auto const& [ letter, factor ]: util::get_elements<0U, 2U>(data)) {
208  * factors.emplace(letter, factor);
209  * }
210  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
211  * and
212  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
213  * std::vector<int> exponents;
214  *
215  * for (int exponent: util::get_elements<1U>(data)) {
216  * exponents.push_back(exponent);
217  * }
218  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
219  */
220 
221  std::vector<std::tuple<char, int, float>> data
222  { { 'z', 0, 1.0F }, { 'o', 1, 3.0F }, { 't', 2, 9.0F } };
223  std::map<char, double> factors;
224 
225  for (auto const& [ letter, factor ]: util::get_elements<0U, 2U>(data)) {
226  factors.emplace(letter, factor);
227  }
228 
229  std::vector<int> exponents;
230 
231  for (int exponent: util::get_elements<1U>(data)) {
232  exponents.push_back(exponent);
233  }
234 
235  //
236  // check
237  //
238  std::map<char, double> const expected_factors
239  { { 'z', 1.0F }, { 'o', 3.0F }, { 't', 9.0F } };
240  std::vector<int> const expected_exponents{ 0, 1, 2 };
241 
242  BOOST_TEST(factors.size() == expected_factors.size());
243  for (auto const& [ f, expected_f ]: util::zip(factors, expected_factors)) {
244  BOOST_TEST(f.first == expected_f.first);
245  BOOST_TEST(f.second == expected_f.second);
246  } // for
247 
248  BOOST_CHECK_EQUAL_COLLECTIONS(
249  exponents.cbegin(), exponents.cend(),
250  expected_exponents.begin(), expected_exponents.end()
251  );
252 
253 } // get_elements_documentation_test()
254 
255 
256 // -----------------------------------------------------------------------------
257 // BEGIN Test cases -----------------------------------------------------------
258 // -----------------------------------------------------------------------------
259 BOOST_AUTO_TEST_CASE(get_elements_testcase) {
260 
265 
267 
268 } // BOOST_AUTO_TEST_CASE(get_elements_testcase)
269 
270 
271 // -----------------------------------------------------------------------------
272 // END Test cases -------------------------------------------------------------
273 // -----------------------------------------------------------------------------
Definition of util::zip().
Definition of util::get_elements() and util::get_const_elements().
BOOST_AUTO_TEST_CASE(get_elements_testcase)
void test_get_const_elements_single()
void test_get_elements()
void test_get_elements_single()
const double a
void test_get_const_elements()
auto zip(Iterables &&...iterables)
Range-for loop helper iterating across many collections at the same time.
Definition: zip.h:295
void get_elements_documentation_test()