12#ifndef GMP_SERIALIZATION_VALUE_ARCHIVE_HPP_
13#define GMP_SERIALIZATION_VALUE_ARCHIVE_HPP_
71 "value archive is already finished");
75 "object key outside object");
77 if (stack_.back().has_key) {
79 "object key requires a value");
81 stack_.back().key = std::string(key);
82 stack_.back().has_key =
true;
93 "value archive is already finished");
95 if (!stack_.empty() || !root_) {
98 auto result = std::move(*root_);
109 bool has_key =
false;
112 serialization_result<void> put(serialization_value
v) {
115 "value archive is already finished");
117 auto status = validate_value_position();
121 if (stack_.empty()) {
122 root_ = std::move(
v);
125 auto &
f = stack_.back();
139 "value archive is already finished");
141 auto status = validate_value_position();
145 stack_.push_back({kind, std::move(
v), {}});
149 serialization_result<void> validate_value_position()
const {
150 if (stack_.empty()) {
165 "value archive is already finished");
167 if (stack_.empty()) {
169 "archive end without begin");
171 if (stack_.back().kind !=
expected) {
176 "object ended with missing value");
178 auto v = std::move(stack_.back().value);
180 return put(std::move(
v));
183 std::optional<serialization_value> root_;
184 std::vector<frame> stack_;
185 bool finished_ =
false;
198 if (value_->
is<
bool>()) {
201 if (value_->
is<std::int64_t>()) {
204 if (value_->
is<std::uint64_t>()) {
207 if (value_->
is<
double>()) {
210 if (value_->
is<std::string>()) {
230 return value_->
get<
bool>();
234 return value_->
get<std::int64_t>();
238 return value_->
get<std::uint64_t>();
242 return value_->
get<
double>();
246 return value_->
get<std::string>();
253 member_view
member(std::size_t
i)
const;
std::vector< std::pair< std::string, serialization_value > > object
std::vector< serialization_value > array
std::uint64_t read_unsigned() const
std::int64_t read_signed() const
member_view member(std::size_t i) const
value_reader(const serialization_value &value)
std::string_view read_string() const
const serialization_value & value() const noexcept
value_reader element(std::size_t i) const
serialization_kind kind() const noexcept
double read_floating() const
std::size_t size() const noexcept
serialization_result< void > end_object()
serialization_result< void > write_null()
serialization_result< void > begin_object(std::size_t size)
serialization_result< void > write_unsigned(std::uint64_t v)
serialization_result< void > write_bool(bool v)
serialization_result< serialization_value > finish()
serialization_result< void > end_array()
serialization_result< void > write_string(std::string_view v)
serialization_result< void > write_signed(std::int64_t v)
serialization_result< void > write_key(std::string_view key)
serialization_result< void > begin_array(std::size_t size)
serialization_result< void > write_floating(double v)
serialization_error make_serialization_error(serialization_errc code, std::string message, std::string path={}, std::size_t offset=serialization_error::unknown_offset)