1 #ifndef GENESIS_UTILS_FORMATS_JSON_ITERATOR_H_ 2 #define GENESIS_UTILS_FORMATS_JSON_ITERATOR_H_ 102 class JsonIterator :
public std::iterator<std::random_access_iterator_tag, U>
113 std::is_same<U, JsonDocument>::value or
114 std::is_same<U, const JsonDocument>::value,
115 "JsonIterator only accepts (const) JsonDocument." 127 using pointer =
typename std::conditional<std::is_const<U>::value,
131 using reference =
typename std::conditional<std::is_const<U>::value,
157 iterator_ = begin_value;
163 iterator_ = end_value;
169 return (iterator_ == begin_value);
175 return (iterator_ == end_value);
196 difference_type iterator_ = std::numeric_limits<std::ptrdiff_t>::denorm_min();
224 , primitive_iterator()
242 assert(object_ !=
nullptr);
244 switch( object_->type_ ) {
246 iterator_.object_iterator =
typename JsonDocument::ObjectType::iterator();
251 iterator_.array_iterator =
typename JsonDocument::ArrayType::iterator();
266 : object_(other.object_)
267 , iterator_(other.iterator_)
274 std::is_nothrow_move_constructible<pointer>::value and
275 std::is_nothrow_move_assignable<pointer>::value and
276 std::is_nothrow_move_constructible<InternalIterator>::value and
277 std::is_nothrow_move_assignable<InternalIterator>::value
296 assert(object_ !=
nullptr);
298 switch( object_->type_ ) {
300 assert(iterator_.object_iterator != object_->value_.object->end());
301 return iterator_.object_iterator->second;
304 assert(iterator_.array_iterator != object_->value_.array->end());
305 return *iterator_.array_iterator;
308 throw std::out_of_range(
"Cannot get value from Json Iterator.");
311 if( iterator_.primitive_iterator.is_begin() ) {
315 throw std::out_of_range(
"Cannot get value from Json Iterator.");
326 assert(object_ !=
nullptr);
328 switch( object_->type_ ) {
330 assert(iterator_.object_iterator != object_->value_.object->end());
331 return &(iterator_.object_iterator->second);
334 assert(iterator_.array_iterator != object_->value_.array->end());
335 return &*iterator_.array_iterator;
338 if( iterator_.primitive_iterator.is_begin() ) {
342 throw std::out_of_range(
"cannot get value");
364 assert(object_ !=
nullptr);
366 switch( object_->type_ ) {
368 std::advance(iterator_.object_iterator, 1);
372 std::advance(iterator_.array_iterator, 1);
376 ++iterator_.primitive_iterator;
401 assert(object_ !=
nullptr);
403 switch( object_->type_ ) {
405 std::advance(iterator_.object_iterator, -1);
409 std::advance(iterator_.array_iterator, -1);
413 --iterator_.primitive_iterator;
428 if( object_ != other.object_ ) {
429 throw std::domain_error(
"Cannot compare Json Iterators of different containers.");
432 assert(object_ !=
nullptr);
434 switch( object_->type_ ) {
436 return (iterator_.object_iterator == other.iterator_.object_iterator);
439 return (iterator_.array_iterator == other.iterator_.array_iterator);
442 return (iterator_.primitive_iterator == other.iterator_.primitive_iterator);
463 if( object_ != other.object_ ) {
464 throw std::domain_error(
"Cannot compare Json Iterators of different containers.");
467 assert(object_ !=
nullptr);
469 switch( object_->type_ ) {
471 throw std::domain_error(
"Cannot compare order of Json object iterators.");
474 return (iterator_.array_iterator < other.iterator_.array_iterator);
477 return (iterator_.primitive_iterator < other.iterator_.primitive_iterator);
488 return not other.operator < (*this);
515 assert(object_ !=
nullptr);
517 switch( object_->type_ ) {
519 throw std::domain_error(
"Cannot use offsets with Json object iterators.");
522 std::advance(iterator_.array_iterator, i);
526 iterator_.primitive_iterator += i;
571 assert(object_ !=
nullptr);
573 switch( object_->type_ ) {
575 throw std::domain_error(
"Cannot use offsets with Json object iterators.");
579 return iterator_.array_iterator - other.iterator_.array_iterator;
583 return iterator_.primitive_iterator - other.iterator_.primitive_iterator;
594 assert(object_ !=
nullptr);
596 switch( object_->type_ ) {
598 throw std::domain_error(
"Cannot use operator[] for Json object iterators.");
602 return *std::next(iterator_.array_iterator, n);
606 throw std::out_of_range(
"Cannot get value from Json Iterator.");
610 if( iterator_.primitive_iterator == -n ) {
614 throw std::out_of_range(
"Cannot get value from Json Iterator.");
627 typename JsonDocument::ObjectType::key_type
key()
const 629 assert(object_ !=
nullptr);
631 if( object_->is_object() ) {
632 return iterator_.object_iterator->first;
635 throw std::domain_error(
"Cannot use key() for non-object Json Iterators.");
659 assert(object_ !=
nullptr);
661 switch( object_->type_ ) {
663 iterator_.object_iterator = object_->value_.object->begin();
667 iterator_.array_iterator = object_->value_.array->begin();
672 iterator_.primitive_iterator.set_end();
676 iterator_.primitive_iterator.set_begin();
688 assert(object_ !=
nullptr);
690 switch( object_->type_ ) {
692 iterator_.object_iterator = object_->value_.object->end();
696 iterator_.array_iterator = object_->value_.array->end();
700 iterator_.primitive_iterator.set_end();
719 #endif // include guard constexpr bool is_begin() const noexcept
std::bidirectional_iterator_tag iterator_category
void set_begin() noexcept
JsonIterator(const JsonIterator &other) noexcept
Copy constructor.
JsonIterator(pointer object)
Constructor for a given JSON instance.
bool operator<=(const JsonIterator &other) const
comparison: less than or equal
bool operator>=(const JsonIterator &other) const
comparison: greater than or equal
void swap(SequenceSet &lhs, SequenceSet &rhs)
JsonDocument::ObjectType::iterator object_iterator
PrimitiveIterator primitive_iterator
JsonDocument const * const_pointer
Container namespace for all symbols of genesis in order to keep them separate when used as a library...
JsonIterator operator--(int)
Post-decrement (it–).
JsonIterator operator-(difference_type i)
subtract from iterator
difference_type operator-(const JsonIterator &other) const
return difference
bool operator!=(const JsonIterator &other) const
comparison: not equal
JsonIterator & operator++()
Pre-increment (++it).
reference operator[](difference_type n) const
access to successor
typename JsonDocument::difference_type difference_type
bool operator>(const JsonIterator &other) const
comparison: greater than
JsonIterator & operator-=(difference_type i)
subtract from iterator
typename JsonDocument::value_type value_type
JsonIterator operator+(difference_type i)
add to iterator
an iterator for primitive JSON types
reference operator*() const
Return a reference to the value pointed to by the iterator.
bool operator==(const JsonIterator &other) const
comparison: equal
JsonIterator & operator+=(difference_type i)
add to iterator
reference value() const
return the value of an iterator
typename std::conditional< std::is_const< U >::value, typename JsonDocument::const_pointer, typename JsonDocument::pointer >::type pointer
std::ptrdiff_t difference_type
Store a Json value of any kind.
bool operator<(const JsonIterator &other) const
comparison: smaller
Template for a random access iterator for the JsonDocument class.
JsonIterator operator++(int)
Post-increment (it++).
JsonDocument::ObjectType::key_type key() const
return the key of an object iterator
JsonDocument::ArrayType::iterator array_iterator
typename std::conditional< std::is_const< U >::value, typename JsonDocument::const_reference, typename JsonDocument::reference >::type reference
pointer operator->() const
Dereference the Iterator.
constexpr bool is_end() const noexcept
JsonIterator & operator--()
pre-decrement (–it)
JsonDocument const & const_reference
InternalIterator() noexcept
JsonIterator & operator=(JsonIterator other) noexcept(std::is_nothrow_move_constructible< pointer >::value and std::is_nothrow_move_assignable< pointer >::value and std::is_nothrow_move_constructible< InternalIterator >::value and std::is_nothrow_move_assignable< InternalIterator >::value)
Copy assignment.