Blender V4.3
BLI_serialize.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#pragma once
6
62#include <iosfwd>
63
64#include "BLI_map.hh"
65#include "BLI_string_ref.hh"
66#include "BLI_vector.hh"
67
68namespace blender::io::serialize {
69
75enum class eValueType {
76 String,
77 Int,
78 Array,
79 Null,
80 Boolean,
81 Double,
83 Enum,
84};
85
86class Value;
87class StringValue;
88class DictionaryValue;
89template<typename T, eValueType V> class PrimitiveValue;
94class ArrayValue;
95
112class Value {
113 private:
114 eValueType type_;
115
116 protected:
117 Value() = delete;
118 explicit Value(eValueType type) : type_(type) {}
119
120 public:
121 virtual ~Value() = default;
123 {
124 return type_;
125 }
126
131 const StringValue *as_string_value() const;
132
137 const IntValue *as_int_value() const;
138
143 const DoubleValue *as_double_value() const;
144
149 const BooleanValue *as_boolean_value() const;
150
155 const EnumValue *as_enum_value() const;
156
161 const ArrayValue *as_array_value() const;
162
168};
169
173template<
175 typename T,
178class PrimitiveValue : public Value {
179 private:
180 T inner_value_{};
181
182 public:
183 explicit PrimitiveValue(const T value) : Value(V), inner_value_(value) {}
184
185 const T value() const
186 {
187 return inner_value_;
188 }
189};
190
191class NullValue : public Value {
192 public:
194};
195
196class StringValue : public Value {
197 private:
198 std::string string_;
199
200 public:
201 StringValue(std::string string) : Value(eValueType::String), string_(std::move(string)) {}
202
203 const std::string &value() const
204 {
205 return string_;
206 }
207};
208
209class ArrayValue : public Value {
211
212 public:
214
215 void append(std::shared_ptr<Value> value);
216 void append_bool(bool value);
217 void append_int(int value);
218 void append_double(double value);
219 void append_str(std::string value);
220 void append_null();
221 std::shared_ptr<DictionaryValue> append_dict();
222 std::shared_ptr<ArrayValue> append_array();
223
225 {
226 return values_;
227 }
228};
229
234class DictionaryValue : public Value {
235 public:
240 using Item = std::pair<std::string, std::shared_ptr<Value>>;
242
243 private:
244 Vector<Item> values_;
245
246 public:
248
254 Lookup create_lookup() const;
255
256 const std::shared_ptr<Value> *lookup(const StringRef key) const;
257 std::optional<StringRefNull> lookup_str(const StringRef key) const;
258 std::optional<int64_t> lookup_int(const StringRef key) const;
259 std::optional<double> lookup_double(const StringRef key) const;
260 const DictionaryValue *lookup_dict(const StringRef key) const;
261 const ArrayValue *lookup_array(const StringRef key) const;
263 {
264 return values_;
265 }
266
267 void append(std::string key, std::shared_ptr<Value> value);
268 void append_int(std::string key, int64_t value);
269 void append_double(std::string key, double value);
270 void append_str(std::string key, std::string value);
271 std::shared_ptr<DictionaryValue> append_dict(std::string key);
272 std::shared_ptr<ArrayValue> append_array(std::string key);
273};
274
279 public:
280 virtual ~Formatter() = default;
281
283 virtual void serialize(std::ostream &os, const Value &value) = 0;
284
286 virtual std::unique_ptr<Value> deserialize(std::istream &is) = 0;
287};
288
292class JsonFormatter : public Formatter {
293 public:
299
300 public:
301 void serialize(std::ostream &os, const Value &value) override;
306 std::unique_ptr<Value> deserialize(std::istream &is) override;
307};
308
309void write_json_file(StringRef path, const Value &value);
310std::shared_ptr<Value> read_json_file(StringRef path);
311
312} // namespace blender::io::serialize
Span< std::shared_ptr< Value > > elements() const
std::shared_ptr< ArrayValue > append_array()
Definition serialize.cc:245
void append_str(std::string value)
Definition serialize.cc:228
std::shared_ptr< DictionaryValue > append_dict()
Definition serialize.cc:238
const std::shared_ptr< Value > * lookup(const StringRef key) const
Definition serialize.cc:261
void append_str(std::string key, std::string value)
Definition serialize.cc:332
std::shared_ptr< DictionaryValue > append_dict(std::string key)
Definition serialize.cc:337
std::pair< std::string, std::shared_ptr< Value > > Item
const DictionaryValue * lookup_dict(const StringRef key) const
Definition serialize.cc:301
void append_double(std::string key, double value)
Definition serialize.cc:327
void append_int(std::string key, int64_t value)
Definition serialize.cc:322
const ArrayValue * lookup_array(const StringRef key) const
Definition serialize.cc:309
Map< std::string, std::shared_ptr< Value > > Lookup
std::optional< int64_t > lookup_int(const StringRef key) const
Definition serialize.cc:281
std::shared_ptr< ArrayValue > append_array(std::string key)
Definition serialize.cc:344
std::optional< StringRefNull > lookup_str(const StringRef key) const
Definition serialize.cc:271
std::optional< double > lookup_double(const StringRef key) const
Definition serialize.cc:291
virtual void serialize(std::ostream &os, const Value &value)=0
virtual std::unique_ptr< Value > deserialize(std::istream &is)=0
std::unique_ptr< Value > deserialize(std::istream &is) override
Definition serialize.cc:363
void serialize(std::ostream &os, const Value &value) override
Definition serialize.cc:351
const std::string & value() const
const EnumValue * as_enum_value() const
Definition serialize.cc:44
const BooleanValue * as_boolean_value() const
Definition serialize.cc:36
const ArrayValue * as_array_value() const
Definition serialize.cc:52
const StringValue * as_string_value() const
Definition serialize.cc:12
const IntValue * as_int_value() const
Definition serialize.cc:20
const DoubleValue * as_double_value() const
Definition serialize.cc:28
const DictionaryValue * as_dictionary_value() const
Definition serialize.cc:60
append
#define T
void write_json_file(StringRef path, const Value &value)
Definition serialize.cc:375
std::shared_ptr< Value > read_json_file(StringRef path)
Definition serialize.cc:382
__int64 int64_t
Definition stdint.h:89
signed char int8_t
Definition stdint.h:75
CCL_NAMESPACE_BEGIN struct Window V