|
@@ -11,11 +11,9 @@ TEST(RecursiveIteratorTest, CanStdGetToAllLayersOfInternalIteration) {
|
|
|
{2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
{2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
};
|
|
};
|
|
|
auto rit = make_recursive_iterator(obj);
|
|
auto rit = make_recursive_iterator(obj);
|
|
|
- EXPECT_TRUE(
|
|
|
|
|
- (testing::StaticAssertTypeEq<
|
|
|
|
|
- decltype(std::get<0>(rit)),
|
|
|
|
|
- iterator::end_aware_iterator<
|
|
|
|
|
- std::map<int, std::vector<std::map<int, int>>>::iterator>>()));
|
|
|
|
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
|
|
+ decltype(std::get<0>(rit)),
|
|
|
|
|
+ iterator::end_aware_iterator<decltype(obj)::iterator>>()));
|
|
|
EXPECT_TRUE(
|
|
EXPECT_TRUE(
|
|
|
(testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
|
|
(testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
|
|
|
iterator::end_aware_iterator<std::vector<
|
|
iterator::end_aware_iterator<std::vector<
|
|
@@ -23,28 +21,113 @@ TEST(RecursiveIteratorTest, CanStdGetToAllLayersOfInternalIteration) {
|
|
|
EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
decltype(std::get<2>(rit)),
|
|
decltype(std::get<2>(rit)),
|
|
|
iterator::end_aware_iterator<std::map<int, int>::iterator>>()));
|
|
iterator::end_aware_iterator<std::map<int, int>::iterator>>()));
|
|
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
|
|
+ decltype(*rit), std::tuple<int const &, int const &, int &>>()));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(RecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
|
|
|
|
|
+ std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
|
|
+ {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
|
|
+ {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
|
|
+ };
|
|
|
|
|
+ auto rit = make_recursive_iterator(obj);
|
|
|
|
|
+ EXPECT_THAT(std::get<0>(rit), make_end_aware_iterator(obj));
|
|
|
|
|
+ EXPECT_THAT(std::get<1>(rit), make_end_aware_iterator(obj[1]));
|
|
|
|
|
+ EXPECT_THAT(std::get<2>(rit), make_end_aware_iterator(obj[1][0]));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// TODO: This ought to be implemented as a compiles-test
|
|
|
|
|
+TEST(RecursiveIteratorTest, CanCastCompatibleIterators) {
|
|
|
|
|
+ std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
|
|
+ {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
|
|
+ {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
|
|
+ };
|
|
|
|
|
+ auto rit = make_recursive_iterator(obj);
|
|
|
|
|
+ iterator::recursive_iterator<decltype(obj)::const_iterator> cit(rit);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-TEST(RecursiveIteratorTest, CanConstructInPlaceFromIterators) {
|
|
|
|
|
- std::map<int, std::vector<std::map<int, int>>> const obj{
|
|
|
|
|
- {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
|
|
|
|
|
- auto const it = make_end_aware_iterator(obj.begin(), obj.end());
|
|
|
|
|
- auto const it_1 = ++make_end_aware_iterator(it->second);
|
|
|
|
|
- auto const it_2 = make_end_aware_iterator(*it_1);
|
|
|
|
|
- // Note that this carries the weakness of non bounds-checking that our
|
|
|
|
|
- // iterators are all sitting on the same hierarchy...
|
|
|
|
|
- EXPECT_NO_THROW(make_recursive_iterator(it, it_1, it_2));
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-TEST(RecursiveIteratorTest, InternalIteratorsFromStdGetMatchCtorArgs) {
|
|
|
|
|
- std::map<int, std::vector<std::map<int, int>>> const obj{
|
|
|
|
|
- {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
|
|
|
|
|
- auto const it = make_end_aware_iterator(obj.begin(), obj.end());
|
|
|
|
|
- auto const it_1 = ++make_end_aware_iterator(it->second);
|
|
|
|
|
- auto const it_2 = make_end_aware_iterator(*it_1);
|
|
|
|
|
- iterator::recursive_iterator<decltype(obj.cbegin())> rit{iterator::in_place,
|
|
|
|
|
- it, it_1, it_2};
|
|
|
|
|
- EXPECT_THAT(std::get<0>(rit), it);
|
|
|
|
|
- EXPECT_THAT(std::get<1>(rit), it_1);
|
|
|
|
|
- EXPECT_THAT(std::get<2>(rit), it_2);
|
|
|
|
|
|
|
+TEST(RecursiveIteratorTest, EmptyCtorIsEnd) {
|
|
|
|
|
+ std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
|
|
+ {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
|
|
+ {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
|
|
+ };
|
|
|
|
|
+ auto rit = make_recursive_iterator(obj);
|
|
|
|
|
+ EXPECT_THAT(rit, testing::Ne(decltype(rit)()));
|
|
|
|
|
+ EXPECT_THAT(std::distance(rit, decltype(rit)()), 4);
|
|
|
|
|
+ std::advance(rit, 4);
|
|
|
|
|
+ EXPECT_THAT(rit, decltype(rit)());
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+TEST(BoundedRecursiveIteratorTest, CanStdGetToNLayersOfInternalIteration) {
|
|
|
|
|
+ std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
|
|
+ {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
|
|
+ {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
|
|
+ };
|
|
|
|
|
+ auto rit = make_recursive_iterator<2>(obj);
|
|
|
|
|
+ EXPECT_TRUE((testing::StaticAssertTypeEq<
|
|
|
|
|
+ decltype(std::get<0>(rit)),
|
|
|
|
|
+ iterator::end_aware_iterator<decltype(obj)::iterator>>()));
|
|
|
|
|
+ EXPECT_TRUE(
|
|
|
|
|
+ (testing::StaticAssertTypeEq<decltype(std::get<1>(rit)),
|
|
|
|
|
+ iterator::end_aware_iterator<std::vector<
|
|
|
|
|
+ std::map<int, int>>::iterator>>()));
|
|
|
|
|
+ EXPECT_TRUE(
|
|
|
|
|
+ (testing::StaticAssertTypeEq<
|
|
|
|
|
+ decltype(*rit), std::tuple<int const &, std::map<int, int> &>>()));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(BoundedRecursiveIteratorTest, CanAccessInternalIteratorsWithGet) {
|
|
|
|
|
+ std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
|
|
+ {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
|
|
+ {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
|
|
+ };
|
|
|
|
|
+ auto rit = make_recursive_iterator<2>(obj);
|
|
|
|
|
+ EXPECT_THAT(std::get<0>(rit), make_end_aware_iterator(obj));
|
|
|
|
|
+ EXPECT_THAT(std::get<1>(rit), make_end_aware_iterator(obj[1]));
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// TODO: This ought to be implemented as a compiles-test
|
|
|
|
|
+TEST(BoundedRecursiveIteratorTest, CanCastCompatibleIterators) {
|
|
|
|
|
+ std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
|
|
+ {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
|
|
+ {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
|
|
+ };
|
|
|
|
|
+ auto rit = make_recursive_iterator<2>(obj);
|
|
|
|
|
+ iterator::recursive_iterator_n<decltype(obj)::const_iterator, 2> cit(rit);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(BoundedRecursiveIteratorTest, EmptyCtorIsEnd) {
|
|
|
|
|
+ std::map<int, std::vector<std::map<int, int>>> obj{
|
|
|
|
|
+ {1, {{{1, 1}}, {{2, 2}}}}, // 2 1-element maps
|
|
|
|
|
+ {2, {{{3, 3}, {4, 4}}}} // 1 2-element map
|
|
|
|
|
+ };
|
|
|
|
|
+ auto rit = make_recursive_iterator<2>(obj);
|
|
|
|
|
+ EXPECT_THAT(rit, testing::Ne(decltype(rit)()));
|
|
|
|
|
+ EXPECT_THAT(std::distance(rit, decltype(rit)()), 3);
|
|
|
|
|
+ std::advance(rit, 3);
|
|
|
|
|
+ EXPECT_THAT(rit, decltype(rit)());
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+// TEST(RecursiveIteratorTest, CanConstructInPlaceFromIterators) {
|
|
|
|
|
+// std::map<int, std::vector<std::map<int, int>>> const obj{
|
|
|
|
|
+// {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
|
|
|
|
|
+// auto const it = make_end_aware_iterator(obj.begin(), obj.end());
|
|
|
|
|
+// auto const it_1 = ++make_end_aware_iterator(it->second);
|
|
|
|
|
+// auto const it_2 = make_end_aware_iterator(*it_1);
|
|
|
|
|
+// // Note that this carries the weakness of non bounds-checking that our
|
|
|
|
|
+// // iterators are all sitting on the same hierarchy...
|
|
|
|
|
+// EXPECT_NO_THROW(make_recursive_iterator(it, it_1, it_2));
|
|
|
|
|
+//}
|
|
|
|
|
+//
|
|
|
|
|
+// TEST(RecursiveIteratorTest, InternalIteratorsFromStdGetMatchCtorArgs) {
|
|
|
|
|
+// std::map<int, std::vector<std::map<int, int>>> const obj{
|
|
|
|
|
+// {1, {{{1, 1}}, {{2, 2}}}}, {2, {{{3, 3}, {4, 4}}}}};
|
|
|
|
|
+// auto const it = make_end_aware_iterator(obj.begin(), obj.end());
|
|
|
|
|
+// auto const it_1 = ++make_end_aware_iterator(it->second);
|
|
|
|
|
+// auto const it_2 = make_end_aware_iterator(*it_1);
|
|
|
|
|
+// iterator::recursive_iterator<decltype(obj.cbegin())> rit{iterator::in_place,
|
|
|
|
|
+// it, it_1, it_2};
|
|
|
|
|
+// EXPECT_THAT(std::get<0>(rit), it);
|
|
|
|
|
+// EXPECT_THAT(std::get<1>(rit), it_1);
|
|
|
|
|
+// EXPECT_THAT(std::get<2>(rit), it_2);
|
|
|
|
|
+//}
|