xgboost
json.h
Go to the documentation of this file.
1 
4 #ifndef XGBOOST_JSON_H_
5 #define XGBOOST_JSON_H_
6 
8 #include <xgboost/logging.h>
9 #include <xgboost/parameter.h>
10 #include <xgboost/string_view.h>
11 
12 #include <functional>
13 #include <map>
14 #include <string>
15 #include <type_traits> // std::enable_if_t
16 #include <utility>
17 #include <vector>
18 
19 namespace xgboost {
20 
21 class Json;
22 class JsonReader;
23 class JsonWriter;
24 
25 class Value {
26  private:
27  mutable class IntrusivePtrCell ref_;
28  friend IntrusivePtrCell &
29  IntrusivePtrRefCount(xgboost::Value const *t) noexcept {
30  return t->ref_;
31  }
32 
33  public:
35  enum class ValueKind {
36  kString,
37  kNumber,
38  kInteger,
39  kObject, // std::map
40  kArray, // std::vector
41  kBoolean,
42  kNull,
43  // typed array for ubjson
44  kF32Array,
45  kF64Array,
46  kI8Array,
47  kU8Array,
48  kI16Array,
49  kI32Array,
50  kI64Array
51  };
52 
53  explicit Value(ValueKind _kind) : kind_{_kind} {}
54 
55  ValueKind Type() const { return kind_; }
56  virtual ~Value() = default;
57 
58  virtual void Save(JsonWriter* writer) const = 0;
59 
60  virtual Json& operator[](std::string const& key);
61  virtual Json& operator[](int ind);
62 
63  virtual bool operator==(Value const& rhs) const = 0;
64  virtual Value& operator=(Value const& rhs) = delete;
65 
66  std::string TypeStr() const;
67 
68  private:
69  ValueKind kind_;
70 };
71 
72 template <typename T>
73 bool IsA(Value const* value) {
74  return T::IsClassOf(value);
75 }
76 
77 template <typename T, typename U>
78 T* Cast(U* value) {
79  if (IsA<T>(value)) {
80  return dynamic_cast<T*>(value);
81  } else {
82  LOG(FATAL) << "Invalid cast, from " + value->TypeStr() + " to " + T().TypeStr();
83  }
84  return dynamic_cast<T*>(value); // suppress compiler warning.
85 }
86 
87 class JsonString : public Value {
88  std::string str_;
89 
90  public:
91  JsonString() : Value(ValueKind::kString) {}
92  JsonString(std::string const& str) : // NOLINT
93  Value(ValueKind::kString), str_{str} {}
94  JsonString(std::string&& str) noexcept : // NOLINT
95  Value(ValueKind::kString), str_{std::forward<std::string>(str)} {}
96  JsonString(JsonString&& str) noexcept : Value(ValueKind::kString) { // NOLINT
97  std::swap(str.str_, this->str_);
98  }
99 
100  void Save(JsonWriter* writer) const override;
101 
102  std::string const& GetString() && { return str_; }
103  std::string const& GetString() const & { return str_; }
104  std::string& GetString() & { return str_; }
105 
106  bool operator==(Value const& rhs) const override;
107  Value& operator=(Value const& rhs) override = delete;
108 
109  static bool IsClassOf(Value const* value) {
110  return value->Type() == ValueKind::kString;
111  }
112 };
113 
114 class JsonArray : public Value {
115  std::vector<Json> vec_;
116 
117  public:
118  JsonArray() : Value(ValueKind::kArray) {}
119  JsonArray(std::vector<Json>&& arr) noexcept // NOLINT
120  : Value(ValueKind::kArray), vec_{std::forward<std::vector<Json>>(arr)} {}
121  JsonArray(std::vector<Json> const& arr) : // NOLINT
122  Value(ValueKind::kArray), vec_{arr} {}
123  JsonArray(JsonArray const& that) = delete;
124  JsonArray(JsonArray && that) noexcept;
125 
126  void Save(JsonWriter* writer) const override;
127 
128  Json& operator[](int ind) override { return vec_.at(ind); }
129  // silent the partial oveeridden warning
130  Json& operator[](std::string const& key) override { return Value::operator[](key); }
131 
132  std::vector<Json> const& GetArray() && { return vec_; }
133  std::vector<Json> const& GetArray() const & { return vec_; }
134  std::vector<Json>& GetArray() & { return vec_; }
135 
136  bool operator==(Value const& rhs) const override;
137  Value& operator=(Value const& rhs) override = delete;
138 
139  static bool IsClassOf(Value const* value) {
140  return value->Type() == ValueKind::kArray;
141  }
142 };
143 
150 template <typename T, Value::ValueKind kind>
151 class JsonTypedArray : public Value {
152  std::vector<T> vec_;
153 
154  public:
155  using Type = T;
156 
157  JsonTypedArray() : Value(kind) {}
158  explicit JsonTypedArray(std::size_t n) : Value(kind) { vec_.resize(n); }
159  JsonTypedArray(JsonTypedArray&& that) noexcept : Value{kind}, vec_{std::move(that.vec_)} {}
160 
161  bool operator==(Value const& rhs) const override;
162  Value& operator=(Value const& rhs) override = delete;
163 
164  void Set(size_t i, T v) { vec_[i] = v; }
165  size_t Size() const { return vec_.size(); }
166 
167  void Save(JsonWriter* writer) const override;
168 
169  std::vector<T> const& GetArray() && { return vec_; }
170  std::vector<T> const& GetArray() const& { return vec_; }
171  std::vector<T>& GetArray() & { return vec_; }
172 
173  static bool IsClassOf(Value const* value) { return value->Type() == kind; }
174 };
175 
204 
205 class JsonObject : public Value {
206  public:
207  using Map = std::map<std::string, Json, std::less<>>;
208 
209  private:
210  Map object_;
211 
212  public:
213  JsonObject() : Value(ValueKind::kObject) {}
214  JsonObject(Map&& object) noexcept; // NOLINT
215  JsonObject(JsonObject const& that) = delete;
216  JsonObject(JsonObject&& that) noexcept;
217 
218  void Save(JsonWriter* writer) const override;
219 
220  // silent the partial oveeridden warning
221  Json& operator[](int ind) override { return Value::operator[](ind); }
222  Json& operator[](std::string const& key) override { return object_[key]; }
223 
224  Map const& GetObject() && { return object_; }
225  Map const& GetObject() const& { return object_; }
226  Map& GetObject() & { return object_; }
227 
228  bool operator==(Value const& rhs) const override;
229  Value& operator=(Value const& rhs) override = delete;
230 
231  static bool IsClassOf(Value const* value) { return value->Type() == ValueKind::kObject; }
232  ~JsonObject() override = default;
233 };
234 
235 namespace detail {
236 template <typename T, typename U>
237 using IsSameT = std::enable_if_t<std::is_same_v<std::remove_cv_t<T>, std::remove_cv_t<U>>>;
238 
239 template <typename T>
240 using IsF64T = std::enable_if_t<std::is_same_v<T, double>>;
241 } // namespace detail
242 
243 class JsonNumber : public Value {
244  public:
245  using Float = float;
246 
247  private:
248  Float number_ { 0 };
249 
250  public:
251  JsonNumber() : Value(ValueKind::kNumber) {}
252  template <typename FloatT, typename detail::IsSameT<FloatT, Float>* = nullptr>
253  JsonNumber(FloatT value) : Value(ValueKind::kNumber), number_{value} {} // NOLINT
254  template <typename FloatT, typename detail::IsF64T<FloatT>* = nullptr>
255  JsonNumber(FloatT value) // NOLINT
256  : Value{ValueKind::kNumber}, number_{static_cast<Float>(value)} {}
257  JsonNumber(JsonNumber const& that) = delete;
258  JsonNumber(JsonNumber&& that) noexcept : Value{ValueKind::kNumber}, number_{that.number_} {}
259 
260  void Save(JsonWriter* writer) const override;
261 
262  Float const& GetNumber() && { return number_; }
263  Float const& GetNumber() const & { return number_; }
264  Float& GetNumber() & { return number_; }
265 
266  bool operator==(Value const& rhs) const override;
267  Value& operator=(Value const& rhs) override = delete;
268 
269  static bool IsClassOf(Value const* value) {
270  return value->Type() == ValueKind::kNumber;
271  }
272 };
273 
274 namespace detail {
275 template <typename IntT>
276 using Not32SizeT = std::enable_if_t<std::is_same_v<IntT, std::uint32_t> &&
277  !std::is_same_v<std::size_t, std::uint32_t>>;
278 }
279 
280 
281 class JsonInteger : public Value {
282  public:
283  using Int = int64_t;
284 
285  private:
286  Int integer_ {0};
287 
288  public:
289  JsonInteger() : Value(ValueKind::kInteger) {} // NOLINT
290  template <typename IntT, typename detail::IsSameT<IntT, Int>* = nullptr>
291  JsonInteger(IntT value) : Value(ValueKind::kInteger), integer_{value} {} // NOLINT
292  template <typename IntT, typename detail::IsSameT<IntT, std::size_t>* = nullptr>
293  JsonInteger(IntT value) // NOLINT
294  : Value(ValueKind::kInteger), integer_{static_cast<Int>(value)} {}
295  template <typename IntT, typename detail::IsSameT<IntT, std::int32_t>* = nullptr>
296  JsonInteger(IntT value) // NOLINT
297  : Value(ValueKind::kInteger), integer_{static_cast<Int>(value)} {}
298  template <typename IntT,
299  typename detail::Not32SizeT<IntT>* = nullptr>
300  JsonInteger(IntT value) // NOLINT
301  : Value(ValueKind::kInteger), integer_{static_cast<Int>(value)} {}
302 
303  JsonInteger(JsonInteger &&that) noexcept
304  : Value{ValueKind::kInteger}, integer_{that.integer_} {}
305 
306  bool operator==(Value const& rhs) const override;
307  Value& operator=(Value const& rhs) override = delete;
308 
309  Int const& GetInteger() && { return integer_; }
310  Int const& GetInteger() const & { return integer_; }
311  Int& GetInteger() & { return integer_; }
312  void Save(JsonWriter* writer) const override;
313 
314  static bool IsClassOf(Value const* value) {
315  return value->Type() == ValueKind::kInteger;
316  }
317 };
318 
319 class JsonNull : public Value {
320  public:
321  JsonNull() : Value(ValueKind::kNull) {}
322  JsonNull(std::nullptr_t) : Value(ValueKind::kNull) {} // NOLINT
323  JsonNull(JsonNull&&) noexcept : Value(ValueKind::kNull) {}
324 
325  void Save(JsonWriter* writer) const override;
326 
327  bool operator==(Value const& rhs) const override;
328  Value& operator=(Value const& rhs) override = delete;
329 
330  static bool IsClassOf(Value const* value) {
331  return value->Type() == ValueKind::kNull;
332  }
333 };
334 
336 class JsonBoolean : public Value {
337  bool boolean_ = false;
338 
339  public:
340  JsonBoolean() : Value(ValueKind::kBoolean) {} // NOLINT
341  // Ambigious with JsonNumber.
342  template <typename Bool, typename detail::IsSameT<std::remove_cv_t<Bool>, bool>* = nullptr>
343  JsonBoolean(Bool value) : Value(ValueKind::kBoolean), boolean_{value} {} // NOLINT
344  JsonBoolean(JsonBoolean&& value) noexcept: // NOLINT
345  Value(ValueKind::kBoolean), boolean_{value.boolean_} {}
346 
347  void Save(JsonWriter* writer) const override;
348 
349  bool const& GetBoolean() && { return boolean_; }
350  bool const& GetBoolean() const & { return boolean_; }
351  bool& GetBoolean() & { return boolean_; }
352 
353  bool operator==(Value const& rhs) const override;
354  Value& operator=(Value const& rhs) override = delete;
355 
356  static bool IsClassOf(Value const* value) {
357  return value->Type() == ValueKind::kBoolean;
358  }
359 };
360 
378 class Json {
379  public:
384  static Json Load(StringView str, std::ios::openmode mode = std::ios::in);
386  static Json Load(JsonReader* reader);
391  static void Dump(Json json, std::string* out, std::ios::openmode mode = std::ios::out);
392  static void Dump(Json json, std::vector<char>* out, std::ios::openmode mode = std::ios::out);
394  static void Dump(Json json, JsonWriter* writer);
395 
396  template <typename Container = std::string>
397  static Container Dump(Json json) {
398  if constexpr (std::is_same_v<Container, std::string>) {
399  std::string str;
400  Dump(json, &str);
401  return str;
402  } else {
403  std::vector<char> str;
404  Dump(json, &str);
405  return str;
406  }
407  }
408 
409  Json() = default;
410 
411  // number
412  explicit Json(JsonNumber number) : ptr_{new JsonNumber(std::move(number))} {}
414  ptr_.reset(new JsonNumber(std::move(number)));
415  return *this;
416  }
417  // integer
418  explicit Json(JsonInteger integer) : ptr_{new JsonInteger(std::move(integer))} {}
420  ptr_.reset(new JsonInteger(std::move(integer)));
421  return *this;
422  }
423  // array
424  explicit Json(JsonArray&& list) : ptr_{new JsonArray(std::forward<JsonArray>(list))} {}
426  ptr_.reset(new JsonArray(std::forward<JsonArray>(array)));
427  return *this;
428  }
429  // typed array
430  template <typename T, Value::ValueKind kind>
431  explicit Json(JsonTypedArray<T, kind>&& list)
432  : ptr_{new JsonTypedArray<T, kind>(std::forward<JsonTypedArray<T, kind>>(list))} {}
433  template <typename T, Value::ValueKind kind>
435  ptr_.reset(new JsonTypedArray<T, kind>(std::forward<JsonTypedArray<T, kind>>(array)));
436  return *this;
437  }
438  // object
439  explicit Json(JsonObject&& object) : ptr_{new JsonObject(std::forward<JsonObject>(object))} {}
440  Json& operator=(JsonObject&& object) {
441  ptr_.reset(new JsonObject(std::forward<JsonObject>(object)));
442  return *this;
443  }
444  // string
445  explicit Json(JsonString&& str) : ptr_{new JsonString(std::forward<JsonString>(str))} {}
447  ptr_.reset(new JsonString(std::forward<JsonString>(str)));
448  return *this;
449  }
450  // bool
451  explicit Json(JsonBoolean boolean) :
452  ptr_{new JsonBoolean(std::move(boolean))} {}
454  ptr_.reset(new JsonBoolean(std::move(boolean)));
455  return *this;
456  }
457  // null
458  explicit Json(JsonNull null) :
459  ptr_{new JsonNull(std::move(null))} {}
461  ptr_.reset(new JsonNull(std::move(null)));
462  return *this;
463  }
464 
465  // copy
466  Json(Json const& other) = default;
467  Json& operator=(Json const& other) = default;
468  // move
469  Json(Json &&other) noexcept { std::swap(this->ptr_, other.ptr_); }
470  Json &operator=(Json &&other) noexcept {
471  std::swap(this->ptr_, other.ptr_);
472  return *this;
473  }
474 
476  Json& operator[](std::string const & key) const { return (*ptr_)[key]; }
478  Json& operator[](int ind) const { return (*ptr_)[ind]; }
479 
481  [[nodiscard]] Value const& GetValue() const& { return *ptr_; }
482  Value const& GetValue() && { return *ptr_; }
483  Value& GetValue() & { return *ptr_; }
484 
485  bool operator==(Json const& rhs) const {
486  return *ptr_ == *(rhs.ptr_);
487  }
488 
489  friend std::ostream& operator<<(std::ostream& os, Json const& j) {
490  std::string str;
491  Json::Dump(j, &str);
492  os << str;
493  return os;
494  }
495 
496  [[nodiscard]] IntrusivePtr<Value> const& Ptr() const { return ptr_; }
497 
498  private:
499  IntrusivePtr<Value> ptr_{new JsonNull};
500 };
501 
511 template <typename T>
512 bool IsA(Json const& j) {
513  auto const& v = j.GetValue();
514  return IsA<T>(&v);
515 }
516 
517 namespace detail {
518 // Number
519 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonNumber>>* = nullptr>
520 JsonNumber::Float& GetImpl(T& val) { // NOLINT
521  return val.GetNumber();
522 }
523 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonNumber const>>* = nullptr>
524 JsonNumber::Float const& GetImpl(T& val) { // NOLINT
525  return val.GetNumber();
526 }
527 
528 // Integer
529 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonInteger>>* = nullptr>
530 JsonInteger::Int& GetImpl(T& val) { // NOLINT
531  return val.GetInteger();
532 }
533 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonInteger const>>* = nullptr>
534 JsonInteger::Int const& GetImpl(T& val) { // NOLINT
535  return val.GetInteger();
536 }
537 
538 // String
539 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonString>>* = nullptr>
540 std::string& GetImpl(T& val) { // NOLINT
541  return val.GetString();
542 }
543 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonString const>>* = nullptr>
544 std::string const& GetImpl(T& val) { // NOLINT
545  return val.GetString();
546 }
547 
548 // Boolean
549 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonBoolean>>* = nullptr>
550 bool& GetImpl(T& val) { // NOLINT
551  return val.GetBoolean();
552 }
553 template <typename T,
554  typename std::enable_if_t<std::is_same_v<T, JsonBoolean const>>* = nullptr>
555 bool const& GetImpl(T& val) { // NOLINT
556  return val.GetBoolean();
557 }
558 
559 // Array
560 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonArray>>* = nullptr>
561 std::vector<Json>& GetImpl(T& val) { // NOLINT
562  return val.GetArray();
563 }
564 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonArray const>>* = nullptr>
565 std::vector<Json> const& GetImpl(T& val) { // NOLINT
566  return val.GetArray();
567 }
568 
569 // Typed Array
570 template <typename T, Value::ValueKind kind>
571 std::vector<T>& GetImpl(JsonTypedArray<T, kind>& val) { // NOLINT
572  return val.GetArray();
573 }
574 template <typename T, Value::ValueKind kind>
575 std::vector<T> const& GetImpl(JsonTypedArray<T, kind> const& val) {
576  return val.GetArray();
577 }
578 
579 // Object
580 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonObject>>* = nullptr>
581 JsonObject::Map& GetImpl(T& val) { // NOLINT
582  return val.GetObject();
583 }
584 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonObject const>>* = nullptr>
585 JsonObject::Map const& GetImpl(T& val) { // NOLINT
586  return val.GetObject();
587 }
588 } // namespace detail
589 
598 template <typename T, typename U>
599 auto get(U& json) -> decltype(detail::GetImpl(*Cast<T>(&json.GetValue())))& { // NOLINT
600  auto& value = *Cast<T>(&json.GetValue());
601  return detail::GetImpl(value);
602 }
603 
605 using Array = JsonArray;
610 using Null = JsonNull;
611 
621 template <typename Parameter>
622 Object ToJson(Parameter const& param) {
623  Object obj;
624  for (auto const& kv : param.__DICT__()) {
625  obj[kv.first] = kv.second;
626  }
627  return obj;
628 }
629 
640 template <typename Parameter>
641 Args FromJson(Json const& obj, Parameter* param) {
642  auto const& j_param = get<Object const>(obj);
643  Args args;
644  for (auto const& kv : j_param) {
645  args.emplace_back(kv.first, get<String const>(kv.second));
646  }
647  return param->UpdateAllowUnknown(args);
648 }
649 } // namespace xgboost
650 #endif // XGBOOST_JSON_H_
Helper class for embedding reference counting into client objects. See https://www....
Definition: intrusive_ptr.h:20
Implementation of Intrusive Pointer. A smart pointer that points to an object with an embedded refere...
Definition: intrusive_ptr.h:73
Definition: json.h:114
JsonArray(std::vector< Json > const &arr)
Definition: json.h:121
JsonArray(JsonArray const &that)=delete
Json & operator[](std::string const &key) override
Definition: json.h:130
std::vector< Json > const & GetArray() &&
Definition: json.h:132
std::vector< Json > & GetArray() &
Definition: json.h:134
JsonArray(std::vector< Json > &&arr) noexcept
Definition: json.h:119
JsonArray(JsonArray &&that) noexcept
bool operator==(Value const &rhs) const override
void Save(JsonWriter *writer) const override
JsonArray()
Definition: json.h:118
Json & operator[](int ind) override
Definition: json.h:128
Value & operator=(Value const &rhs) override=delete
static bool IsClassOf(Value const *value)
Definition: json.h:139
std::vector< Json > const & GetArray() const &
Definition: json.h:133
Describes both true and false.
Definition: json.h:336
bool const & GetBoolean() const &
Definition: json.h:350
static bool IsClassOf(Value const *value)
Definition: json.h:356
Value & operator=(Value const &rhs) override=delete
bool const & GetBoolean() &&
Definition: json.h:349
bool operator==(Value const &rhs) const override
void Save(JsonWriter *writer) const override
JsonBoolean()
Definition: json.h:340
JsonBoolean(Bool value)
Definition: json.h:343
JsonBoolean(JsonBoolean &&value) noexcept
Definition: json.h:344
bool & GetBoolean() &
Definition: json.h:351
Definition: json.h:281
void Save(JsonWriter *writer) const override
JsonInteger(IntT value)
Definition: json.h:291
int64_t Int
Definition: json.h:283
JsonInteger(JsonInteger &&that) noexcept
Definition: json.h:303
Value & operator=(Value const &rhs) override=delete
Int const & GetInteger() const &
Definition: json.h:310
bool operator==(Value const &rhs) const override
static bool IsClassOf(Value const *value)
Definition: json.h:314
JsonInteger()
Definition: json.h:289
Int & GetInteger() &
Definition: json.h:311
Int const & GetInteger() &&
Definition: json.h:309
Definition: json.h:319
JsonNull(std::nullptr_t)
Definition: json.h:322
JsonNull()
Definition: json.h:321
bool operator==(Value const &rhs) const override
JsonNull(JsonNull &&) noexcept
Definition: json.h:323
Value & operator=(Value const &rhs) override=delete
void Save(JsonWriter *writer) const override
static bool IsClassOf(Value const *value)
Definition: json.h:330
Definition: json.h:243
Float const & GetNumber() const &
Definition: json.h:263
Float const & GetNumber() &&
Definition: json.h:262
Value & operator=(Value const &rhs) override=delete
JsonNumber(JsonNumber const &that)=delete
Float & GetNumber() &
Definition: json.h:264
JsonNumber(JsonNumber &&that) noexcept
Definition: json.h:258
bool operator==(Value const &rhs) const override
float Float
Definition: json.h:245
JsonNumber()
Definition: json.h:251
static bool IsClassOf(Value const *value)
Definition: json.h:269
JsonNumber(FloatT value)
Definition: json.h:253
void Save(JsonWriter *writer) const override
Definition: json.h:205
Json & operator[](int ind) override
Definition: json.h:221
Map const & GetObject() &&
Definition: json.h:224
JsonObject(JsonObject &&that) noexcept
void Save(JsonWriter *writer) const override
Map const & GetObject() const &
Definition: json.h:225
Json & operator[](std::string const &key) override
Definition: json.h:222
bool operator==(Value const &rhs) const override
~JsonObject() override=default
std::map< std::string, Json, std::less<> > Map
Definition: json.h:207
Value & operator=(Value const &rhs) override=delete
Map & GetObject() &
Definition: json.h:226
JsonObject(JsonObject const &that)=delete
static bool IsClassOf(Value const *value)
Definition: json.h:231
JsonObject()
Definition: json.h:213
JsonObject(Map &&object) noexcept
A json reader, currently error checking and utf-8 is not fully supported.
Definition: json_io.h:20
Definition: json.h:87
static bool IsClassOf(Value const *value)
Definition: json.h:109
JsonString(std::string &&str) noexcept
Definition: json.h:94
void Save(JsonWriter *writer) const override
std::string const & GetString() &&
Definition: json.h:102
std::string & GetString() &
Definition: json.h:104
bool operator==(Value const &rhs) const override
Value & operator=(Value const &rhs) override=delete
JsonString(std::string const &str)
Definition: json.h:92
JsonString(JsonString &&str) noexcept
Definition: json.h:96
std::string const & GetString() const &
Definition: json.h:103
JsonString()
Definition: json.h:91
Typed array for Universal Binary JSON.
Definition: json.h:151
void Set(size_t i, T v)
Definition: json.h:164
std::vector< T > & GetArray() &
Definition: json.h:171
std::vector< T > const & GetArray() &&
Definition: json.h:169
size_t Size() const
Definition: json.h:165
T Type
Definition: json.h:155
void Save(JsonWriter *writer) const override
bool operator==(Value const &rhs) const override
JsonTypedArray(std::size_t n)
Definition: json.h:158
Value & operator=(Value const &rhs) override=delete
static bool IsClassOf(Value const *value)
Definition: json.h:173
JsonTypedArray(JsonTypedArray &&that) noexcept
Definition: json.h:159
JsonTypedArray()
Definition: json.h:157
std::vector< T > const & GetArray() const &
Definition: json.h:170
Definition: json_io.h:110
Data structure representing JSON format.
Definition: json.h:378
Json & operator=(JsonNumber number)
Definition: json.h:413
Json(JsonNull null)
Definition: json.h:458
Json & operator=(JsonTypedArray< T, kind > &&array)
Definition: json.h:434
Json & operator=(JsonString &&str)
Definition: json.h:446
Json & operator[](std::string const &key) const
Index Json object with a std::string, used for Json Object.
Definition: json.h:476
Json(JsonArray &&list)
Definition: json.h:424
Json(JsonObject &&object)
Definition: json.h:439
static void Dump(Json json, std::vector< char > *out, std::ios::openmode mode=std::ios::out)
Json(Json &&other) noexcept
Definition: json.h:469
Json(Json const &other)=default
Value const & GetValue() const &
Return the reference to stored Json value.
Definition: json.h:481
Json & operator=(Json const &other)=default
Json(JsonString &&str)
Definition: json.h:445
Json(JsonInteger integer)
Definition: json.h:418
Json & operator[](int ind) const
Index Json object with int, used for Json Array.
Definition: json.h:478
Json & operator=(JsonObject &&object)
Definition: json.h:440
Json & operator=(JsonArray &&array)
Definition: json.h:425
friend std::ostream & operator<<(std::ostream &os, Json const &j)
Definition: json.h:489
Json & operator=(JsonInteger integer)
Definition: json.h:419
Json & operator=(JsonBoolean boolean)
Definition: json.h:453
static Json Load(JsonReader *reader)
Pass your own JsonReader.
Json()=default
Json(JsonBoolean boolean)
Definition: json.h:451
IntrusivePtr< Value > const & Ptr() const
Definition: json.h:496
Json(JsonTypedArray< T, kind > &&list)
Definition: json.h:431
Json(JsonNumber number)
Definition: json.h:412
Json & operator=(JsonNull null)
Definition: json.h:460
static Container Dump(Json json)
Definition: json.h:397
bool operator==(Json const &rhs) const
Definition: json.h:485
static void Dump(Json json, JsonWriter *writer)
Use your own JsonWriter.
Json & operator=(Json &&other) noexcept
Definition: json.h:470
static Json Load(StringView str, std::ios::openmode mode=std::ios::in)
Decode the JSON object. Optional parameter mode for choosing between text and binary (ubjson) input.
static void Dump(Json json, std::string *out, std::ios::openmode mode=std::ios::out)
Encode the JSON object. Optional parameter mode for choosing between text and binary (ubjson) output.
Value const & GetValue() &&
Definition: json.h:482
Value & GetValue() &
Definition: json.h:483
Definition: json.h:25
virtual Value & operator=(Value const &rhs)=delete
virtual bool operator==(Value const &rhs) const =0
Value(ValueKind _kind)
Definition: json.h:53
virtual Json & operator[](std::string const &key)
virtual ~Value()=default
virtual Json & operator[](int ind)
ValueKind
Simplified implementation of LLVM RTTI.
Definition: json.h:35
friend IntrusivePtrCell & IntrusivePtrRefCount(xgboost::Value const *t) noexcept
Definition: json.h:29
ValueKind Type() const
Definition: json.h:55
std::string TypeStr() const
virtual void Save(JsonWriter *writer) const =0
Implementation of Intrusive Ptr.
Definition: intrusive_ptr.h:207
void swap(xgboost::IntrusivePtr< T > &x, xgboost::IntrusivePtr< T > &y) noexcept
Definition: intrusive_ptr.h:209
std::enable_if_t< std::is_same_v< IntT, std::uint32_t > &&!std::is_same_v< std::size_t, std::uint32_t > > Not32SizeT
Definition: json.h:277
std::enable_if_t< std::is_same_v< T, double > > IsF64T
Definition: json.h:240
std::enable_if_t< std::is_same_v< std::remove_cv_t< T >, std::remove_cv_t< U > >> IsSameT
Definition: json.h:237
JsonNumber::Float & GetImpl(T &val)
Definition: json.h:520
Core data structure for multi-target trees.
Definition: base.h:89
std::vector< std::pair< std::string, std::string > > Args
Definition: base.h:316
bool IsA(Value const *value)
Definition: json.h:73
auto get(U &json) -> decltype(detail::GetImpl(*Cast< T >(&json.GetValue())))&
Get Json value.
Definition: json.h:599
T * Cast(U *value)
Definition: json.h:78
Object ToJson(Parameter const &param)
Convert XGBoost parameter to JSON object.
Definition: json.h:622
Args FromJson(Json const &obj, Parameter *param)
Load a XGBoost parameter from a JSON object.
Definition: json.h:641
macro for using C++11 enum class as DMLC parameter
Definition: string_view.h:16