diff --git a/src/Dict.cc b/src/Dict.cc index b438387375..6089e9d6ee 100644 --- a/src/Dict.cc +++ b/src/Dict.cc @@ -265,6 +265,11 @@ TEST_CASE("dict new iteration") count++; } + PDict::iterator it; + it = dict.begin(); + it = dict.end(); + PDict::iterator it2 = it; + CHECK(count == 2); delete key; @@ -1558,8 +1563,11 @@ DictIterator::DictIterator(const Dictionary* d, detail::DictEntry* begin, detail DictIterator::~DictIterator() { - assert(dict->num_iterators > 0); - dict->num_iterators--; + if ( dict ) + { + assert(dict->num_iterators > 0); + dict->num_iterators--; + } } DictIterator& DictIterator::operator++() @@ -1574,6 +1582,80 @@ DictIterator& DictIterator::operator++() return *this; } +DictIterator::DictIterator(const DictIterator& that) + { + if ( this == &that ) + return; + + if ( dict ) + { + assert(dict->num_iterators > 0); + dict->num_iterators--; + } + + dict = that.dict; + curr = that.curr; + end = that.end; + dict->num_iterators++; + } + +DictIterator& DictIterator::operator=(const DictIterator& that) + { + if ( this == &that ) + return *this; + + if ( dict ) + { + assert(dict->num_iterators > 0); + dict->num_iterators--; + } + + dict = that.dict; + curr = that.curr; + end = that.end; + dict->num_iterators++; + + return *this; + } + +DictIterator::DictIterator(DictIterator&& that) + { + if ( this == &that ) + return; + + if ( dict ) + { + assert(dict->num_iterators > 0); + dict->num_iterators--; + } + + dict = that.dict; + curr = that.curr; + end = that.end; + + that.dict = nullptr; + } + +DictIterator& DictIterator::operator=(DictIterator&& that) + { + if ( this == &that ) + return *this; + + if ( dict ) + { + assert(dict->num_iterators > 0); + dict->num_iterators--; + } + + dict = that.dict; + curr = that.curr; + end = that.end; + + that.dict = nullptr; + + return *this; + } + diff --git a/src/Dict.h b/src/Dict.h index 25ed3aec31..c1a2b0cfa1 100644 --- a/src/Dict.h +++ b/src/Dict.h @@ -159,8 +159,14 @@ public: using difference_type = std::ptrdiff_t; using iterator_category = std::forward_iterator_tag; + DictIterator() = default; ~DictIterator(); + DictIterator(const DictIterator& that); + DictIterator& operator=(const DictIterator& that); + DictIterator(DictIterator&& that); + DictIterator& operator=(DictIterator&& that); + reference operator*() { return *curr; } pointer operator->() { return curr; } @@ -173,7 +179,6 @@ public: private: friend class Dictionary; - DictIterator() = default; DictIterator(const Dictionary* d, detail::DictEntry* begin, detail::DictEntry* end); Dictionary* dict = nullptr;