Make all variants of multiframe iterators model ForwardIterator concept properly

This commit is contained in:
Kostas Kyrimis 2022-12-02 15:11:51 +02:00
parent be3797e0a1
commit 6b8a5fd41d
2 changed files with 71 additions and 38 deletions

View File

@ -19,15 +19,10 @@
namespace memgraph::query::v2 { namespace memgraph::query::v2 {
// #NoCommit uncomment https://github.com/memgraph/memgraph/pull/676#discussion_r1035704661 static_assert(std::forward_iterator<ValidFramesReader::Iterator>);
// static_assert(std::forward_iterator<ValidFramesReader::Iterator> && static_assert(std::forward_iterator<ValidFramesModifier::Iterator>);
// std::equality_comparable<ValidFramesReader::Iterator>); static_assert(std::forward_iterator<ValidFramesConsumer::Iterator>);
// static_assert(std::forward_iterator<ValidFramesModifier::Iterator> && static_assert(std::forward_iterator<InvalidFramesPopulator::Iterator>);
// std::equality_comparable<ValidFramesModifier::Iterator>);
// static_assert(std::forward_iterator<ValidFramesConsumer::Iterator> &&
// std::equality_comparable<ValidFramesConsumer::Iterator>);
// static_assert(std::forward_iterator<InvalidFramesPopulator::Iterator> &&
// std::equality_comparable<InvalidFramesPopulator::Iterator>);
MultiFrame::MultiFrame(int64_t size_of_frame, size_t number_of_frames, utils::MemoryResource *execution_memory) MultiFrame::MultiFrame(int64_t size_of_frame, size_t number_of_frames, utils::MemoryResource *execution_memory)
: frames_(utils::pmr::vector<FrameWithValidity>( : frames_(utils::pmr::vector<FrameWithValidity>(

View File

@ -107,22 +107,31 @@ class ValidFramesReader {
using pointer = value_type *; using pointer = value_type *;
using reference = const Frame &; using reference = const Frame &;
Iterator() {}
explicit Iterator(FrameWithValidity *ptr) : ptr_(ptr) {} explicit Iterator(FrameWithValidity *ptr) : ptr_(ptr) {}
reference operator*() const { return *ptr_; } reference operator*() const { return *ptr_; }
pointer operator->() { return ptr_; } pointer operator->() { return ptr_; }
// Prefix increment
Iterator &operator++() { Iterator &operator++() {
ptr_++; ptr_++;
return *this; return *this;
} }
friend bool operator==(const Iterator &a, const Iterator &b) { return a.ptr_ == b.ptr_; }; // clang-tidy warning is wrong here, because we & qualify the function, meaning that you can't post increment
friend bool operator!=(const Iterator &a, const Iterator &b) { return a.ptr_ != b.ptr_; }; // temporaries, e.g, (it++)++
// NOLINTNEXTLINE (cert-dcl21-cpp)
Iterator operator++(int) & {
auto old = *this;
ptr_++;
return old;
}
friend bool operator==(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ == rhs.ptr_; };
friend bool operator!=(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ != rhs.ptr_; };
private: private:
FrameWithValidity *ptr_; FrameWithValidity *ptr_{nullptr};
}; };
Iterator begin(); Iterator begin();
@ -138,10 +147,10 @@ class ValidFramesModifier {
explicit ValidFramesModifier(MultiFrame &multiframe); explicit ValidFramesModifier(MultiFrame &multiframe);
~ValidFramesModifier() = default; ~ValidFramesModifier() = default;
ValidFramesModifier(const ValidFramesModifier &other) = delete; // copy constructor ValidFramesModifier(const ValidFramesModifier &other) = delete;
ValidFramesModifier(ValidFramesModifier &&other) noexcept = delete; // move constructor ValidFramesModifier(ValidFramesModifier &&other) noexcept = delete;
ValidFramesModifier &operator=(const ValidFramesModifier &other) = delete; // copy assignment ValidFramesModifier &operator=(const ValidFramesModifier &other) = delete;
ValidFramesModifier &operator=(ValidFramesModifier &&other) noexcept = delete; // move assignment ValidFramesModifier &operator=(ValidFramesModifier &&other) noexcept = delete;
struct Iterator { struct Iterator {
using iterator_category = std::forward_iterator_tag; using iterator_category = std::forward_iterator_tag;
@ -149,6 +158,7 @@ class ValidFramesModifier {
using value_type = Frame; using value_type = Frame;
using pointer = value_type *; using pointer = value_type *;
using reference = Frame &; using reference = Frame &;
Iterator() {}
Iterator(FrameWithValidity *ptr, ValidFramesModifier &iterator_wrapper) Iterator(FrameWithValidity *ptr, ValidFramesModifier &iterator_wrapper)
: ptr_(ptr), iterator_wrapper_(&iterator_wrapper) {} : ptr_(ptr), iterator_wrapper_(&iterator_wrapper) {}
@ -165,12 +175,21 @@ class ValidFramesModifier {
return *this; return *this;
} }
friend bool operator==(const Iterator &a, const Iterator &b) { return a.ptr_ == b.ptr_; }; // clang-tidy warning is wrong here, because we & qualify the function, meaning that you can't post increment
friend bool operator!=(const Iterator &a, const Iterator &b) { return a.ptr_ != b.ptr_; }; // temporaries, e.g, (it++)++
// NOLINTNEXTLINE (cert-dcl21-cpp)
Iterator operator++(int) & {
auto old = *this;
++*this;
return old;
}
friend bool operator==(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ == rhs.ptr_; };
friend bool operator!=(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ != rhs.ptr_; };
private: private:
FrameWithValidity *ptr_; FrameWithValidity *ptr_{nullptr};
ValidFramesModifier *iterator_wrapper_; ValidFramesModifier *iterator_wrapper_{nullptr};
}; };
Iterator begin(); Iterator begin();
@ -185,10 +204,10 @@ class ValidFramesConsumer {
explicit ValidFramesConsumer(MultiFrame &multiframe); explicit ValidFramesConsumer(MultiFrame &multiframe);
~ValidFramesConsumer() noexcept; ~ValidFramesConsumer() noexcept;
ValidFramesConsumer(const ValidFramesConsumer &other) = delete; // copy constructor ValidFramesConsumer(const ValidFramesConsumer &other) = delete;
ValidFramesConsumer(ValidFramesConsumer &&other) noexcept = delete; // move constructor ValidFramesConsumer(ValidFramesConsumer &&other) noexcept = delete;
ValidFramesConsumer &operator=(const ValidFramesConsumer &other) = delete; // copy assignment ValidFramesConsumer &operator=(const ValidFramesConsumer &other) = delete;
ValidFramesConsumer &operator=(ValidFramesConsumer &&other) noexcept = delete; // move assignment ValidFramesConsumer &operator=(ValidFramesConsumer &&other) noexcept = delete;
struct Iterator { struct Iterator {
using iterator_category = std::forward_iterator_tag; using iterator_category = std::forward_iterator_tag;
@ -197,13 +216,14 @@ class ValidFramesConsumer {
using pointer = value_type *; using pointer = value_type *;
using reference = FrameWithValidity &; using reference = FrameWithValidity &;
Iterator() {}
Iterator(FrameWithValidity *ptr, ValidFramesConsumer &iterator_wrapper) Iterator(FrameWithValidity *ptr, ValidFramesConsumer &iterator_wrapper)
: ptr_(ptr), iterator_wrapper_(&iterator_wrapper) {} : ptr_(ptr), iterator_wrapper_(&iterator_wrapper) {}
reference operator*() const { return *ptr_; } reference operator*() const { return *ptr_; }
pointer operator->() { return ptr_; } pointer operator->() { return ptr_; }
// Prefix increment
Iterator &operator++() { Iterator &operator++() {
do { do {
ptr_++; ptr_++;
@ -212,12 +232,21 @@ class ValidFramesConsumer {
return *this; return *this;
} }
friend bool operator==(const Iterator &a, const Iterator &b) { return a.ptr_ == b.ptr_; }; // clang-tidy warning is wrong here, because we & qualify the function, meaning that you can't post increment
friend bool operator!=(const Iterator &a, const Iterator &b) { return a.ptr_ != b.ptr_; }; // temporaries, e.g, (it++)++
// NOLINTNEXTLINE (cert-dcl21-cpp)
Iterator operator++(int) & {
auto old = *this;
++*this;
return old;
}
friend bool operator==(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ == rhs.ptr_; };
friend bool operator!=(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ != rhs.ptr_; };
private: private:
FrameWithValidity *ptr_; FrameWithValidity *ptr_{nullptr};
ValidFramesConsumer *iterator_wrapper_; ValidFramesConsumer *iterator_wrapper_{nullptr};
}; };
Iterator begin(); Iterator begin();
@ -232,10 +261,10 @@ class InvalidFramesPopulator {
explicit InvalidFramesPopulator(MultiFrame &multiframe); explicit InvalidFramesPopulator(MultiFrame &multiframe);
~InvalidFramesPopulator() = default; ~InvalidFramesPopulator() = default;
InvalidFramesPopulator(const InvalidFramesPopulator &other) = delete; // copy constructor InvalidFramesPopulator(const InvalidFramesPopulator &other) = delete;
InvalidFramesPopulator(InvalidFramesPopulator &&other) noexcept = delete; // move constructor InvalidFramesPopulator(InvalidFramesPopulator &&other) noexcept = delete;
InvalidFramesPopulator &operator=(const InvalidFramesPopulator &other) = delete; // copy assignment InvalidFramesPopulator &operator=(const InvalidFramesPopulator &other) = delete;
InvalidFramesPopulator &operator=(InvalidFramesPopulator &&other) noexcept = delete; // move assignment InvalidFramesPopulator &operator=(InvalidFramesPopulator &&other) noexcept = delete;
struct Iterator { struct Iterator {
using iterator_category = std::forward_iterator_tag; using iterator_category = std::forward_iterator_tag;
@ -244,23 +273,32 @@ class InvalidFramesPopulator {
using pointer = value_type *; using pointer = value_type *;
using reference = FrameWithValidity &; using reference = FrameWithValidity &;
Iterator() {}
explicit Iterator(FrameWithValidity *ptr) : ptr_(ptr) {} explicit Iterator(FrameWithValidity *ptr) : ptr_(ptr) {}
reference operator*() const { return *ptr_; } reference operator*() const { return *ptr_; }
pointer operator->() { return ptr_; } pointer operator->() { return ptr_; }
// Prefix increment
Iterator &operator++() { Iterator &operator++() {
ptr_->MakeValid(); ptr_->MakeValid();
ptr_++; ptr_++;
return *this; return *this;
} }
friend bool operator==(const Iterator &a, const Iterator &b) { return a.ptr_ == b.ptr_; }; // clang-tidy warning is wrong here, because we & qualify the function, meaning that you can't post increment
friend bool operator!=(const Iterator &a, const Iterator &b) { return a.ptr_ != b.ptr_; }; // temporaries, e.g, (it++)++
// NOLINTNEXTLINE (cert-dcl21-cpp)
Iterator operator++(int) & {
auto old = *this;
++ptr_;
return old;
}
friend bool operator==(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ == rhs.ptr_; };
friend bool operator!=(const Iterator &lhs, const Iterator &rhs) { return lhs.ptr_ != rhs.ptr_; };
private: private:
FrameWithValidity *ptr_; FrameWithValidity *ptr_{nullptr};
}; };
Iterator begin(); Iterator begin();