38 using LERR_(ITER_EXHAUST);
41 using std::make_tuple;
49 template<u
int N, u
int S=0>
51 auto num31(){
return numS<3,1>(); }
52 auto num32(){
return numS<3,2>(); }
53 auto num33(){
return numS<3,3>(); }
63 return util::join (std::forward<II> (ii),
"-");
67 #define TYPE(_EXPR_) showType<decltype(_EXPR_)>()
104 auto a = std::array{1u,2u,3u};
105 auto v = std::vector{{2l,3l}};
108 for (
auto [u,l] :
zip(a,v))
114 CHECK (*it ==
"«tuple<ulong, long&>»──(0,2)"_expect );
116 CHECK (*it ==
"«tuple<ulong, long&>»──(1,3)"_expect );
128 CHECK (materialise (num5() ) ==
"0-1-2-3-4"_expect);
129 CHECK (materialise (num31() ) ==
"1-4-7-10-13"_expect);
130 CHECK (materialise (num33() ) ==
"3-6-9-12-15"_expect);
131 CHECK (materialise (num32()
133 ) ==
"02-05-08-0B-0E"_expect);
141 auto t1 = make_tuple (41u, 0.61803,
'6');
142 CHECK (t1 ==
"«tuple<uint, double, char>»──(41,0.61803,6)"_expect );
144 auto t1f = mapEach (t1, [](
auto v){
return v+1; });
145 CHECK (t1f ==
"«tuple<uint, double, int>»──(42,1.61803,55)"_expect );
147 auto t1ff = mapEach (t1, [](
auto& v){ v += 1;
return v; });
148 CHECK (t1ff ==
"«tuple<uint, double, char>»──(42,1.61803,7)"_expect );
149 CHECK (t1f ==
"«tuple<uint, double, int>»──(42,1.61803,55)"_expect );
150 CHECK (t1 ==
"«tuple<uint, double, char>»──(42,1.61803,7)"_expect );
153 tuple<char, char&> t2{get<2>(t1), get<2>(t1ff)};
154 CHECK (t2 ==
"«tuple<char, char&>»──(7,7)"_expect );
156 auto t2f = mapEach (t2, [](
auto& v){ v -= 1;
return v; });
157 CHECK (t2f ==
"«tuple<char, char>»──(6,6)"_expect );
158 CHECK (t2 ==
"«tuple<char, char&>»──(6,6)"_expect);
159 CHECK (t1ff ==
"«tuple<uint, double, char>»──(42,1.61803,6)"_expect );
160 CHECK (t1 ==
"«tuple<uint, double, char>»──(42,1.61803,7)"_expect );
163 auto refr = [](
auto& v) ->
decltype(
auto) {
return v; };
166 CHECK (
TYPE (refr(five)) ==
"int&"_expect);
167 CHECK (
TYPE (refr(fiveR)) ==
"int&"_expect);
169 auto t2r = mapEach (t2, refr);
170 CHECK (t2r ==
"«tuple<char&, char&>»──(6,6)"_expect );
172 forEach (t2r, [](
auto& v){ v +=23; });
173 CHECK (t2r ==
"«tuple<char&, char&>»──(M,M)"_expect );
174 CHECK (t2 ==
"«tuple<char, char&>»──(M,M)"_expect );
175 CHECK (t2f ==
"«tuple<char, char>»──(6,6)"_expect );
176 CHECK (t1 ==
"«tuple<uint, double, char>»──(42,1.61803,7)"_expect );
177 CHECK (t1ff ==
"«tuple<uint, double, char>»──(42,1.61803,M)"_expect );
181 template<
typename...ITS>
185 return make_tuple (
lib::explore (std::forward<ITS> (iters)) ...);
196 auto arry = std::array{3u,2u,1u};
199 CHECK (
TYPE(iTup) ==
"tuple<IterExplorer<iter_explorer::BaseAdapter<NumIter<int> > >, "
200 "IterExplorer<iter_explorer::BaseAdapter<iter_explorer::StlRange<array<uint, 3ul>&> > > >"_expect);
203 auto iterate_it = [](
auto& it){ ++it; };
204 auto access_val = [](
auto& it){
return *it; };
206 forEach (iTup, iterate_it);
207 auto vTup = mapEach (iTup, access_val);
208 CHECK (vTup ==
"«tuple<int, uint>»──(1,2)"_expect);
210 using ITup =
decltype(iTup);
218 ProductCore(ITup&& iterTup)
219 : iters_{move (iterTup)}
227 forEach (iters_, [&](
auto& it){ active = active and bool(it); });
234 return unConst(iters_);
240 forEach (iters_, [](
auto& it){ ++it; });
247 .transform ([&](ITup& iTup){
return mapEach (iTup, access_val); })
251 CHECK (
TYPE(ii) ==
"IterExplorer<"
254 "iter_explorer::Transformer<"
255 "iter_explorer::BaseAdapter<"
258 "IterZip_test::demo_construction()::ProductCore> > >, "
270 CHECK (materialise (ii) ==
"«tuple<int, uint>»──(0,3)-"
271 "«tuple<int, uint>»──(1,2)-"
272 "«tuple<int, uint>»──(2,1)"_expect);
285 zip (num31(), num32(), num33())
287 ==
"«tuple<uint&, uint&, uint&>»──(1,2,3)-"
288 "«tuple<uint&, uint&, uint&>»──(4,5,6)-"
289 "«tuple<uint&, uint&, uint&>»──(7,8,9)-"
290 "«tuple<uint&, uint&, uint&>»──(10,11,12)-"
291 "«tuple<uint&, uint&, uint&>»──(13,14,15)"_expect);
294 izip (num31(), num32(), num33())
296 ==
"«tuple<ulong, uint&, uint&, uint&>»──(0,1,2,3)-"
297 "«tuple<ulong, uint&, uint&, uint&>»──(1,4,5,6)-"
298 "«tuple<ulong, uint&, uint&, uint&>»──(2,7,8,9)-"
299 "«tuple<ulong, uint&, uint&, uint&>»──(3,10,11,12)-"
300 "«tuple<ulong, uint&, uint&, uint&>»──(4,13,14,15)"_expect);
303 auto s6 = std::array{1,1,2,3,5,8};
306 CHECK (
TYPE(s6) ==
"array<int, 6ul>"_expect );
307 CHECK (
TYPE(s3) ==
"initializer_list<int>"_expect );
308 CHECK (
TYPE(s0) ==
"NumIter<uint>"_expect );
313 ==
"«tuple<int&, int&, int&, char>»──(1,1,1,a)-"
314 "«tuple<int&, int&, int&, char>»──(1,1,1,b)-"
315 "«tuple<int&, int&, int&, char>»──(2,2,2,c)-"
316 "«tuple<int&, int&, int&, char>»──(3,3,3,d)-"
317 "«tuple<int&, int&, int&, char>»──(5,5,5,e)-"
318 "«tuple<int&, int&, int&, char>»──(8,8,8,f)"_expect);
323 ==
"«tuple<int&, int const&, int&, char>»──(1,3,1,a)-"
324 "«tuple<int&, int const&, int&, char>»──(1,2,1,b)-"
325 "«tuple<int&, int const&, int&, char>»──(2,1,2,c)"_expect);
346 ==
"«tuple<char, int, int const&, int const&>»──(a,-1,3,3)-"
347 "«tuple<char, int, int const&, int const&>»──(b,0,2,2)-"
348 "«tuple<char, int, int const&, int const&>»──(c,1,1,1)"_expect);
354 ,
explore(s6).filter([](
int i){
return i%2; })
355 ,numS<17,170>().transform(hexed)
360 ==
"«tuple<ulong, int&, int&, string&, double, int const&>»──(0,1,1,AA,1.618034,3)-"
361 "«tuple<ulong, int&, int&, string&, double, int const&>»──(1,1,1,BB,2.618034,2)-"
362 "«tuple<ulong, int&, int&, string&, double, int const&>»──(2,2,3,CC,3.618034,1)"_expect);
371 auto vec = std::vector{1,5};
372 auto arr = std::array{2,3};
375 auto i1 =
izip (vec,arr);
377 CHECK (*i1 ==
"«tuple<ulong, int&, int&>»──(0,1,2)"_expect );
379 CHECK (*i1 ==
"«tuple<ulong, int&, int&>»──(0,5,2)"_expect );
381 CHECK (join(vec) ==
"5, 5"_expect );
382 CHECK (join(arr) ==
"2, 3"_expect );
388 CHECK (*i2 ==
"«tuple<ulong, uint&, int&>»──(0,4,2)"_expect );
392 CHECK (*i2 ==
"«tuple<ulong, uint&, int&>»──(9,9,9)"_expect );
395 CHECK (*i2 ==
"«tuple<ulong, uint&, int&>»──(1,4,3)"_expect );
396 CHECK (join(vec) ==
"5, 5"_expect );
397 CHECK (join(arr) ==
"9, 3"_expect );
414 zip (num31(), num32(), num33())
416 ==
"«tuple<uint&, uint&, uint&>»──(1,2,3)-"
417 "«tuple<uint&, uint&, uint&>»──(4,5,6)-"
418 "«tuple<uint&, uint&, uint&>»──(7,8,9)-"
419 "«tuple<uint&, uint&, uint&>»──(10,11,12)-"
420 "«tuple<uint&, uint&, uint&>»──(13,14,15)"_expect);
424 zip (num31(), num32(), num33())
425 . transform([](
auto& it){
auto [a,b,c] = *it;
429 ==
"6-15-24-33-42"_expect);
433 zip (num31(), num32(), num33())
434 . filter ([](
auto& it){
auto [a,b,c] = *it;
435 return not ((a+b+c) % 2);
438 ==
"«tuple<uint&, uint&, uint&>»──(1,2,3)-"
439 "«tuple<uint&, uint&, uint&>»──(7,8,9)-"
440 "«tuple<uint&, uint&, uint&>»──(13,14,15)"_expect);
443 CHECK (
zip (num31(), num32(), num33())
444 . reduce ([](
auto& it){
auto [a,b,c] = *it;
474 ==
"1-4-7-10-13"_expect);
478 .expand ([](
int i){
return NumIter{noneg(i-1),i}; })
481 ==
"1-0-4-3-2-1-0-7-6-5-4-3-2-1-0-10-9-8-7-6-5-4-3-2-1-0-13-12-11-10-9-8-7-6-5-4-3-2-1-0"_expect);
485 .expand ([](
int i){
return NumIter{noneg(i-2),i-1}; })
488 ==
"1-4-2-0-7-5-3-1-10-8-6-4-2-0-13-11-9-7-5-3-1"_expect);
494 .expand ([](
int i){
return NumIter{noneg(i-1),i}; })
497 .expand ([](
int i){
return NumIter{noneg(i-2),i-1}; })
501 ==
"«tuple<int, uint, uint>»──(10,1,1)-"
502 "«tuple<int, uint, uint>»──(11,0,4)-"
503 "«tuple<int, uint, uint>»──(12,4,2)-"
504 "«tuple<int, uint, uint>»──(13,3,0)-"
505 "«tuple<int, uint, uint>»──(14,2,7)-"
506 "«tuple<int, uint, uint>»──(15,1,5)-"
507 "«tuple<int, uint, uint>»──(16,0,3)-"
508 "«tuple<int, uint, uint>»──(17,7,1)-"
509 "«tuple<int, uint, uint>»──(18,6,10)-"
510 "«tuple<int, uint, uint>»──(19,5,8)-"
511 "«tuple<int, uint, uint>»──(20,4,6)-"
512 "«tuple<int, uint, uint>»──(21,3,4)-"
513 "«tuple<int, uint, uint>»──(22,2,2)-"
514 "«tuple<int, uint, uint>»──(23,1,0)-"
515 "«tuple<int, uint, uint>»──(24,0,13)-"
516 "«tuple<int, uint, uint>»──(25,10,11)-"
517 "«tuple<int, uint, uint>»──(26,9,9)-"
518 "«tuple<int, uint, uint>»──(27,8,7)-"
519 "«tuple<int, uint, uint>»──(28,7,5)-"
520 "«tuple<int, uint, uint>»──(29,6,3)-"
521 "«tuple<int, uint, uint>»──(30,5,1)"_expect);
527 .expand ([](
int i){
return NumIter{noneg(i-1),i}; })
529 .expand ([](
int i){
return NumIter{noneg(i-2),i-1}; })
533 ==
"«tuple<int, uint, uint>»──(10,1,1)-"
534 "«tuple<int, uint, uint>»──(10,0,4)-"
535 "«tuple<int, uint, uint>»──(10,4,2)-"
536 "«tuple<int, uint, uint>»──(10,3,0)-"
537 "«tuple<int, uint, uint>»──(10,2,7)-"
538 "«tuple<int, uint, uint>»──(10,1,5)-"
539 "«tuple<int, uint, uint>»──(10,0,3)-"
540 "«tuple<int, uint, uint>»──(10,7,1)-"
541 "«tuple<int, uint, uint>»──(10,6,10)-"
542 "«tuple<int, uint, uint>»──(10,5,8)-"
543 "«tuple<int, uint, uint>»──(10,4,6)-"
544 "«tuple<int, uint, uint>»──(10,3,4)-"
545 "«tuple<int, uint, uint>»──(10,2,2)-"
546 "«tuple<int, uint, uint>»──(10,1,0)-"
547 "«tuple<int, uint, uint>»──(10,0,13)-"
548 "«tuple<int, uint, uint>»──(10,10,11)-"
549 "«tuple<int, uint, uint>»──(10,9,9)-"
550 "«tuple<int, uint, uint>»──(10,8,7)-"
551 "«tuple<int, uint, uint>»──(10,7,5)-"
552 "«tuple<int, uint, uint>»──(10,6,3)-"
553 "«tuple<int, uint, uint>»──(10,5,1)"_expect);
Enumerate all "numbers" within a range.
auto buildIterTuple(ITS &&...iters)
void verify_exploration()
Custom-Datatype 1: uses std::hash extension point.
Helpers typically used while writing tests.
Building tree expanding and backtracking evaluations within hierarchical scopes.
Iterator builder to combine several iterables into a tuple sequence.
Implementation namespace for support and library code.
auto explore(IT &&srcSeq)
start building a IterExplorer by suitably wrapping the given iterable source.
auto zip(ITS &&...iters)
Build a tuple-combining iterator builder.
auto izip(ITS &&...iters)
tuple-combining iterator prefixed by index sequence
NumIter< INT > eachNum(INT start=std::numeric_limits< INT >::min(), INT end=std::numeric_limits< INT >::max())
convenience function to iterate "each number"
Test runner and basic definitions for tests.
constexpr NUM noneg(NUM val)
cut a numeric value to be >=0
string showHash(size_t hash, uint showBytes) noexcept
renders the size_t in hex, optionally only trailing bytes
string join(COLL &&coll, string const &delim=", ")
enumerate a collection's contents, separated by delimiter.
bool isnil(lib::time::Duration const &dur)
Simplistic test class runner.
#define LAUNCHER(_TEST_CLASS_, _GROUPS_)
A collection of frequently used helper functions to support unit testing.
#define VERIFY_ERROR(ERROR_ID, ERRONEOUS_STATEMENT)
Macro to verify that a statement indeed raises an exception.
Tiny helper functions and shortcuts to be used everywhere Consider this header to be effectively incl...