userver: userver/formats/yaml/iterator.hpp Source File
Loading...
Searching...
No Matches
iterator.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/formats/yaml/iterator.hpp
4/// @brief @copybrief formats::yaml::Iterator
5
6#include <cstdint>
7#include <iterator>
8#include <optional>
9
10#include <userver/formats/yaml/types.hpp>
11#include <userver/utils/fast_pimpl.hpp>
12
13USERVER_NAMESPACE_BEGIN
14
15namespace formats::yaml {
16
17/// @brief Iterator for `formats::yaml::Value`
18template <typename IterTraits>
19class Iterator final {
20public:
21 using iterator_category = std::forward_iterator_tag;
22 using difference_type = std::ptrdiff_t;
23 using value_type = typename IterTraits::value_type;
24 using reference = typename IterTraits::reference;
25 using pointer = typename IterTraits::pointer;
26
27 Iterator();
28 Iterator(const typename IterTraits::native_iter& iter, int index, const formats::yaml::Path& path);
29 Iterator(const Iterator& other);
30 Iterator(Iterator&& other) noexcept;
31 Iterator& operator=(const Iterator& other);
32 Iterator& operator=(Iterator&& other) noexcept;
33 ~Iterator();
34
35 Iterator operator++(int);
36 Iterator& operator++();
37 reference operator*() const;
38 pointer operator->() const;
39
40 bool operator==(const Iterator& other) const;
41 bool operator!=(const Iterator& other) const;
42
43 /// @brief Returns name of the referenced field
44 /// @throws `TypeMismatchException` if iterated value is not an object
45 std::string GetName() const;
46 /// @brief Returns index of the referenced field
47 /// @throws `TypeMismatchException` if iterated value is not an array
48 uint32_t GetIndex() const;
49
50 /// @brief Returns whether iterator is over array or over object
52
53private:
54 void UpdateValue() const;
55
56 static constexpr std::size_t kNativeIterSize = 48;
57 static constexpr std::size_t kNativeIterAlignment = alignof(void*);
58 utils::FastPimpl<typename IterTraits::native_iter, kNativeIterSize, kNativeIterAlignment> iter_pimpl_;
59 formats::yaml::Path path_;
60 // Temporary object replaced on every value access.
61 mutable int index_;
62 mutable std::optional<value_type> current_;
63};
64
65} // namespace formats::yaml
66
67USERVER_NAMESPACE_END