Sequoia
Loading...
Searching...
No Matches
PartitionedDataGenericTests.hpp
1
2// Copyright Oliver J. Rosten 2023. //
3// Distributed under the GNU GENERAL PUBLIC LICENSE, Version 3.0. //
4// (See accompanying file LICENSE.md or copy at //
5// https://www.gnu.org/licenses/gpl-3.0.en.html) //
7
8#pragma once
9
11
14
15namespace sequoia::testing
16{
17 namespace partitioned_data
18 {
19 enum data_description : std::size_t {
20 empty = 0,
21
22 // []
23 empty_partition,
24
25 // [2]
26 one_2,
27
28 // [3]
29 one_3,
30
31 // [2,3]
32 one_2_3,
33
34 // [3,2]
35 one_3_2,
36
37 // [3, 2, 4]
38 one_3_4_2,
39
40 // [][]
41 two_empty_partitions,
42
43 // [2][]
44 two_2__,
45
46 // [3][]
47 two_3__,
48
49 // [2,3][]
50 two_2_3__,
51
52 // [][2]
53 two__2,
54
55 // [][2,3]
56 two__2_3,
57
58 // [2][3]
59 two_2__3,
60
61 // [3][2]
62 two_3__2,
63
64 // [2][][3]
65 three_2____3,
66
67 // [3][][2]
68 three_3____2,
69
70 // [2][3][]
71 three_2__3__
72 };
73 }
74
75 template<class PartitionedData>
77 {
78 public:
79 using data_t = PartitionedData;
80 using value_type = typename PartitionedData::value_type;
81 using equiv_t = std::initializer_list<std::initializer_list<value_type>>;
82 using transition_graph = typename transition_checker<data_t>::transition_graph;
83
84 static void execute_operations(regular_test& t)
85 {
86 auto trg{make_transition_graph(t)};
87
88 auto checker{
89 [&t](std::string_view description, const data_t& obtained, const data_t& prediction, const data_t& parent, std::size_t host, std::size_t target) {
90 t.check(equality, {description, no_source_location}, obtained, prediction);
91 if(host != target) t.check_semantics({description, no_source_location}, prediction, parent);
92 }
93 };
94
96 }
97
98 [[nodiscard]]
99 static data_t make_and_check(regular_test& t, std::string_view description, equiv_t init)
100 {
101 data_t d{init};
102 t.check(equivalence, description, d, init);
103 return d;
104 }
105
106 [[nodiscard]]
107 static transition_graph make_transition_graph(regular_test& t)
108 {
109 using namespace partitioned_data;
110 return transition_graph{
111 {
112 { // begin 'empty'
113 {
114 data_description::empty,
115 t.report(""),
116 [&t](data_t d) -> data_t {
117 t.check_exception_thrown<std::out_of_range>("Pushing back to non-existent partition throws", [&d]() { return d.push_back_to_partition(0, 8); });
118 return d;
119 }
120 },
121 {
122 data_description::empty,
123 t.report(""),
124 [&t](data_t d) -> data_t {
125 t.check_exception_thrown<std::out_of_range>("Inserting to non-existent partition throws", [&d]() { return d.insert_to_partition(d.cbegin_partition(0), 8); });
126 return d;
127 }
128 },
129 {
130 data_description::empty,
131 t.report(""),
132 [&t](data_t d) -> data_t {
133 t.check_exception_thrown<std::out_of_range>("Inserting to non-existent partition throws", [&d]() { return d.insert_to_partition(0, 0, 8); });
134 return d;
135 }
136 },
137 {
138 data_description::empty,
139 t.report("Swapping non-existent partition"),
140 [&t](data_t d) -> data_t {
141 d.swap_partitions(0, 0);
142 return d;
143 }
144 },
145 {
146 data_description::empty,
147 t.report("Clear empty container"),
148 [&t](data_t d) -> data_t {
149 d.clear();
150 return d;
151 }
152 },
153 {
154 data_description::empty_partition,
155 t.report("Add slot to empty container"),
156 [&t](data_t d) -> data_t {
157 d.add_slot();
158 return d;
159 }
160 },
161 {
162 data_description::empty_partition,
163 t.report("Insert slot to empty container"),
164 [&t](data_t d) -> data_t {
165 d.insert_slot(0);
166 return d;
167 }
168 }
169 }, // end 'empty'
170 { // begin 'empty_partition'
171 {
172 data_description::empty_partition,
173 t.report(""),
174 [&t](data_t d) -> data_t {
175 t.check_exception_thrown<std::out_of_range>("Pushing back to non-existent partition throws", [&d]() { return d.push_back_to_partition(1, 8); });
176 return d;
177 }
178 },
179 {
180 data_description::empty_partition,
181 t.report(""),
182 [&t](data_t d) -> data_t {
183 t.check_exception_thrown<std::out_of_range>("Inserting to non-existent partition throws", [&d]() { return d.insert_to_partition(d.cbegin_partition(1), 8); });
184 return d;
185 }
186 },
187 {
188 data_description::empty_partition,
189 t.report(""),
190 [&t](data_t d) -> data_t {
191 t.check_exception_thrown<std::out_of_range>("Inserting to non-existent partition throws", [&d]() { return d.insert_to_partition(1, 0, 8); });
192 return d;
193 }
194 },
195 {
196 data_description::empty_partition,
197 t.report("Swapping non-existent partition"),
198 [&t](data_t d) -> data_t {
199 d.swap_partitions(0, 1);
200 return d;
201 }
202 },
203 {
204 data_description::empty_partition,
205 t.report("Swapping non-existent partition"),
206 [&t](data_t d) -> data_t {
207 d.swap_partitions(1, 0);
208 return d;
209 }
210 },
211 {
212 data_description::empty_partition,
213 t.report(""),
214 [&t](data_t d) -> data_t {
215 auto i{d.erase_from_partition(d.cbegin_partition(0))};
216 t.check(equality, "Erase from partition with nothing in it", i, d.begin_partition(0));
217 return d;
218 }
219 },
220 {
221 data_description::empty_partition,
222 t.report(""),
223 [&t](data_t d) -> data_t {
224 auto i{d.erase_from_partition(0, 0)};
225 t.check(equality, "Erase from partition with nothing in it", i, d.begin_partition(0));
226 return d;
227 }
228 },
229 {
230 data_description::empty_partition,
231 t.report(""),
232 [&t](data_t d) -> data_t {
233 auto i{d.erase_from_partition(0, 1)};
234 t.check(equality, "Erase from partition with nothing in it", i, d.begin_partition(0));
235 return d;
236 }
237 },
238 {
239 data_description::empty_partition,
240 t.report(""),
241 [&t](data_t d) -> data_t {
242 auto i{d.erase_from_partition(d.cbegin_partition(0), d.cend_partition(0))};
243 t.check(equality, "Erase empty range", i, d.begin_partition(0));
244 return d;
245 }
246 },
247 {
248 data_description::empty_partition,
249 t.report(""),
250 [&t](data_t d) -> data_t {
251 t.check_exception_thrown<std::domain_error>("", [&d](){ d.erase_from_partition(d.cbegin_partition(0), d.cend_partition(1)); });
252 return d;
253 }
254 },
255 {
256 data_description::empty_partition,
257 t.report(""),
258 [&t](data_t d) -> data_t {
259 t.check_exception_thrown<std::domain_error>("", [&d](){ d.erase_from_partition(d.cbegin_partition(1), d.cend_partition(0)); });
260 return d;
261 }
262 },
263 {
264 data_description::empty_partition,
265 t.report(""),
266 [&t](data_t d) -> data_t {
267 auto i{d.erase_from_partition(d.cbegin_partition(1), d.cend_partition(1))};
268 t.check(equality, "Erase fictional range", i, d.end_partition(1));
269 return d;
270 }
271 },
272 {
273 data_description::empty_partition,
274 t.report("Swapping non-existent partition"),
275 [&t](data_t d) -> data_t {
276 d.swap_partitions(0, 0);
277 return d;
278 }
279 },
280 {
281 data_description::empty_partition,
282 t.report("Swapping non-existent partition"),
283 [&t](data_t d) -> data_t {
284 d.swap_partitions(1, 0);
285 return d;
286 }
287 },
288 {
289 data_description::empty_partition,
290 t.report(""),
291 [&t](data_t d) -> data_t {
292 d.swap_partitions(0, 1);
293 return d;
294 }
295 },
296 {
297 data_description::empty,
298 t.report("Clear empty container"),
299 [&t](data_t d) -> data_t {
300 d.clear();
301 return d;
302 }
303 },
304 {
305 data_description::empty,
306 t.report(""),
307 [&t](data_t d) -> data_t {
308 d.erase_slot(0);
309 return d;
310 }
311 },
312 {
313 data_description::one_2,
314 t.report(""),
315 [&t](data_t d) -> data_t {
316 d.push_back_to_partition(0, 2);
317 return d;
318 }
319 },
320 {
321 data_description::one_2,
322 t.report(""),
323 [&t](data_t d) -> data_t {
324 d.insert_to_partition(d.cbegin_partition(0), 2);
325 return d;
326 }
327 },
328 {
329 data_description::two_empty_partitions,
330 t.report(""),
331 [&t](data_t d) -> data_t {
332 d.add_slot();
333 return d;
334 }
335 },
336 {
337 data_description::two_empty_partitions,
338 t.report(""),
339 [&t](data_t d) -> data_t {
340 d.insert_slot(0);
341 return d;
342 }
343 },
344 {
345 data_description::two_empty_partitions,
346 t.report(""),
347 [&t](data_t d) -> data_t {
348 d.insert_slot(1);
349 return d;
350 }
351 }
352 }, // end 'empty_partition'
353 { // begin 'one_2'
354 {
355 data_description::empty_partition,
356 t.report(""),
357 [&t](data_t d) -> data_t {
358 d.erase_from_partition(d.cbegin_partition(0));
359 return d;
360 }
361 },
362 {
363 data_description::empty_partition,
364 t.report(""),
365 [&t](data_t d) -> data_t {
366 d.erase_from_partition(d.cbegin_partition(0), d.cend_partition(0));
367 return d;
368 }
369 },
370 {
371 data_description::empty,
372 t.report(""),
373 [&t](data_t d) -> data_t {
374 d.erase_slot(0);
375 return d;
376 }
377 },
378 {
379 data_description::empty,
380 t.report(""),
381 [&t](data_t d) -> data_t {
382 d.clear();
383 return d;
384 }
385 },
386 {
387 data_description::one_2,
388 t.report(""),
389 [&t](data_t d) -> data_t {
390 d.swap_partitions(0, 0);
391 return d;
392 }
393 },
394 {
395 data_description::one_3,
396 t.report(""),
397 [&t](data_t d) -> data_t {
398 *d.begin_partition(0) = 3;
399 return d;
400 }
401 },
402 {
403 data_description::one_3,
404 t.report(""),
405 [&t](data_t d) -> data_t {
406 *d.rbegin_partition(0) = 3;
407 return d;
408 }
409 },
410 {
411 data_description::one_2_3,
412 t.report(""),
413 [&t](data_t d) -> data_t {
414 d.push_back_to_partition(0, 3);
415 return d;
416 }
417 },
418 {
419 data_description::one_2_3,
420 t.report(""),
421 [&t](data_t d) -> data_t {
422 d.insert_to_partition(d.cbegin_partition(0)+1, 3);
423 return d;
424 }
425 },
426 {
427 data_description::two_2__,
428 t.report(""),
429 [&t](data_t d) -> data_t {
430 d.add_slot();
431 return d;
432 }
433 },
434 {
435 data_description::two__2,
436 t.report(""),
437 [&t](data_t d) -> data_t {
438 d.insert_slot(0);
439 return d;
440 }
441 }
442 }, // end 'one_2'
443 { // begin 'one_3'
444 {
445 data_description::one_2,
446 t.report(""),
447 [&t](data_t d) -> data_t {
448 *d.begin_partition(0) = 2;
449 return d;
450 }
451 },
452 {
453 data_description::one_3_2,
454 t.report(""),
455 [&t](data_t d) -> data_t {
456 d.push_back_to_partition(0, 2);
457 return d;
458 }
459 },
460 {
461 data_description::one_2_3,
462 t.report(""),
463 [&t](data_t d) -> data_t {
464 d.insert_to_partition(d.cbegin_partition(0), 2);
465 return d;
466 }
467 }
468 }, // end 'one_3'
469 { // begin 'one_2_3'
470 {
471 data_description::one_3,
472 t.report(""),
473 [&t](data_t d) -> data_t {
474 d.erase_from_partition(d.cbegin_partition(0));
475 return d;
476 }
477 },
478 {
479 data_description::one_3,
480 t.report(""),
481 [&t](data_t d) -> data_t {
482 d.erase_from_partition(d.cbegin_partition(0), d.cbegin_partition(0) + 1);
483 return d;
484 }
485 },
486 {
487 data_description::one_2,
488 t.report(""),
489 [&t](data_t d) -> data_t {
490 d.erase_from_partition(d.cbegin_partition(0)+1);
491 return d;
492 }
493 },
494 {
495 data_description::one_2,
496 t.report(""),
497 [&t](data_t d) -> data_t {
498 d.erase_from_partition(d.cbegin_partition(0) + 1, d.cend_partition(0));
499 return d;
500 }
501 },
502 {
503 data_description::empty_partition,
504 t.report(""),
505 [&t](data_t d) -> data_t {
506 d.erase_from_partition(d.cbegin_partition(0), d.cend_partition(0));
507 return d;
508 }
509 },
510 {
511 data_description::empty,
512 t.report(""),
513 [&t](data_t d) -> data_t {
514 d.erase_slot(0);
515 return d;
516 }
517 },
518 {
519 data_description::empty,
520 t.report(""),
521 [&t](data_t d) -> data_t {
522 d.clear();
523 return d;
524 }
525 },
526 {
527 data_description::one_3_2,
528 t.report(""),
529 [&t](data_t d) -> data_t {
530 std::ranges::sort(d.begin_partition(0), d.end_partition(0), std::greater{});
531 return d;
532 }
533 },
534 {
535 data_description::two__2_3,
536 t.report(""),
537 [&t](data_t d) -> data_t {
538 d.insert_slot(0);
539 return d;
540 }
541 }
542 }, // end 'one_2_3'
543 { // begin 'one_3_2'
544 {
545 data_description::one_2,
546 t.report(""),
547 [&t](data_t d) -> data_t {
548 d.erase_from_partition(d.cbegin_partition(0));
549 return d;
550 }
551 },
552 {
553 data_description::one_3,
554 t.report(""),
555 [&t](data_t d) -> data_t {
556 d.erase_from_partition(d.cbegin_partition(0) + 1);
557 return d;
558 }
559 },
560 {
561 data_description::one_2_3,
562 t.report(""),
563 [&t](data_t d) -> data_t {
564 std::ranges::sort(d.begin_partition(0), d.end_partition(0));
565 return d;
566 }
567 },
568 {
569 data_description::one_3_4_2,
570 t.report(""),
571 [&t](data_t d) -> data_t {
572 d.insert_to_partition(d.cbegin_partition(0) + 1, 4);
573 return d;
574 }
575 },
576 }, // end 'one_3_2'
577 { // begin 'one_3_4_2'
578 {
579 data_description::one_3_2,
580 t.report(""),
581 [&t](data_t d) -> data_t {
582 d.erase_from_partition(d.cbegin_partition(0) + 1);
583 return d;
584 }
585 },
586 {
587 data_description::one_3_2,
588 t.report(""),
589 [&t](data_t d) -> data_t {
590 d.erase_from_partition(d.cbegin_partition(0) + 1, d.cbegin_partition(0) + 2);
591 return d;
592 }
593 },
594 {
595 data_description::one_3,
596 t.report(""),
597 [&t](data_t d) -> data_t {
598 d.erase_from_partition(d.cbegin_partition(0) + 1, d.cend_partition(0));
599 return d;
600 }
601 },
602 {
603 data_description::one_2,
604 t.report(""),
605 [&t](data_t d) -> data_t {
606 d.erase_from_partition(d.cbegin_partition(0), d.cbegin_partition(0)+2);
607 return d;
608 }
609 }
610 }, // end 'one_3_4_2'
611 { // begin 'two_empty_partitions'
612 {
613 data_description::two_empty_partitions,
614 t.report(""),
615 [&t](data_t d) -> data_t {
616 t.check_exception_thrown<std::domain_error>("", [&d](){ d.erase_from_partition(d.cbegin_partition(0), d.cend_partition(1)); });
617 return d;
618 }
619 },
620 {
621 data_description::two_empty_partitions,
622 t.report(""),
623 [&t](data_t d) -> data_t {
624 d.swap_partitions(0, 0);
625 return d;
626 }
627 },
628 {
629 data_description::empty_partition,
630 t.report(""),
631 [&t](data_t d) -> data_t {
632 d.erase_slot(0);
633 return d;
634 }
635 },
636 {
637 data_description::empty_partition,
638 t.report(""),
639 [&t](data_t d) -> data_t {
640 d.erase_slot(1);
641 return d;
642 }
643 },
644 {
645 data_description::empty,
646 t.report(""),
647 [&t](data_t d) -> data_t {
648 d.clear();
649 return d;
650 }
651 },
652 {
653 data_description::two_2__,
654 t.report(""),
655 [&t](data_t d) -> data_t {
656 d.push_back_to_partition(0, 2);
657 return d;
658 }
659 },
660 {
661 data_description::two_2__,
662 t.report(""),
663 [&t](data_t d) -> data_t {
664 d.insert_to_partition(d.cbegin_partition(0), 2);
665 return d;
666 }
667 },
668 {
669 data_description::two__2,
670 t.report(""),
671 [&t](data_t d) -> data_t {
672 d.insert_to_partition(d.cbegin_partition(1), 2);
673 return d;
674 }
675 }
676 }, // end 'two_empty_partitions'
677 { // begin 'two_2__'
678 {
679 data_description::empty_partition,
680 t.report(""),
681 [&t](data_t d) -> data_t {
682 d.erase_slot(0);
683 return d;
684 }
685 },
686 {
687 data_description::one_2,
688 t.report(""),
689 [&t](data_t d) -> data_t {
690 d.erase_slot(1);
691 return d;
692 }
693 },
694 {
695 data_description::two__2,
696 t.report(""),
697 [&t](data_t d) -> data_t {
698 d.swap_partitions(0, 1);
699 return d;
700 }
701 },
702 {
703 data_description::two__2,
704 t.report(""),
705 [&t](data_t d) -> data_t {
706 d.swap_partitions(1, 0);
707 return d;
708 }
709 }
710 }, // end 'two_2__'
711 { // begin 'two_3__'
712 {
713 data_description::two_2_3__,
714 t.report(""),
715 [&t](data_t d) -> data_t {
716 d.insert_to_partition(d.cbegin_partition(0), 2);
717 return d;
718 }
719 }
720 }, // end 'two_3__'
721 { // begin 'two_2_3__'
722 {
723 data_description::two__2_3,
724 t.report(""),
725 [&t](data_t d) -> data_t {
726 d.swap_partitions(0, 1);
727 return d;
728 }
729 },
730 {
731 data_description::two_3__,
732 t.report(""),
733 [&t](data_t d) -> data_t {
734 d.erase_from_partition(d.cbegin_partition(0));
735 return d;
736 }
737 },
738 }, // end 'two_2_3__'
739 { // begin 'two__2'
740 {
741 data_description::two_2__,
742 t.report(""),
743 [&t](data_t d) -> data_t {
744 d.swap_partitions(1, 0);
745 return d;
746 }
747 }
748 }, // end 'two__2'
749 { // begin 'two__2_3'
750 {
751 data_description::two__2,
752 t.report(""),
753 [&t](data_t d) -> data_t {
754 d.erase_from_partition(d.cbegin_partition(1) + 1);
755 return d;
756 }
757 },
758 {
759 data_description::two_2_3__,
760 t.report(""),
761 [&t](data_t d) -> data_t {
762 d.swap_partitions(0, 1);
763 return d;
764 }
765 }
766 }, // end 'two__2_3'
767 { // begin 'two_2__3'
768 {
769 data_description::two_3__2,
770 t.report(""),
771 [&t](data_t d) -> data_t {
772 d.swap_partitions(0, 1);
773 return d;
774 }
775 },
776 {
777 data_description::two_2__,
778 t.report(""),
779 [&t](data_t d) -> data_t {
780 d.erase_from_partition(d.cbegin_partition(1), d.cend_partition(1));
781 return d;
782 }
783 },
784 {
785 data_description::one_2,
786 t.report(""),
787 [&t](data_t d) -> data_t {
788 d.erase_slot(1);
789 return d;
790 }
791 },
792 {
793 data_description::one_3,
794 t.report(""),
795 [&t](data_t d) -> data_t {
796 d.erase_slot(0);
797 return d;
798 }
799 },
800 {
801 data_description::three_2____3,
802 t.report(""),
803 [&t](data_t d) -> data_t {
804 d.insert_slot(1);
805 return d;
806 }
807 },
808 {
809 data_description::three_2__3__,
810 t.report(""),
811 [&t](data_t d) -> data_t {
812 d.insert_slot(2);
813 return d;
814 }
815 }
816 }, // end 'two_2__3'
817 { // begin 'two_3__2'
818 {
819 data_description::two_2__3,
820 t.report(""),
821 [&t](data_t d) -> data_t {
822 d.swap_partitions(1, 0);
823 return d;
824 }
825 },
826 {
827 data_description::three_3____2,
828 t.report(""),
829 [&t](data_t d) -> data_t {
830 d.insert_slot(1);
831 return d;
832 }
833 }
834 }, // end 'two_3__2'
835 { // begin 'three_2____3'
836 {
837 data_description::three_3____2,
838 t.report(""),
839 [&t](data_t d) -> data_t {
840 d.swap_partitions(0,2);
841 return d;
842 }
843 },
844 {
845 data_description::three_2__3__,
846 t.report(""),
847 [&t](data_t d) -> data_t {
848 d.swap_partitions(1,2);
849 return d;
850 }
851 },
852 {
853 data_description::two_2__3,
854 t.report(""),
855 [&t](data_t d) -> data_t {
856 d.erase_slot(1);
857 return d;
858 }
859 }
860 }, // end 'three_2____3'
861 { // begin 'three_3____2'
862 {
863 data_description::three_2____3,
864 t.report(""),
865 [&t](data_t d) -> data_t {
866 d.swap_partitions(2,0);
867 return d;
868 }
869 },
870 {
871 data_description::two__2,
872 t.report(""),
873 [&t](data_t d) -> data_t {
874 d.erase_slot(0);
875 return d;
876 }
877 }
878 }, // end 'three_3____2'
879 { // begin 'three_2__3__'
880 {
881 data_description::three_2____3,
882 t.report(""),
883 [&t](data_t d) -> data_t {
884 d.swap_partitions(2,1);
885 return d;
886 }
887 }
888 }, // end 'three_2__3__'
889 },
890 {
891 // 'empty'
892 make_and_check(t, t.report(""), {}),
893
894 // 'empty_partition'
895 make_and_check(t, t.report(""), {{}}),
896
897 // 'one_2'
898 make_and_check(t, t.report(""), {{2}}),
899
900 // 'one_3'
901 make_and_check(t, t.report(""), {{3}}),
902
903 // 'one_2_3'
904 make_and_check(t, t.report(""), {{2, 3}}),
905
906 // 'one_3_2'
907 make_and_check(t, t.report(""), {{3, 2}}),
908
909 // 'one_3_4_2'
910 make_and_check(t, t.report(""), {{3, 4, 2}}),
911
912 // 'two_empty_partitions'
913 make_and_check(t, t.report(""), {{}, {}}),
914
915 // 'two_2__'
916 make_and_check(t, t.report(""), {{2}, {}}),
917
918 // 'two_3__'
919 make_and_check(t, t.report(""), {{3}, {}}),
920
921 // 'two_2_3__'
922 make_and_check(t, t.report(""), {{2,3}, {}}),
923
924 // 'two__2'
925 make_and_check(t, t.report(""), {{}, {2}}),
926
927 // 'two__2_3'
928 make_and_check(t, t.report(""), {{}, {2, 3}}),
929
930 // 'two_2__3'
931 make_and_check(t, t.report(""), {{2}, {3}}),
932
933 // 'two_3__2'
934 make_and_check(t, t.report(""), {{3}, {2}}),
935
936 // 'three_2____3'
937 make_and_check(t, t.report(""), {{2}, {}, {3}}),
938
939 // 'three_3____2'
940 make_and_check(t, t.report(""), {{3}, {}, {2}}),
941
942 // 'three_2__3__'
943 make_and_check(t, t.report(""), {{2}, {3}, {}}),
944 }
945 };
946 }
947 };
948}
Utilities for checking regular semantics.
Facility to define tests via a graph comprising states of an object and transitions between them.
Definition: DynamicGraph.hpp:303
class template from which all concrete tests should derive.
Definition: FreeTestCore.hpp:144
Exposes elementary check methods, with the option to plug in arbitrary Extenders to compose functiona...
Definition: FreeCheckers.hpp:708
Definition: PartitionedDataGenericTests.hpp:77
Definition: StateTransitionUtilities.hpp:77