xgboost
json.h
前往此文件文档。
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_;
29  return t->ref_;
30  }
31 
32  public
34  enum class ValueKind : std::int64_t {
35  kString = 0,
36  kNumber = 1,
37  kInteger = 2,
38  kObject = 3, // std::map
39  kArray = 4, // std::vector
40  kBoolean = 5,
41  kNull = 6,
42  // typed array for ubjson
43  kF32Array = 7,
44  kF64Array = 8,
45  kI8Array = 9,
46  kU8Array = 10,
47  kI16Array = 11,
48  kU16Array = 12,
49  kI32Array = 13,
50  kU32Array = 14,
51  kI64Array = 15,
52  kU64Array = 16,
53  };
54 
55  explicit Value(ValueKind _kind) : kind_{_kind} {}
56 
57  ValueKind Type() const { return kind_; }
58  virtual ~Value() = default;
59 
60  virtual void Save(JsonWriter* writer) const = 0;
61 
62  virtual Json& operator[](std::string const& key);
63  virtual Json& operator[](int ind);
64 
65  virtual bool operator==(Value const& rhs) const = 0;
66  Value& operator=(Value const& rhs) = delete;
67 
68  std::string TypeStr() const;
69 
70  private
71  ValueKind kind_;
72 };
73 
74 template <typename T>
75 bool IsA(Value const* value) {
76  return T::IsClassOf(value);
77 }
78 
79 template <typename T, typename U>
80 T* Cast(U* value) {
81  if (IsA<T>(value)) {
82  return dynamic_cast<T*>(value);
83  } else {
84  LOG(FATAL) << "Invalid cast, from " + value->TypeStr() + " to " + T().TypeStr();
85  }
86  return dynamic_cast<T*>(value); // 抑制编译器警告。
87 }
88 
89 class JsonString : public Value {
90  std::string str_;
91 
92  public
93  JsonString() : Value(ValueKind::kString) {}
94  JsonString(std::string const& str) : // NOLINT
95  Value(ValueKind::kString), str_{str} {}
96  JsonString(std::string&& str) noexcept : // NOLINT
97  Value(ValueKind::kString), str_{std::forward<std::string>(str)} {}
98  JsonString(JsonString&& str) noexcept : Value(ValueKind::kString) { // NOLINT
99  std::swap(str.str_, this->str_);
100  }
101 
102  void Save(JsonWriter* writer) const override;
103 
104  std::string const& GetString() && { return str_; }
105  std::string const& GetString() const & { return str_; }
106  std::string& GetString() & { return str_; }
107 
108  bool operator==(Value const& rhs) const override;
109  Value& operator=(Value const& rhs) override = delete;
110 
111  static bool IsClassOf(Value const* value) {
112  return value->Type() == ValueKind::kString;
113  }
114 };
115 
116 class JsonArray : public Value {
117  std::vector<Json> vec_;
118 
119  public
120  JsonArray() : Value(ValueKind::kArray) {}
121  JsonArray(std::vector<Json>&& arr) noexcept // NOLINT
122  : Value(ValueKind::kArray), vec_{std::forward<std::vector<Json>>(arr)} {}
123  JsonArray(std::vector<Json> const& arr) : // NOLINT
124  Value(ValueKind::kArray), vec_{arr} {}
125  JsonArray(JsonArray const& that) = delete;
126  JsonArray(JsonArray && that) noexcept;
127 
128  void Save(JsonWriter* writer) const override;
129 
130  Json& operator[](int ind) override { return vec_.at(ind); }
131  // 消除部分重载警告
132  Json& operator[](std::string const& key) override { return Value::operator[](key); }
133 
134  std::vector<Json> const& GetArray() && { return vec_; }
135  std::vector<Json> const& GetArray() const & { return vec_; }
136  std::vector<Json>& GetArray() & { return vec_; }
137 
138  bool operator==(Value const& rhs) const override;
139  Value& operator=(Value const& rhs) override = delete;
140 
141  static bool IsClassOf(Value const* value) {
142  return value->Type() == ValueKind::kArray;
143  }
144 };
145 
152 template <typename T, Value::ValueKind kind>
153 class JsonTypedArray : public Value {
154  std::vector<T> vec_;
155 
156  public
157  using value_type = T; // NOLINT
158 
159  JsonTypedArray() : Value(kind) {}
160  explicit JsonTypedArray(std::size_t n) : Value(kind) { vec_.resize(n); }
161  JsonTypedArray(JsonTypedArray&& that) noexcept : Value{kind}, vec_{std::move(that.vec_)} {}
162 
163  bool operator==(Value const& rhs) const override;
164  Value& operator=(Value const& rhs) override = delete;
165 
166  void Set(size_t i, T v) { vec_[i] = v; }
167  size_t Size() const { return vec_.size(); }
168 
169  void Save(JsonWriter* writer) const override;
170 
171  std::vector<T> const& GetArray() && { return vec_; }
172  std::vector<T> const& GetArray() const& { return vec_; }
173  std::vector<T>& GetArray() & { return vec_; }
174 
175  static bool IsClassOf(Value const* value) { return value->Type() == kind; }
176 };
177 
218 
219 class JsonObject : public Value {
220  public
221  using Map = std::map<std::string, Json, std::less<>>;
222 
223  private
224  Map object_;
225 
226  public
227  JsonObject() : Value(ValueKind::kObject) {}
228  JsonObject(Map&& object) noexcept; // NOLINT
229  JsonObject(JsonObject const& that) = delete;
230  JsonObject(JsonObject&& that) noexcept;
231 
232  void Save(JsonWriter* writer) const override;
233 
234  // 消除部分重载警告
235  Json& operator[](int ind) override { return Value::operator[](ind); }
236  Json& operator[](std::string const& key) override { return object_[key]; }
237 
238  Map const& GetObject() && { return object_; }
239  Map const& GetObject() const& { return object_; }
240  Map& GetObject() & { return object_; }
241 
242  bool operator==(Value const& rhs) const override;
243  Value& operator=(Value const& rhs) override = delete;
244 
245  static bool IsClassOf(Value const* value) { return value->Type() == ValueKind::kObject; }
246  ~JsonObject() override = default;
247 };
248 
249 namespace detail {
250 template <typename T, typename U>
251 using IsSameT = std::enable_if_t<std::is_same_v<std::remove_cv_t<T>, std::remove_cv_t<U>>>;
252 
253 template <typename T>
254 using IsF64T = std::enable_if_t<std::is_same_v<T, double>>;
255 } // namespace detail
256 
257 class JsonNumber : public Value {
258  public
259  using Float = float;
260 
261  private
262  Float number_ { 0 };
263 
264  public
265  JsonNumber() : Value(ValueKind::kNumber) {}
266  template <typename FloatT, typename detail::IsSameT<FloatT, Float>* = nullptr>
267  JsonNumber(FloatT value) : Value(ValueKind::kNumber), number_{value} {} // NOLINT
268  template <typename FloatT, typename detail::IsF64T<FloatT>* = nullptr>
269  JsonNumber(FloatT value) // NOLINT
270  : Value{ValueKind::kNumber}, number_{static_cast<Float>(value)} {}
271  JsonNumber(JsonNumber const& that) = delete;
272  JsonNumber(JsonNumber&& that) noexcept : Value{ValueKind::kNumber}, number_{that.number_} {}
273 
274  void Save(JsonWriter* writer) const override;
275 
276  Float const& GetNumber() && { return number_; }
277  Float const& GetNumber() const & { return number_; }
278  Float& GetNumber() & { return number_; }
279 
280  bool operator==(Value const& rhs) const override;
281  Value& operator=(Value const& rhs) override = delete;
282 
283  static bool IsClassOf(Value const* value) {
284  return value->Type() == ValueKind::kNumber;
285  }
286 };
287 
288 namespace detail {
289 template <typename IntT>
290 using Not32SizeT = std::enable_if_t<std::is_same_v<IntT, std::uint32_t> &&
291  !std::is_same_v<std::size_t, std::uint32_t>>;
292 }
293 
294 
295 class JsonInteger : public Value {
296  public
297  using Int = int64_t;
298 
299  private
300  Int integer_ {0};
301 
302  public
303  JsonInteger() : Value(ValueKind::kInteger) {} // NOLINT
304  template <typename IntT, typename detail::IsSameT<IntT, Int>* = nullptr>
305  JsonInteger(IntT value) : Value(ValueKind::kInteger), integer_{value} {} // NOLINT
306  template <typename IntT, typename detail::IsSameT<IntT, std::size_t>* = nullptr>
307  JsonInteger(IntT value) // NOLINT
308  : Value(ValueKind::kInteger), integer_{static_cast<Int>(value)} {}
309  template <typename IntT, typename detail::IsSameT<IntT, std::int32_t>* = nullptr>
310  JsonInteger(IntT value) // NOLINT
311  : Value(ValueKind::kInteger), integer_{static_cast<Int>(value)} {}
312  template <typename IntT,
313  typename detail::Not32SizeT<IntT>* = nullptr>
314  JsonInteger(IntT value) // NOLINT
315  : Value(ValueKind::kInteger), integer_{static_cast<Int>(value)} {}
316 
317  JsonInteger(JsonInteger &&that) noexcept
318  : Value{ValueKind::kInteger}, integer_{that.integer_} {}
319 
320  bool operator==(Value const& rhs) const override;
321  Value& operator=(Value const& rhs) override = delete;
322 
323  Int const& GetInteger() && { return integer_; }
324  Int const& GetInteger() const & { return integer_; }
325  Int& GetInteger() & { return integer_; }
326  void Save(JsonWriter* writer) const override;
327 
328  static bool IsClassOf(Value const* value) {
329  return value->Type() == ValueKind::kInteger;
330  }
331 };
332 
333 class JsonNull : public Value {
334  public
335  JsonNull() : Value(ValueKind::kNull) {}
336  JsonNull(std::nullptr_t) : Value(ValueKind::kNull) {} // NOLINT
337  JsonNull(JsonNull&&) noexcept : Value(ValueKind::kNull) {}
338 
339  void Save(JsonWriter* writer) const override;
340 
341  bool operator==(Value const& rhs) const override;
342  Value& operator=(Value const& rhs) override = delete;
343 
344  static bool IsClassOf(Value const* value) {
345  return value->Type() == ValueKind::kNull;
346  }
347 };
348 
350 class JsonBoolean : public Value {
351  bool boolean_ = false;
352 
353  public
354  JsonBoolean() : Value(ValueKind::kBoolean) {} // NOLINT
355  // 与JsonNumber有歧义。
356  template <typename Bool, typename detail::IsSameT<std::remove_cv_t<Bool>, bool>* = nullptr>
357  JsonBoolean(Bool value) : Value(ValueKind::kBoolean), boolean_{value} {} // NOLINT
358  JsonBoolean(JsonBoolean&& value) noexcept: // NOLINT
359  Value(ValueKind::kBoolean), boolean_{value.boolean_} {}
360 
361  void Save(JsonWriter* writer) const override;
362 
363  bool const& GetBoolean() && { return boolean_; }
364  bool const& GetBoolean() const & { return boolean_; }
365  bool& GetBoolean() & { return boolean_; }
366 
367  bool operator==(Value const& rhs) const override;
368  Value& operator=(Value const& rhs) override = delete;
369 
370  static bool IsClassOf(Value const* value) {
371  return value->Type() == ValueKind::kBoolean;
372  }
373 };
374 
392 class Json {
393  public
398  static Json Load(StringView str, std::ios::openmode mode = std::ios::in);
400  static Json Load(JsonReader* reader);
405  static void Dump(Json json, std::string* out, std::ios::openmode mode = std::ios::out);
406  static void Dump(Json json, std::vector<char>* out, std::ios::openmode mode = std::ios::out);
408  static void Dump(Json json, JsonWriter* writer);
409 
410  template <typename Container = std::string>
411  static Container Dump(Json json) {
412  if constexpr (std::is_same_v<Container, std::string>) {
413  std::string str;
414  Dump(json, &str);
415  return str;
416  } else {
417  std::vector<char> str;
418  Dump(json, &str);
419  return str;
420  }
421  }
422 
423  Json() = default;
424 
425  // 数字
426  explicit Json(JsonNumber number) : ptr_{new JsonNumber(std::move(number))} {}
428  ptr_.reset(new JsonNumber(std::move(number)));
429  return *this;
430  }
431  // 整数
432  explicit Json(JsonInteger integer) : ptr_{new JsonInteger(std::move(integer))} {}
434  ptr_.reset(new JsonInteger(std::move(integer)));
435  return *this;
436  }
437  // 数组
438  explicit Json(JsonArray&& list) : ptr_{new JsonArray(std::forward<JsonArray>(list))} {}
440  ptr_.reset(new JsonArray(std::forward<JsonArray>(array)));
441  return *this;
442  }
443  // 类型化数组
444  template <typename T, Value::ValueKind kind>
445  explicit Json(JsonTypedArray<T, kind>&& list)
446  : ptr_{new JsonTypedArray<T, kind>(std::forward<JsonTypedArray<T, kind>>(list))} {}
447  template <typename T, Value::ValueKind kind>
449  ptr_.reset(new JsonTypedArray<T, kind>(std::forward<JsonTypedArray<T, kind>>(array)));
450  return *this;
451  }
452  // 对象
453  explicit Json(JsonObject&& object) : ptr_{new JsonObject(std::forward<JsonObject>(object))} {}
454  Json& operator=(JsonObject&& object) {
455  ptr_.reset(new JsonObject(std::forward<JsonObject>(object)));
456  return *this;
457  }
458  // 字符串
459  explicit Json(JsonString&& str) : ptr_{new JsonString(std::forward<JsonString>(str))} {}
461  ptr_.reset(new JsonString(std::forward<JsonString>(str)));
462  return *this;
463  }
464  // 布尔值
465  explicit Json(JsonBoolean boolean)
466  ptr_{new JsonBoolean(std::move(boolean))} {}
468  ptr_.reset(new JsonBoolean(std::move(boolean)));
469  return *this;
470  }
471  // 空值
472  explicit Json(JsonNull null)
473  ptr_{new JsonNull(std::move(null))} {}
475  ptr_.reset(new JsonNull(std::move(null)));
476  return *this;
477  }
478 
479  // 复制
480  Json(Json const& other) = default;
481  Json& operator=(Json const& other) = default;
482  // 移动
483  Json(Json &&other) noexcept { std::swap(this->ptr_, other.ptr_); }
484  Json &operator=(Json &&other) noexcept {
485  std::swap(this->ptr_, other.ptr_);
486  return *this;
487  }
488 
490  Json& operator[](std::string const & key) const { return (*ptr_)[key]; }
492  Json& operator[](int ind) const { return (*ptr_)[ind]; }
493 
495  [[nodiscard]] Value const& GetValue() const& { return *ptr_; }
496  Value const& GetValue() && { return *ptr_; }
497  Value& GetValue() & { return *ptr_; }
498 
499  bool operator==(Json const& rhs) const {
500  return *ptr_ == *(rhs.ptr_);
501  }
502 
503  friend std::ostream& operator<<(std::ostream& os, Json const& j) {
504  std::string str;
505  Json::Dump(j, &str);
506  os << str;
507  return os;
508  }
509 
510  [[nodiscard]] IntrusivePtr<Value> const& Ptr() const { return ptr_; }
511 
512  private
513  IntrusivePtr<Value> ptr_{new JsonNull};
514 };
515 
525 template <typename T>
526 bool IsA(Json const& j) {
527  auto const& v = j.GetValue();
528  return IsA<T>(&v);
529 }
530 
531 namespace detail {
532 // Number
533 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonNumber>>* = nullptr>
534 JsonNumber::Float& GetImpl(T& val) { // NOLINT
535  return val.GetNumber();
536 }
537 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonNumber const>>* = nullptr>
538 JsonNumber::Float const& GetImpl(T& val) { // NOLINT
539  return val.GetNumber();
540 }
541 
542 // Integer
543 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonInteger>>* = nullptr>
544 JsonInteger::Int& GetImpl(T& val) { // NOLINT
545  return val.GetInteger();
546 }
547 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonInteger const>>* = nullptr>
548 JsonInteger::Int const& GetImpl(T& val) { // NOLINT
549  return val.GetInteger();
550 }
551 
552 // String
553 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonString>>* = nullptr>
554 std::string& GetImpl(T& val) { // NOLINT
555  return val.GetString();
556 }
557 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonString const>>* = nullptr>
558 std::string const& GetImpl(T& val) { // NOLINT
559  return val.GetString();
560 }
561 
562 // Boolean
563 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonBoolean>>* = nullptr>
564 bool& GetImpl(T& val) { // NOLINT
565  return val.GetBoolean();
566 }
567 template <typename T,
568  typename std::enable_if_t<std::is_same_v<T, JsonBoolean const>>* = nullptr>
569 bool const& GetImpl(T& val) { // NOLINT
570  return val.GetBoolean();
571 }
572 
573 // Array
574 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonArray>>* = nullptr>
575 std::vector<Json>& GetImpl(T& val) { // NOLINT
576  return val.GetArray();
577 }
578 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonArray const>>* = nullptr>
579 std::vector<Json> const& GetImpl(T& val) { // NOLINT
580  return val.GetArray();
581 }
582 
583 // Typed Array
584 template <typename T, Value::ValueKind kind>
585 std::vector<T>& GetImpl(JsonTypedArray<T, kind>& val) { // NOLINT
586  return val.GetArray();
587 }
588 template <typename T, Value::ValueKind kind>
589 std::vector<T> const& GetImpl(JsonTypedArray<T, kind> const& val) {
590  return val.GetArray();
591 }
592 
593 // Object
594 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonObject>>* = nullptr>
595 JsonObject::Map& GetImpl(T& val) { // NOLINT
596  return val.GetObject();
597 }
598 template <typename T, typename std::enable_if_t<std::is_same_v<T, JsonObject const>>* = nullptr>
599 JsonObject::Map const& GetImpl(T& val) { // NOLINT
600  return val.GetObject();
601 }
602 } // namespace detail
603 
612 template <typename T, typename U>
613 auto get(U& json) -> decltype(detail::GetImpl(*Cast<T>(&json.GetValue())))& { // NOLINT
614  auto& value = *Cast<T>(&json.GetValue());
615  return detail::GetImpl(value);
616 }
617 
619 using Array = JsonArray;
624 using Null = JsonNull;
625 
635 template <typename Parameter>
636 Object ToJson(Parameter const& param) {
637  Object obj;
638  for (auto const& kv : param.__DICT__()) {
639  obj[kv.first] = kv.second;
640  }
641  return obj;
642 }
643 
654 template <typename Parameter>
655 Args FromJson(Json const& obj, Parameter* param) {
656  auto const& j_param = get<Object const>(obj);
657  Args args;
658  for (auto const& kv : j_param) {
659  args.emplace_back(kv.first, get<String const>(kv.second));
660  }
661  return param->UpdateAllowUnknown(args);
662 }
663 } // namespace xgboost
664 #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:116
JsonArray(std::vector< Json > const &arr)
Definition: json.h:123
JsonArray(JsonArray const &that)=delete
Json & operator[](std::string const &key) override
Definition: json.h:132
std::vector< Json > const & GetArray() &&
Definition: json.h:134
std::vector< Json > & GetArray() &
Definition: json.h:136
JsonArray(std::vector< Json > &&arr) noexcept
Definition: json.h:121
JsonArray(JsonArray &&that) noexcept
bool operator==(Value const &rhs) const override
void Save(JsonWriter *writer) const override
JsonArray()
Definition: json.h:120
Json & operator[](int ind) override
Definition: json.h:130
Value & operator=(Value const &rhs) override=delete
static bool IsClassOf(Value const *value)
Definition: json.h:141
std::vector< Json > const & GetArray() const &
Definition: json.h:135
Describes both true and false.
Definition: json.h:350
bool const & GetBoolean() const &
Definition: json.h:364
static bool IsClassOf(Value const *value)
Definition: json.h:370
Value & operator=(Value const &rhs) override=delete
bool const & GetBoolean() &&
Definition: json.h:363
bool operator==(Value const &rhs) const override
void Save(JsonWriter *writer) const override
JsonBoolean()
Definition: json.h:354
JsonBoolean(Bool value)
Definition: json.h:357
JsonBoolean(JsonBoolean &&value) noexcept
Definition: json.h:358
bool & GetBoolean() &
Definition: json.h:365
Definition: json.h:295
void Save(JsonWriter *writer) const override
JsonInteger(IntT value)
Definition: json.h:305
int64_t Int
Definition: json.h:297
JsonInteger(JsonInteger &&that) noexcept
Definition: json.h:317
Value & operator=(Value const &rhs) override=delete
Int const & GetInteger() const &
Definition: json.h:324
bool operator==(Value const &rhs) const override
static bool IsClassOf(Value const *value)
Definition: json.h:328
JsonInteger()
Definition: json.h:303
Int & GetInteger() &
Definition: json.h:325
Int const & GetInteger() &&
Definition: json.h:323
Definition: json.h:333
JsonNull(std::nullptr_t)
Definition: json.h:336
JsonNull()
Definition: json.h:335
bool operator==(Value const &rhs) const override
JsonNull(JsonNull &&) noexcept
Definition: json.h:337
Value & operator=(Value const &rhs) override=delete
void Save(JsonWriter *writer) const override
static bool IsClassOf(Value const *value)
Definition: json.h:344
Definition: json.h:257
Float const & GetNumber() const &
Definition: json.h:277
Float const & GetNumber() &&
Definition: json.h:276
Value & operator=(Value const &rhs) override=delete
JsonNumber(JsonNumber const &that)=delete
Float & GetNumber() &
Definition: json.h:278
JsonNumber(JsonNumber &&that) noexcept
Definition: json.h:272
bool operator==(Value const &rhs) const override
float Float
Definition: json.h:259
JsonNumber()
Definition: json.h:265
static bool IsClassOf(Value const *value)
Definition: json.h:283
JsonNumber(FloatT value)
Definition: json.h:267
void Save(JsonWriter *writer) const override
Definition: json.h:219
Json & operator[](int ind) override
Definition: json.h:235
Map const & GetObject() &&
Definition: json.h:238
JsonObject(JsonObject &&that) noexcept
void Save(JsonWriter *writer) const override
Map const & GetObject() const &
Definition: json.h:239
Json & operator[](std::string const &key) override
Definition: json.h:236
bool operator==(Value const &rhs) const override
~JsonObject() override=default
std::map< std::string, Json, std::less<> > Map
Definition: json.h:221
Value & operator=(Value const &rhs) override=delete
Map & GetObject() &
Definition: json.h:240
JsonObject(JsonObject const &that)=delete
static bool IsClassOf(Value const *value)
Definition: json.h:245
JsonObject()
Definition: json.h:227
JsonObject(Map &&object) noexcept
一个 json 读取器,目前错误检查和 utf-8 尚未完全支持。
Definition: json_io.h:20
Definition: json.h:89
static bool IsClassOf(Value const *value)
Definition: json.h:111
JsonString(std::string &&str) noexcept
Definition: json.h:96
void Save(JsonWriter *writer) const override
std::string const & GetString() &&
Definition: json.h:104
std::string & GetString() &
Definition: json.h:106
bool operator==(Value const &rhs) const override
Value & operator=(Value const &rhs) override=delete
JsonString(std::string const &str)
Definition: json.h:94
JsonString(JsonString &&str) noexcept
Definition: json.h:98
std::string const & GetString() const &
Definition: json.h:105
JsonString()
Definition: json.h:93
Typed array for Universal Binary JSON.
Definition: json.h:153
void Set(size_t i, T v)
Definition: json.h:166
T value_type
Definition: json.h:157
std::vector< T > & GetArray() &
Definition: json.h:173
std::vector< T > const & GetArray() &&
Definition: json.h:171
size_t Size() const
Definition: json.h:167
void Save(JsonWriter *writer) const override
bool operator==(Value const &rhs) const override
JsonTypedArray(std::size_t n)
Definition: json.h:160
Value & operator=(Value const &rhs) override=delete
static bool IsClassOf(Value const *value)
Definition: json.h:175
JsonTypedArray(JsonTypedArray &&that) noexcept
Definition: json.h:161
JsonTypedArray()
Definition: json.h:159
std::vector< T > const & GetArray() const &
Definition: json.h:172
Definition: json_io.h:110
表示JSON格式的数据结构。
Definition: json.h:392
Json & operator=(JsonNumber number)
Definition: json.h:427
Json(JsonNull null)
Definition: json.h:472
Json & operator=(JsonTypedArray< T, kind > &&array)
Definition: json.h:448
Json & operator=(JsonString &&str)
Definition: json.h:460
Json & operator[](std::string const &key) const
Index Json object with a std::string, used for Json Object.
Definition: json.h:490
Json(JsonArray &&list)
Definition: json.h:438
Json(JsonObject &&object)
Definition: json.h:453
static void Dump(Json json, std::vector< char > *out, std::ios::openmode mode=std::ios::out)
Json(Json &&other) noexcept
Definition: json.h:483
Json(Json const &other)=default
Value const & GetValue() const &
Return the reference to stored Json value.
Definition: json.h:495
Json & operator=(Json const &other)=default
Json(JsonString &&str)
Definition: json.h:459
Json(JsonInteger integer)
Definition: json.h:432
Json & operator[](int ind) const
Index Json object with int, used for Json Array.
Definition: json.h:492
Json & operator=(JsonObject &&object)
Definition: json.h:454
Json & operator=(JsonArray &&array)
Definition: json.h:439
friend std::ostream & operator<<(std::ostream &os, Json const &j)
Definition: json.h:503
Json & operator=(JsonInteger integer)
Definition: json.h:433
Json & operator=(JsonBoolean boolean)
Definition: json.h:467
static Json Load(JsonReader *reader)
Pass your own JsonReader.
Json()=default
Json(JsonBoolean boolean)
Definition: json.h:465
IntrusivePtr< Value > const & Ptr() const
Definition: json.h:510
Json(JsonTypedArray< T, kind > &&list)
Definition: json.h:445
Json(JsonNumber number)
Definition: json.h:426
Json & operator=(JsonNull null)
Definition: json.h:474
static Container Dump(Json json)
Definition: json.h:411
bool operator==(Json const &rhs) const
Definition: json.h:499
static void Dump(Json json, JsonWriter *writer)
Use your own JsonWriter.
Json & operator=(Json &&other) noexcept
Definition: json.h:484
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)
编码 JSON 对象。可选参数 mode 用于选择文本或二进制 (ubjson) 输出。
Value const & GetValue() &&
Definition: json.h:496
Value & GetValue() &
Definition: json.h:497
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:55
ValueKind
Simplified implementation of LLVM RTTI.
Definition: json.h:34
virtual Json & operator[](std::string const &key)
virtual ~Value()=default
virtual Json & operator[](int ind)
friend IntrusivePtrCell & IntrusivePtrRefCount(xgboost::Value const *t) noexcept
Definition: json.h:28
ValueKind Type() const
Definition: json.h:57
std::string TypeStr() const
virtual void Save(JsonWriter *writer) const =0
侵入式指针的实现。
Definition: intrusive_ptr.h:207
void swap(xgboost::IntrusivePtr< T > &x, xgboost::IntrusivePtr< T > &y) noexcept
定义: 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:291
std::enable_if_t< std::is_same_v< T, double > > IsF64T
Definition: json.h:254
std::enable_if_t< std::is_same_v< std::remove_cv_t< T >, std::remove_cv_t< U > >> IsSameT
Definition: json.h:251
JsonNumber::Float & GetImpl(T &val)
Definition: json.h:534
集成目标、gbm和评估的学习器接口。这是用户面临的XGB...
Definition: base.h:97
std::vector< std::pair< std::string, std::string > > Args
定义: base.h:324
bool IsA(Value const *value)
Definition: json.h:75
auto get(U &json) -> decltype(detail::GetImpl(*Cast< T >(&json.GetValue())))&
Get Json value.
Definition: json.h:613
T * Cast(U *value)
Definition: json.h:80
Object ToJson(Parameter const &param)
Convert XGBoost parameter to JSON object.
Definition: json.h:636
Args FromJson(Json const &obj, Parameter *param)
Load a XGBoost parameter from a JSON object.
Definition: json.h:655
使用 C++11 枚举类作为 DMLC 参数的宏
Definition: string_view.h:16