diff --git a/src/lib/diff/gen-node.hpp b/src/lib/diff/gen-node.hpp index c94185060..951e7d92d 100644 --- a/src/lib/diff/gen-node.hpp +++ b/src/lib/diff/gen-node.hpp @@ -428,6 +428,12 @@ namespace diff{ scopes_.emplace_back(n); } + size_t + depth() const + { + return scopes_.size(); + } + /* === Iteration control API for IterStateWrapper == */ friend bool @@ -480,6 +486,8 @@ namespace diff{ : IterStateWrapper { using IterStateWrapper::IterStateWrapper; + + size_t level() const { return unConst(this)->stateCore().depth(); } }; diff --git a/tests/library/diff/gen-node-basic-test.cpp b/tests/library/diff/gen-node-basic-test.cpp index e26ba6292..e5bd5dc19 100644 --- a/tests/library/diff/gen-node-basic-test.cpp +++ b/tests/library/diff/gen-node-basic-test.cpp @@ -285,12 +285,14 @@ namespace test{ auto iter = n.begin(); - CHECK (!isnil (iter)); // initially the Record itself is exposed - CHECK ("baked beans" == iter->idi.getSym()); + CHECK (!isnil (iter)); + CHECK (1 == iter.level()); + CHECK ("baked beans" == iter->idi.getSym()); // initially the Record itself is exposed CHECK (Rec::TYPE_NIL == iter->data.get().getType()); ++iter; - CHECK ("hasSpam" == iter->idi.getSym()); // delve into the contents, starting with the attribute(s) + CHECK (2 == iter.level()); // delve into the contents, + CHECK ("hasSpam" == iter->idi.getSym()); // ...starting with the attribute(s) CHECK (true == iter->data.get()); CHECK ("GenNode-ID(\"hasSpam\")-DataCap|«bool»|1" == string(*iter)); @@ -311,6 +313,7 @@ namespace test{ CHECK ("ham" == iter->data.get().getType()); ++iter; + CHECK (3 == iter.level()); CHECK ("eggs" == iter->data.get()); // contents of the nested ("spam") object's scope ++iter; @@ -318,20 +321,16 @@ namespace test{ ++iter; CHECK ("spam" == iter->data.get()); + CHECK (3 == iter.level()); ++iter; - CHECK ("_END_spam" == iter->idi.getSym()); // bracketing construct to close the nested scope - - ++iter; + CHECK (2 == iter.level()); // decreasing level indicates we left nested scope CHECK (!iter->isNamed()); // next item in the enclosing scope CHECK (42 == iter->data.get()); + CHECK (2 == iter.level()); - ++iter; - CHECK ("_END_baked beans" == iter->idi.getSym()); // bracketing returns to top level - CHECK (isSameObject(n.data.get(), iter->data.get())); - CHECK (Ref(n) == *iter); // actually this is a RecordRef to the original object - - ++iter; + ++iter; // nothing more on top level beyond the initial Record + CHECK (0 == iter.level()); CHECK (isnil (iter)); }