131 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			131 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| //     __ _____ _____ _____
 | |
| //  __|  |   __|     |   | |  JSON for Modern C++
 | |
| // |  |  |__   |  |  | | | |  version 3.11.3
 | |
| // |_____|_____|_____|_|___|  https://github.com/nlohmann/json
 | |
| //
 | |
| // SPDX-FileCopyrightText: 2013-2023 Niels Lohmann <https://nlohmann.me>
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <cstddef> // ptrdiff_t
 | |
| #include <iterator> // reverse_iterator
 | |
| #include <utility> // declval
 | |
| 
 | |
| #include <nlohmann/detail/abi_macros.hpp>
 | |
| 
 | |
| NLOHMANN_JSON_NAMESPACE_BEGIN
 | |
| 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](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator):
 | |
|   The iterator that can be moved can be moved in both directions (i.e.
 | |
|   incremented and decremented).
 | |
| - [OutputIterator](https://en.cppreference.com/w/cpp/named_req/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
 | |
|     explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept
 | |
|         : base_iterator(it) {}
 | |
| 
 | |
|     /// create reverse iterator from base class
 | |
|     explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {}
 | |
| 
 | |
|     /// post-increment (it++)
 | |
|     json_reverse_iterator operator++(int)& // NOLINT(cert-dcl21-cpp)
 | |
|     {
 | |
|         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 operator--(int)& // NOLINT(cert-dcl21-cpp)
 | |
|     {
 | |
|         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 * ();
 | |
|     }
 | |
| };
 | |
| 
 | |
| }  // namespace detail
 | |
| NLOHMANN_JSON_NAMESPACE_END
 |