constexpr all the... deques

This commit is contained in:
2021-09-06 14:34:53 +03:00
parent d4493c2994
commit a354ded3de
4 changed files with 57 additions and 53 deletions
+22 -18
View File
@@ -58,16 +58,16 @@ class ring_iterator {
//! \name Constructor / Destructor
//! @{
public:
ring_iterator(const Iter_t base =nullptr) noexcept :
constexpr ring_iterator(const Iter_t base =nullptr) noexcept :
base_(base), iter_(base) { }
ring_iterator(const Iter_t base, size_t elem) noexcept :
constexpr ring_iterator(const Iter_t base, size_t elem) noexcept :
base_(base), iter_(base + elem) { }
ring_iterator(const ring_iterator& it) noexcept :
constexpr ring_iterator(const ring_iterator& it) noexcept :
base_(it.base_), iter_(it.iter_) { }
ring_iterator& operator= (const ring_iterator& it) noexcept {
constexpr ring_iterator& operator= (const ring_iterator& it) noexcept {
base_ = it.base_;
iter_ = it.iter_;
return *this;
@@ -77,18 +77,21 @@ class ring_iterator {
//! \name Forward iterator requirements
//! @{
public:
reference operator*() const noexcept {
constexpr reference operator*() const noexcept {
return *iter_;
}
pointer operator->() const noexcept {
constexpr pointer operator->() const noexcept {
return iter_;
}
ring_iterator& operator++() noexcept {
constexpr ring_iterator& operator++() noexcept {
if (static_cast<size_t>(++iter_ - base_) >= N)
iter_ = base_;
return *this;
}
ring_iterator operator++(int) noexcept {
constexpr ring_iterator operator++(int) noexcept {
ring_iterator it = *this;
if (static_cast<size_t>(++iter_ - base_) >= N)
iter_ = base_;
@@ -99,12 +102,12 @@ class ring_iterator {
//! \name Bidirectional iterator requirements
//! @{
public:
ring_iterator& operator--() noexcept {
constexpr ring_iterator& operator--() noexcept {
if (--iter_ < base_)
iter_ = base_ + N -1;
return *this;
}
ring_iterator operator--(int) noexcept {
constexpr ring_iterator operator--(int) noexcept {
ring_iterator it = *this;
if (--iter_ < base_)
iter_ = base_ + N -1;
@@ -114,33 +117,34 @@ class ring_iterator {
//! \name Random access iterator requirements
//! @{
reference operator[](difference_type n) const noexcept {
constexpr reference operator[](difference_type n) const noexcept {
difference_type k = iter_ - base_; // ptrdiff from base_
return (static_cast<size_t>(k + n) < N) ?
base_[k + n] : // on range
base_[k + n - N]; // out of range, loop
}
ring_iterator& operator+=(difference_type n) noexcept {
constexpr ring_iterator& operator+=(difference_type n) noexcept {
difference_type k = iter_ - base_; // ptrdiff from base_
iter_ += (static_cast<size_t>(k + n) < N) ?
n : // on range
n - N; // out of range, loop
return *this;
}
ring_iterator operator+(difference_type n) const noexcept {
constexpr ring_iterator operator+(difference_type n) const noexcept {
difference_type k = iter_ - base_; // ptrdiff from base_
return (static_cast<size_t>(k + n) < N) ?
ring_iterator(base_, k + n) : // on range
ring_iterator(base_, k + n - N); // out of range, loop
}
ring_iterator& operator-=(difference_type n) noexcept {
constexpr ring_iterator& operator-=(difference_type n) noexcept {
difference_type k = iter_ - base_; // ptrdiff from base_
iter_ -= ((k - n) < 0)?
n - N: // out of range, loop
n; // on range
return *this;
}
ring_iterator operator-(difference_type n) const noexcept {
constexpr ring_iterator operator-(difference_type n) const noexcept {
difference_type k = iter_ - base_; // ptrdiff from base_
return ((k - n) < 0) ?
ring_iterator(base_, k - n + N) : // out of range, loop
@@ -150,13 +154,13 @@ class ring_iterator {
//! \name Data members and access
//! @{
const Iter_t& base() const noexcept {
constexpr const Iter_t& base() const noexcept {
return base_;
}
const Iter_t& iter() const noexcept {
constexpr const Iter_t& iter() const noexcept {
return iter_;
}
size_t size() noexcept {
constexpr size_t size() noexcept {
return N;
}