| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | //     __ _____ _____ _____//  __|  |   __|     |   | |  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_BEGINnamespace detail{//////////////////////// reverse_iterator /////////////////////////*!@brief a template for a reverse iterator class@tparam Base the base iterator type to reverse. Valid types are @refiterator (to create @ref reverse_iterator) and @ref const_iterator (tocreate @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 detailNLOHMANN_JSON_NAMESPACE_END
 |