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 iter_traits>
19class Iterator final {
20public:
21 using iterator_category = std::forward_iterator_tag;
22 using difference_type = std::ptrdiff_t;
23 using value_type = typename iter_traits::value_type;
24 using reference = typename iter_traits::reference;
25 using pointer = typename iter_traits::pointer;
26
27 Iterator(const typename iter_traits::native_iter& iter, int index, const formats::yaml::Path& path);
28 Iterator(const Iterator& other);
29 Iterator(Iterator&& other) noexcept;
30 Iterator& operator=(const Iterator& other);
31 Iterator& operator=(Iterator&& other) noexcept;
32 ~Iterator();
33
34 Iterator operator++(int);
35 Iterator& operator++();
36 reference operator*() const;
37 pointer operator->() const;
38
39 bool operator==(const Iterator& other) const;
40 bool operator!=(const Iterator& other) const;
41
42 /// @brief Returns name of the referenced field
43 /// @throws `TypeMismatchException` if iterated value is not an object
44 std::string GetName() const;
45 /// @brief Returns index of the referenced field
46 /// @throws `TypeMismatchException` if iterated value is not an array
47 uint32_t GetIndex() const;
48
49 /// @brief Returns whether iterator is over array or over object
51
52private:
53 void UpdateValue() const;
54
55 static constexpr std::size_t kNativeIterSize = 48;
56 static constexpr std::size_t kNativeIterAlignment = alignof(void*);
57 utils::FastPimpl<typename iter_traits::native_iter, kNativeIterSize, kNativeIterAlignment> iter_pimpl_;
58 formats::yaml::Path path_;
59 // Temporary object replaced on every value access.
60 mutable int index_;
61 mutable std::optional<value_type> current_;
62};
63
64} // namespace formats::yaml
65
66USERVER_NAMESPACE_END