1 #ifndef PROTOZERO_ITERATORS_HPP 2 #define PROTOZERO_ITERATORS_HPP 22 #if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN 38 template <
typename T,
typename P = std::pair<T, T>>
40 #ifdef PROTOZERO_STRICT_API 53 using value_type =
typename std::iterator_traits<T>::value_type;
98 constexpr
bool empty() const noexcept {
107 std::size_t
size() const noexcept {
108 return static_cast<size_t>(std::distance(
begin(),
end()));
117 protozero_assert(!
empty());
118 return *(this->first);
127 protozero_assert(!
empty());
138 swap(this->first, other.first);
139 swap(this->second, other.second);
150 template <
typename T>
159 template <
typename T>
163 const char* m_data =
nullptr;
167 using iterator_category = std::random_access_iterator_tag;
168 using value_type = T;
169 using difference_type = std::ptrdiff_t;
170 using pointer = value_type*;
171 using reference = value_type&;
187 value_type operator*()
const noexcept {
189 std::memcpy(&result, m_data,
sizeof(value_type));
190 #if PROTOZERO_BYTE_ORDER != PROTOZERO_LITTLE_ENDIAN 191 byteswap_inplace(&result);
197 m_data +=
sizeof(value_type);
208 return m_data == rhs.m_data;
212 return !(*
this == rhs);
216 m_data -=
sizeof(value_type);
227 return lhs.m_data < rhs.m_data;
244 m_data += (
sizeof(value_type) * val);
250 tmp.m_data += (
sizeof(value_type) * rhs);
256 tmp.m_data += (
sizeof(value_type) * lhs);
261 m_data -= (
sizeof(value_type) * val);
267 tmp.m_data -= (
sizeof(value_type) * rhs);
272 return static_cast<difference_type
>(lhs.m_data - rhs.m_data) / static_cast<difference_type>(
sizeof(T));
275 value_type operator[](difference_type n)
const noexcept {
285 template <
typename T>
298 using iterator_category = std::forward_iterator_tag;
299 using value_type = T;
300 using difference_type = std::ptrdiff_t;
301 using pointer = value_type*;
302 using reference = value_type&;
313 return std::count_if(begin.m_data, end.m_data, [](
char c) noexcept {
314 return (static_cast<unsigned char>(c) & 0x80u) == 0;
325 const_varint_iterator(
const const_varint_iterator&) noexcept =
default;
326 const_varint_iterator(const_varint_iterator&&) noexcept = default;
328 const_varint_iterator& operator=(const const_varint_iterator&) noexcept = default;
329 const_varint_iterator& operator=(const_varint_iterator&&) noexcept = default;
331 ~const_varint_iterator() noexcept = default;
333 value_type operator*()
const {
339 const_varint_iterator& operator++() {
345 const_varint_iterator operator++(
int) {
347 const const_varint_iterator tmp{*
this};
352 bool operator==(
const const_varint_iterator& rhs)
const noexcept {
356 bool operator!=(
const const_varint_iterator& rhs)
const noexcept {
357 return !(*
this == rhs);
366 template <
typename T>
371 using iterator_category = std::forward_iterator_tag;
372 using value_type = T;
373 using difference_type = std::ptrdiff_t;
374 using pointer = value_type*;
375 using reference = value_type&;
393 value_type operator*()
const {
394 protozero_assert(this->
m_data);
395 const char* d = this->
m_data;
400 protozero_assert(this->
m_data);
406 protozero_assert(this->
m_data);
423 inline typename protozero::const_varint_iterator<int32_t>::difference_type
430 inline typename protozero::const_varint_iterator<int64_t>::difference_type
437 inline typename protozero::const_varint_iterator<uint32_t>::difference_type
444 inline typename protozero::const_varint_iterator<uint64_t>::difference_type
451 inline typename protozero::const_svarint_iterator<int32_t>::difference_type
458 inline typename protozero::const_svarint_iterator<int64_t>::difference_type
466 #endif // PROTOZERO_ITERATORS_HPP constexpr iterator cbegin() const noexcept
Return iterator to beginning of range.
Definition: iterators.hpp:84
typename std::iterator_traits< T >::value_type value_type
The value type of the underlying iterator.
Definition: iterators.hpp:53
constexpr int64_t decode_zigzag64(uint64_t value) noexcept
Definition: varint.hpp:182
Definition: iterators.hpp:160
void swap(iterator_range &other) noexcept
Definition: iterators.hpp:136
constexpr iterator begin() const noexcept
Return iterator to beginning of range.
Definition: iterators.hpp:74
T iterator
The type of the iterators in this range.
Definition: iterators.hpp:50
constexpr iterator end() const noexcept
Return iterator to end of range.
Definition: iterators.hpp:79
Definition: iterators.hpp:416
Contains macro checks for different configurations.
constexpr iterator_range(iterator &&first_iterator, iterator &&last_iterator)
Definition: iterators.hpp:68
constexpr bool empty() const noexcept
Definition: iterators.hpp:98
void swap(iterator_range< T > &lhs, iterator_range< T > &rhs) noexcept
Definition: iterators.hpp:151
void skip_varint(const char **data, const char *end)
Definition: varint.hpp:112
void drop_front()
Definition: iterators.hpp:126
const char * m_end
Pointer to end iterator position.
Definition: iterators.hpp:294
std::size_t size() const noexcept
Definition: iterators.hpp:107
const char * m_data
Pointer to current iterator position.
Definition: iterators.hpp:291
Contains functions to swap bytes in values (for different endianness).
constexpr iterator_range()
Definition: iterators.hpp:58
Definition: iterators.hpp:367
Definition: iterators.hpp:286
Definition: iterators.hpp:39
Contains low-level varint and zigzag encoding and decoding functions.
value_type front() const
Definition: iterators.hpp:116
uint64_t decode_varint(const char **data, const char *end)
Definition: varint.hpp:89
constexpr iterator cend() const noexcept
Return iterator to end of range.
Definition: iterators.hpp:89
All parts of the protozero header-only library are in this namespace.
Definition: byteswap.hpp:23
void swap(data_view &lhs, data_view &rhs) noexcept
Definition: data_view.hpp:165