10#include <userver/formats/common/iterator_direction.hpp> 
   12USERVER_NAMESPACE_BEGIN
 
   14namespace formats::
json {
 
   21  using iterator_category = std::forward_iterator_tag;
 
   22  using difference_type = std::ptrdiff_t;
 
   23  using value_type = 
typename Traits::ValueType;
 
   24  using reference = 
typename Traits::Reference;
 
   25  using pointer = 
typename Traits::Pointer;
 
   27  using ContainerType = 
typename Traits::ContainerType;
 
   29  Iterator(ContainerType container, 
int pos);
 
   31  Iterator(
const Iterator& other);
 
   32  Iterator(Iterator&& other) 
noexcept;
 
   33  Iterator& operator=(
const Iterator& other);
 
   34  Iterator& operator=(Iterator&& other) 
noexcept;
 
   38  Iterator operator++(
int);
 
   39  Iterator& operator++();
 
   40  reference operator*() 
const;
 
   41  pointer operator->() 
const;
 
   43  bool operator==(
const Iterator& other) 
const;
 
   44  bool operator!=(
const Iterator& other) 
const;
 
   48  template <
typename T = 
void>
 
   51                  "Reverse iterator should be used only on arrays or null, " 
   52                  "they do not have GetName()");
 
   61  std::string GetNameImpl() 
const;
 
   62  Iterator(ContainerType&& container, 
int type, 
int pos) 
noexcept;
 
   64  void UpdateValue() 
const;
 
   67  ContainerType container_;
 
   73  mutable std::optional<value_type> current_;