Merge remote-tracking branch 'origin/topic/timw/dict-iterator-construction'

* origin/topic/timw/dict-iterator-construction:
  GH-1546: Make DictIterator() public, add copy/move operators
This commit is contained in:
Tim Wojtulewicz 2021-05-17 11:57:58 -07:00
commit f66b4f5340
4 changed files with 94 additions and 4 deletions

View file

@ -1,3 +1,6 @@
4.1.0-dev.643 | 2021-05-17 11:57:58 -0700
* GH-1546: Make DictIterator() public, add copy/move operators (Tim Wojtulewicz, Corelight)
4.1.0-dev.641 | 2021-05-17 11:28:11 -0700 4.1.0-dev.641 | 2021-05-17 11:28:11 -0700

View file

@ -1 +1 @@
4.1.0-dev.641 4.1.0-dev.643

View file

@ -265,6 +265,11 @@ TEST_CASE("dict new iteration")
count++; count++;
} }
PDict<uint32_t>::iterator it;
it = dict.begin();
it = dict.end();
PDict<uint32_t>::iterator it2 = it;
CHECK(count == 2); CHECK(count == 2);
delete key; delete key;
@ -1558,8 +1563,11 @@ DictIterator::DictIterator(const Dictionary* d, detail::DictEntry* begin, detail
DictIterator::~DictIterator() DictIterator::~DictIterator()
{ {
assert(dict->num_iterators > 0); if ( dict )
dict->num_iterators--; {
assert(dict->num_iterators > 0);
dict->num_iterators--;
}
} }
DictIterator& DictIterator::operator++() DictIterator& DictIterator::operator++()
@ -1574,6 +1582,80 @@ DictIterator& DictIterator::operator++()
return *this; 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;
}

View file

@ -159,8 +159,14 @@ public:
using difference_type = std::ptrdiff_t; using difference_type = std::ptrdiff_t;
using iterator_category = std::forward_iterator_tag; using iterator_category = std::forward_iterator_tag;
DictIterator() = default;
~DictIterator(); ~DictIterator();
DictIterator(const DictIterator& that);
DictIterator& operator=(const DictIterator& that);
DictIterator(DictIterator&& that);
DictIterator& operator=(DictIterator&& that);
reference operator*() { return *curr; } reference operator*() { return *curr; }
pointer operator->() { return curr; } pointer operator->() { return curr; }
@ -173,7 +179,6 @@ public:
private: private:
friend class Dictionary; friend class Dictionary;
DictIterator() = default;
DictIterator(const Dictionary* d, detail::DictEntry* begin, detail::DictEntry* end); DictIterator(const Dictionary* d, detail::DictEntry* begin, detail::DictEntry* end);
Dictionary* dict = nullptr; Dictionary* dict = nullptr;