|
@@ -1,18 +1,24 @@
|
|
|
#include "iterator/recursive_iterator.h"
|
|
#include "iterator/recursive_iterator.h"
|
|
|
|
|
|
|
|
#include <map>
|
|
#include <map>
|
|
|
|
|
+#include <ranges>
|
|
|
#include <tuple>
|
|
#include <tuple>
|
|
|
#include <vector>
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
+#include <iterator/forwards.h>
|
|
|
|
|
+
|
|
|
#include "ranges.h"
|
|
#include "ranges.h"
|
|
|
#include "xcode_gtest_helper.h"
|
|
#include "xcode_gtest_helper.h"
|
|
|
|
|
|
|
|
|
|
+using iterator::bounded;
|
|
|
|
|
+using iterator::recursive_iterator;
|
|
|
|
|
+
|
|
|
using testing::IsEmpty;
|
|
using testing::IsEmpty;
|
|
|
|
|
|
|
|
TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map);
|
|
|
EXPECT_EQ(std::get<3>(*rit), 1);
|
|
EXPECT_EQ(std::get<3>(*rit), 1);
|
|
|
EXPECT_EQ(std::get<3>(*++rit), 2);
|
|
EXPECT_EQ(std::get<3>(*++rit), 2);
|
|
|
EXPECT_EQ(std::get<3>(*rit), 2);
|
|
EXPECT_EQ(std::get<3>(*rit), 2);
|
|
@@ -21,7 +27,7 @@ TEST(RecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
|
TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map);
|
|
|
EXPECT_EQ(std::get<3>(*rit), 1);
|
|
EXPECT_EQ(std::get<3>(*rit), 1);
|
|
|
EXPECT_EQ(std::get<3>(*rit++), 1);
|
|
EXPECT_EQ(std::get<3>(*rit++), 1);
|
|
|
EXPECT_EQ(std::get<3>(*rit), 2);
|
|
EXPECT_EQ(std::get<3>(*rit), 2);
|
|
@@ -30,7 +36,7 @@ TEST(RecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
|
TEST(RecursiveIteratorMapTest, IterDistanceIsSumOfInnerContainerSizes) {
|
|
TEST(RecursiveIteratorMapTest, IterDistanceIsSumOfInnerContainerSizes) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map);
|
|
|
|
|
|
|
|
EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 4);
|
|
EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 4);
|
|
|
}
|
|
}
|
|
@@ -40,7 +46,7 @@ TEST(RecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
std::vector<std::tuple<int, int, int, int>> const expected{
|
|
std::vector<std::tuple<int, int, int, int>> const expected{
|
|
|
{1, 1, 1, 1}, {2, 2, 2, 2}, {2, 3, 3, 3}, {2, 3, 4, 4}};
|
|
{1, 1, 1, 1}, {2, 2, 2, 2}, {2, 3, 3, 3}, {2, 3, 4, 4}};
|
|
|
- auto rit = make_recursive_iterator(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map);
|
|
|
|
|
|
|
|
EXPECT_EQ((ranges::to<std::vector<std::tuple<int, int, int, int>>>(
|
|
EXPECT_EQ((ranges::to<std::vector<std::tuple<int, int, int, int>>>(
|
|
|
rit, iterator::sentinel)),
|
|
rit, iterator::sentinel)),
|
|
@@ -50,7 +56,7 @@ TEST(RecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
|
TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map);
|
|
|
std::get<3>(*rit) = 4;
|
|
std::get<3>(*rit) = 4;
|
|
|
EXPECT_EQ(map[1][1][1], 4);
|
|
EXPECT_EQ(map[1][1][1], 4);
|
|
|
}
|
|
}
|
|
@@ -58,7 +64,7 @@ TEST(RecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
|
TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator<2>(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map, bounded<2>{});
|
|
|
EXPECT_EQ(std::get<2>(*rit), map[1][1]);
|
|
EXPECT_EQ(std::get<2>(*rit), map[1][1]);
|
|
|
EXPECT_EQ(std::get<2>(*++rit), map[2][2]);
|
|
EXPECT_EQ(std::get<2>(*++rit), map[2][2]);
|
|
|
EXPECT_EQ(std::get<2>(*rit), map[2][2]);
|
|
EXPECT_EQ(std::get<2>(*rit), map[2][2]);
|
|
@@ -67,7 +73,7 @@ TEST(BoundRecursiveIteratorMapTest, PreIncrementAdvancesIterator) {
|
|
|
TEST(BoundRecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
TEST(BoundRecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator<2>(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map, bounded<2>{});
|
|
|
EXPECT_EQ(std::get<2>(*rit), map[1][1]);
|
|
EXPECT_EQ(std::get<2>(*rit), map[1][1]);
|
|
|
EXPECT_EQ(std::get<2>(*rit++), map[1][1]);
|
|
EXPECT_EQ(std::get<2>(*rit++), map[1][1]);
|
|
|
EXPECT_EQ(std::get<2>(*rit), map[2][2]);
|
|
EXPECT_EQ(std::get<2>(*rit), map[2][2]);
|
|
@@ -76,7 +82,7 @@ TEST(BoundRecursiveIteratorMapTest, PostIncrementReturnsCopyOfPrev) {
|
|
|
TEST(BoundRecursiveIteratorMapTest, IterDistanceSumOnNLayersSize) {
|
|
TEST(BoundRecursiveIteratorMapTest, IterDistanceSumOnNLayersSize) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
std::map<int, std::map<int, std::map<int, int>>> const map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator<2>(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map, bounded<2>{});
|
|
|
|
|
|
|
|
EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 3);
|
|
EXPECT_EQ(ranges::distance(rit, iterator::sentinel), 3);
|
|
|
}
|
|
}
|
|
@@ -86,17 +92,16 @@ TEST(BoundRecursiveIteratorMapTest, ElementsAreUnwrappedAsATuple) {
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
std::vector<std::tuple<int, int, std::map<int, int>>> const expected{
|
|
std::vector<std::tuple<int, int, std::map<int, int>>> const expected{
|
|
|
{1, 1, {{1, 1}}}, {2, 2, {{2, 2}}}, {2, 3, {{3, 3}, {4, 4}}}};
|
|
{1, 1, {{1, 1}}}, {2, 2, {{2, 2}}}, {2, 3, {{3, 3}, {4, 4}}}};
|
|
|
- auto rit = make_recursive_iterator<2>(map);
|
|
|
|
|
|
|
|
|
|
- EXPECT_EQ((ranges::to<std::vector<std::tuple<int, int, std::map<int, int>>>>(
|
|
|
|
|
- rit, iterator::sentinel)),
|
|
|
|
|
- expected);
|
|
|
|
|
|
|
+ EXPECT_THAT(map | iterator::views::recursive_n<2> |
|
|
|
|
|
+ std::ranges::to<std::vector>(),
|
|
|
|
|
+ testing::ElementsAreArray(expected));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
TEST(BoundedRecursiveIteratorMapTest, CanMutatePointedToData) {
|
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
std::map<int, std::map<int, std::map<int, int>>> map{
|
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
{1, {{1, {{1, 1}}}}}, {2, {{2, {{2, 2}}}, {3, {{3, 3}, {4, 4}}}}}};
|
|
|
- auto rit = make_recursive_iterator<2>(map);
|
|
|
|
|
|
|
+ auto rit = recursive_iterator(map, bounded<2>{});
|
|
|
std::get<2>(*rit).clear();
|
|
std::get<2>(*rit).clear();
|
|
|
EXPECT_THAT(map[1][1], IsEmpty());
|
|
EXPECT_THAT(map[1][1], IsEmpty());
|
|
|
}
|
|
}
|