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/internal_iterator.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/iter_impl.hpp"
 | 
			
		||||
#include "detail/iterators/iteration_proxy.hpp"
 | 
			
		||||
#include "detail/iterators/json_reverse_iterator.hpp"
 | 
			
		||||
 | 
			
		||||
/*!
 | 
			
		||||
@brief namespace for Niels Lohmann
 | 
			
		||||
| 
						 | 
				
			
			@ -74,114 +75,6 @@ namespace nlohmann
 | 
			
		|||
{
 | 
			
		||||
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 //
 | 
			
		||||
/////////////////////
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue