json/include/nlohmann/detail/iterators/primitive_iterator.hpp

122 lines
2.8 KiB
C++
Raw Normal View History

2018-01-10 17:18:31 +08:00
#pragma once
#include <cstddef> // ptrdiff_t
#include <limits> // numeric_limits
namespace nlohmann
{
namespace detail
{
/*
@brief an iterator for primitive JSON types
This class models an iterator for primitive JSON types (boolean, number,
string). It's only purpose is to allow the iterator/const_iterator classes
to "iterate" over primitive values. Internally, the iterator is modeled by
a `difference_type` variable. Value begin_value (`0`) models the begin,
end_value (`1`) models past the end.
*/
class primitive_iterator_t
{
2018-01-17 03:41:04 +08:00
private:
using difference_type = std::ptrdiff_t;
2018-01-17 03:41:04 +08:00
static constexpr difference_type begin_value = 0;
static constexpr difference_type end_value = begin_value + 1;
JSON_PRIVATE_UNLESS_TESTED:
2018-01-17 03:41:04 +08:00
/// iterator as signed integer type
difference_type m_it = (std::numeric_limits<std::ptrdiff_t>::min)();
public:
constexpr difference_type get_value() const noexcept
{
return m_it;
}
/// set iterator to a defined beginning
void set_begin() noexcept
{
m_it = begin_value;
}
/// set iterator to a defined past the end
void set_end() noexcept
{
m_it = end_value;
}
/// return whether the iterator can be dereferenced
constexpr bool is_begin() const noexcept
{
return m_it == begin_value;
}
/// return whether the iterator is at end
constexpr bool is_end() const noexcept
{
return m_it == end_value;
}
friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
{
return lhs.m_it == rhs.m_it;
}
friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
{
return lhs.m_it < rhs.m_it;
}
2018-01-17 03:41:04 +08:00
primitive_iterator_t operator+(difference_type n) noexcept
{
auto result = *this;
2018-01-17 03:41:04 +08:00
result += n;
return result;
}
friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept
{
return lhs.m_it - rhs.m_it;
}
2018-01-17 03:41:04 +08:00
primitive_iterator_t& operator++() noexcept
{
++m_it;
return *this;
}
2018-01-17 03:41:04 +08:00
primitive_iterator_t const operator++(int) noexcept
{
auto result = *this;
++m_it;
return result;
}
2018-01-17 03:41:04 +08:00
primitive_iterator_t& operator--() noexcept
{
--m_it;
return *this;
}
2018-01-17 03:41:04 +08:00
primitive_iterator_t const operator--(int) noexcept
{
auto result = *this;
--m_it;
return result;
}
2018-01-17 03:41:04 +08:00
primitive_iterator_t& operator+=(difference_type n) noexcept
{
m_it += n;
return *this;
}
2018-01-17 03:41:04 +08:00
primitive_iterator_t& operator-=(difference_type n) noexcept
{
m_it -= n;
return *this;
}
};
} // namespace detail
} // namespace nlohmann