6#include <userver/formats/json/impl/types.hpp> 
    8#include <userver/compiler/select.hpp> 
    9#include <userver/utils/fast_pimpl.hpp> 
   11USERVER_NAMESPACE_BEGIN
 
   13namespace formats::
json {
 
   17namespace formats::
json::impl {
 
   19class MutableValueWrapper {
 
   21  MutableValueWrapper();
 
   22  explicit MutableValueWrapper(VersionedValuePtr root);
 
   23  ~MutableValueWrapper();
 
   25  MutableValueWrapper(
const MutableValueWrapper&);
 
   26  MutableValueWrapper(MutableValueWrapper&&) 
noexcept;
 
   27  MutableValueWrapper& operator=(
const MutableValueWrapper&);
 
   28  MutableValueWrapper& operator=(MutableValueWrapper&&) 
noexcept;
 
   30  MutableValueWrapper WrapMember(std::string&& element,
 
   31                                 const Value& member) 
const;
 
   32  MutableValueWrapper WrapElement(size_t index) 
const;
 
   34  const formats::
json::Value& operator*() 
const;
 
   35  formats::
json::Value& operator*();
 
   36  const formats::
json::Value* operator->() 
const;
 
   37  formats::
json::Value* operator->();
 
   39  std::string GetPath() 
const;
 
   40  formats::
json::Value ExtractValue() &&;
 
   42  void OnMembersChange();
 
   48  MutableValueWrapper(std::shared_ptr<JsonPath> path, VersionedValuePtr root,
 
   49                      const Value& member, 
int depth);
 
   51  void EnsureCurrent() 
const;
 
   53  static constexpr std::size_t kSize = compiler::SelectSize()  
 
   58  static constexpr std::size_t kAlignment = 
alignof(
void*);
 
   59  utils::FastPimpl<Impl, kSize, kAlignment> impl_;