userver: userver/formats/json/impl/mutable_value_wrapper.hpp Source File
Loading...
Searching...
No Matches
mutable_value_wrapper.hpp
1#pragma once
2
3#include <memory>
4#include <string>
5
6#include <userver/formats/json/impl/types.hpp>
7
8#include <userver/compiler/select.hpp>
9#include <userver/utils/fast_pimpl.hpp>
10
11USERVER_NAMESPACE_BEGIN
12
13namespace formats::json {
14class Value;
15} // namespace formats::json
16
17namespace formats::json::impl {
18
19class MutableValueWrapper {
20 public:
21 MutableValueWrapper();
22 explicit MutableValueWrapper(VersionedValuePtr root);
23 ~MutableValueWrapper();
24
25 MutableValueWrapper(const MutableValueWrapper&);
26 MutableValueWrapper(MutableValueWrapper&&) noexcept;
27 MutableValueWrapper& operator=(const MutableValueWrapper&);
28 MutableValueWrapper& operator=(MutableValueWrapper&&) noexcept;
29
30 MutableValueWrapper WrapMember(std::string&& element,
31 const Value& member) const;
32 MutableValueWrapper WrapElement(size_t index) const;
33
34 const formats::json::Value& operator*() const;
35 formats::json::Value& operator*();
36 const formats::json::Value* operator->() const;
37 formats::json::Value* operator->();
38
39 std::string GetPath() const;
40 formats::json::Value ExtractValue() &&;
41
42 void OnMembersChange();
43
44 private:
45 struct JsonPath;
46 struct Impl;
47
48 MutableValueWrapper(std::shared_ptr<JsonPath> path, VersionedValuePtr root,
49 const Value& member, int depth);
50
51 void EnsureCurrent() const;
52
53 static constexpr std::size_t kSize = compiler::SelectSize() //
54 .ForLibCpp32(52)
55 .ForLibCpp64(112)
56 .ForLibStdCpp64(112)
57 .ForLibStdCpp32(64);
58 static constexpr std::size_t kAlignment = alignof(void*);
59 utils::FastPimpl<Impl, kSize, kAlignment> impl_;
60};
61
62} // namespace formats::json::impl
63
64USERVER_NAMESPACE_END