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