iter_t(const iter_t &) noexcept = default;
iter_t(iter_t &&) noexcept = default;
+ template<bool is_const_ = is_const>
+ iter_t(const iter_t<false>& it, std::enable_if_t<is_const_, int> = 0)
+ : iter_t{it.node, it.offset}
+ {}
iter_t &operator=(const iter_t &) = default;
iter_t &operator=(iter_t &&) = default;
- operator iter_t<!is_const>() const {
- static_assert(!is_const);
- return iter_t<!is_const>(node, offset);
- }
-
// Work nicely with for loops without requiring a nested type.
using reference = iter_t&;
iter_t &operator*() { return *this; }
offset - off);
}
- bool operator==(const iter_t &rhs) const {
- assert(node == rhs.node);
- return rhs.offset == offset;
+ friend bool operator==(const iter_t &lhs, const iter_t &rhs) {
+ assert(lhs.node == rhs.node);
+ return lhs.offset == rhs.offset;
}
- bool operator!=(const iter_t &rhs) const {
- return !(*this == rhs);
+ friend bool operator!=(const iter_t &lhs, const iter_t &rhs) {
+ return !(lhs == rhs);
}
+ friend bool operator==(const iter_t<is_const> &lhs, const iter_t<!is_const> &rhs) {
+ assert(lhs.node == rhs.node);
+ return lhs.offset == rhs.offset;
+ }
+ friend bool operator!=(const iter_t<is_const> &lhs, const iter_t<!is_const> &rhs) {
+ return !(lhs == rhs);
+ }
K get_key() const {
return K(node->get_key_ptr()[offset]);
}