add detail/iterators/json_reverse_iterator.hpp
This commit is contained in:
parent
5fc9ef2b90
commit
ae6f66048c
3 changed files with 125 additions and 109 deletions
3
Makefile
3
Makefile
|
@ -16,7 +16,8 @@ SRCS = ${SRCDIR}/json.hpp \
|
||||||
${SRCDIR}/detail/iterators/primitive_iterator.hpp \
|
${SRCDIR}/detail/iterators/primitive_iterator.hpp \
|
||||||
${SRCDIR}/detail/iterators/internal_iterator.hpp \
|
${SRCDIR}/detail/iterators/internal_iterator.hpp \
|
||||||
${SRCDIR}/detail/iterators/iter_impl.hpp \
|
${SRCDIR}/detail/iterators/iter_impl.hpp \
|
||||||
${SRCDIR}/detail/iterators/iteration_proxy.hpp
|
${SRCDIR}/detail/iterators/iteration_proxy.hpp \
|
||||||
|
${SRCDIR}/detail/iterators/json_reverse_iterator.hpp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
122
src/detail/iterators/json_reverse_iterator.hpp
Normal file
122
src/detail/iterators/json_reverse_iterator.hpp
Normal file
|
@ -0,0 +1,122 @@
|
||||||
|
#ifndef NLOHMANN_JSON_DETAIL_ITERATORS_JSON_REVERSE_ITERATOR_HPP
|
||||||
|
#define NLOHMANN_JSON_DETAIL_ITERATORS_JSON_REVERSE_ITERATOR_HPP
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <iterator>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace nlohmann
|
||||||
|
{
|
||||||
|
namespace detail
|
||||||
|
{
|
||||||
|
//////////////////////
|
||||||
|
// reverse_iterator //
|
||||||
|
//////////////////////
|
||||||
|
|
||||||
|
/*!
|
||||||
|
@brief a template for a reverse iterator class
|
||||||
|
|
||||||
|
@tparam Base the base iterator type to reverse. Valid types are @ref
|
||||||
|
iterator (to create @ref reverse_iterator) and @ref const_iterator (to
|
||||||
|
create @ref const_reverse_iterator).
|
||||||
|
|
||||||
|
@requirement The class satisfies the following concept requirements:
|
||||||
|
-
|
||||||
|
[BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator):
|
||||||
|
The iterator that can be moved can be moved in both directions (i.e.
|
||||||
|
incremented and decremented).
|
||||||
|
- [OutputIterator](http://en.cppreference.com/w/cpp/concept/OutputIterator):
|
||||||
|
It is possible to write to the pointed-to element (only if @a Base is
|
||||||
|
@ref iterator).
|
||||||
|
|
||||||
|
@since version 1.0.0
|
||||||
|
*/
|
||||||
|
template<typename Base>
|
||||||
|
class json_reverse_iterator : public std::reverse_iterator<Base>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
/// shortcut to the reverse iterator adapter
|
||||||
|
using base_iterator = std::reverse_iterator<Base>;
|
||||||
|
/// the reference type for the pointed-to element
|
||||||
|
using reference = typename Base::reference;
|
||||||
|
|
||||||
|
/// create reverse iterator from iterator
|
||||||
|
json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
|
||||||
|
: base_iterator(it) {}
|
||||||
|
|
||||||
|
/// create reverse iterator from base class
|
||||||
|
json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
|
||||||
|
|
||||||
|
/// post-increment (it++)
|
||||||
|
json_reverse_iterator const operator++(int)
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// pre-increment (++it)
|
||||||
|
json_reverse_iterator& operator++()
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator&>(base_iterator::operator++());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// post-decrement (it--)
|
||||||
|
json_reverse_iterator const operator--(int)
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// pre-decrement (--it)
|
||||||
|
json_reverse_iterator& operator--()
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator&>(base_iterator::operator--());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// add to iterator
|
||||||
|
json_reverse_iterator& operator+=(difference_type i)
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// add to iterator
|
||||||
|
json_reverse_iterator operator+(difference_type i) const
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// subtract from iterator
|
||||||
|
json_reverse_iterator operator-(difference_type i) const
|
||||||
|
{
|
||||||
|
return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return difference
|
||||||
|
difference_type operator-(const json_reverse_iterator& other) const
|
||||||
|
{
|
||||||
|
return base_iterator(*this) - base_iterator(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// access to successor
|
||||||
|
reference operator[](difference_type n) const
|
||||||
|
{
|
||||||
|
return *(this->operator+(n));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the key of an object iterator
|
||||||
|
auto key() const -> decltype(std::declval<Base>().key())
|
||||||
|
{
|
||||||
|
auto it = --this->base();
|
||||||
|
return it.key();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return the value of an iterator
|
||||||
|
reference value() const
|
||||||
|
{
|
||||||
|
auto it = --this->base();
|
||||||
|
return it.operator * ();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
109
src/json.hpp
109
src/json.hpp
|
@ -64,6 +64,7 @@ SOFTWARE.
|
||||||
#include "detail/iterators/internal_iterator.hpp"
|
#include "detail/iterators/internal_iterator.hpp"
|
||||||
#include "detail/iterators/iter_impl.hpp"
|
#include "detail/iterators/iter_impl.hpp"
|
||||||
#include "detail/iterators/iteration_proxy.hpp"
|
#include "detail/iterators/iteration_proxy.hpp"
|
||||||
|
#include "detail/iterators/json_reverse_iterator.hpp"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@brief namespace for Niels Lohmann
|
@brief namespace for Niels Lohmann
|
||||||
|
@ -74,114 +75,6 @@ namespace nlohmann
|
||||||
{
|
{
|
||||||
namespace detail
|
namespace detail
|
||||||
{
|
{
|
||||||
///////////////
|
|
||||||
// iterators //
|
|
||||||
///////////////
|
|
||||||
|
|
||||||
/*!
|
|
||||||
@brief a template for a reverse iterator class
|
|
||||||
|
|
||||||
@tparam Base the base iterator type to reverse. Valid types are @ref
|
|
||||||
iterator (to create @ref reverse_iterator) and @ref const_iterator (to
|
|
||||||
create @ref const_reverse_iterator).
|
|
||||||
|
|
||||||
@requirement The class satisfies the following concept requirements:
|
|
||||||
-
|
|
||||||
[BidirectionalIterator](http://en.cppreference.com/w/cpp/concept/BidirectionalIterator):
|
|
||||||
The iterator that can be moved can be moved in both directions (i.e.
|
|
||||||
incremented and decremented).
|
|
||||||
- [OutputIterator](http://en.cppreference.com/w/cpp/concept/OutputIterator):
|
|
||||||
It is possible to write to the pointed-to element (only if @a Base is
|
|
||||||
@ref iterator).
|
|
||||||
|
|
||||||
@since version 1.0.0
|
|
||||||
*/
|
|
||||||
template<typename Base>
|
|
||||||
class json_reverse_iterator : public std::reverse_iterator<Base>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
using difference_type = std::ptrdiff_t;
|
|
||||||
/// shortcut to the reverse iterator adapter
|
|
||||||
using base_iterator = std::reverse_iterator<Base>;
|
|
||||||
/// the reference type for the pointed-to element
|
|
||||||
using reference = typename Base::reference;
|
|
||||||
|
|
||||||
/// create reverse iterator from iterator
|
|
||||||
json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
|
|
||||||
: base_iterator(it) {}
|
|
||||||
|
|
||||||
/// create reverse iterator from base class
|
|
||||||
json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
|
|
||||||
|
|
||||||
/// post-increment (it++)
|
|
||||||
json_reverse_iterator const operator++(int)
|
|
||||||
{
|
|
||||||
return static_cast<json_reverse_iterator>(base_iterator::operator++(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// pre-increment (++it)
|
|
||||||
json_reverse_iterator& operator++()
|
|
||||||
{
|
|
||||||
return static_cast<json_reverse_iterator&>(base_iterator::operator++());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// post-decrement (it--)
|
|
||||||
json_reverse_iterator const operator--(int)
|
|
||||||
{
|
|
||||||
return static_cast<json_reverse_iterator>(base_iterator::operator--(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// pre-decrement (--it)
|
|
||||||
json_reverse_iterator& operator--()
|
|
||||||
{
|
|
||||||
return static_cast<json_reverse_iterator&>(base_iterator::operator--());
|
|
||||||
}
|
|
||||||
|
|
||||||
/// add to iterator
|
|
||||||
json_reverse_iterator& operator+=(difference_type i)
|
|
||||||
{
|
|
||||||
return static_cast<json_reverse_iterator&>(base_iterator::operator+=(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// add to iterator
|
|
||||||
json_reverse_iterator operator+(difference_type i) const
|
|
||||||
{
|
|
||||||
return static_cast<json_reverse_iterator>(base_iterator::operator+(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// subtract from iterator
|
|
||||||
json_reverse_iterator operator-(difference_type i) const
|
|
||||||
{
|
|
||||||
return static_cast<json_reverse_iterator>(base_iterator::operator-(i));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// return difference
|
|
||||||
difference_type operator-(const json_reverse_iterator& other) const
|
|
||||||
{
|
|
||||||
return base_iterator(*this) - base_iterator(other);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// access to successor
|
|
||||||
reference operator[](difference_type n) const
|
|
||||||
{
|
|
||||||
return *(this->operator+(n));
|
|
||||||
}
|
|
||||||
|
|
||||||
/// return the key of an object iterator
|
|
||||||
auto key() const -> decltype(std::declval<Base>().key())
|
|
||||||
{
|
|
||||||
auto it = --this->base();
|
|
||||||
return it.key();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// return the value of an iterator
|
|
||||||
reference value() const
|
|
||||||
{
|
|
||||||
auto it = --this->base();
|
|
||||||
return it.operator * ();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/////////////////////
|
/////////////////////
|
||||||
// output adapters //
|
// output adapters //
|
||||||
/////////////////////
|
/////////////////////
|
||||||
|
|
Loading…
Reference in a new issue