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_;
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  };
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) << "无效的转换,从 " + value->TypeStr() + " 到 " + T().TypeStr();
83  }
84  return dynamic_cast<T*>(value); // 抑制编译器警告。
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} {}
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  // 静默部分重写警告
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  // 静默部分重写警告
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  // 与 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  // 数字
412  explicit Json(JsonNumber number) : ptr_{new JsonNumber(std::move(number))} {}
414  ptr_.reset(new JsonNumber(std::move(number)));
415  return *this;
416  }
417  // 整型
418  explicit Json(JsonInteger integer) : ptr_{new JsonInteger(std::move(integer))} {}
420  ptr_.reset(new JsonInteger(std::move(integer)));
421  return *this;
422  }
423  // 数组
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  // 类型化数组
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  // 对象
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  // 字符串
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  // 布尔值
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  // 空值
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  // 拷贝
466  Json(Json const& other) = default;
467  Json& operator=(Json const& other) = default;
468  // 移动
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  [[nodiscard]] Json& operator[](std::string const & key) const { return (*ptr_)[key]; }
478  [[nodiscard]] 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 // 数字
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 /**
599  * @brief Get Json value.
600  */
601 template <typename T, typename U>
602 auto get(U& json) -> decltype(detail::GetImpl(*Cast<T>(&json.GetValue())))& { // NOLINT
603  auto& value = *Cast<T>(&json.GetValue());
604  return detail::GetImpl(value);
605 }
606 
608 using Array = JsonArray;
613 using Null = JsonNull;
614 
621 /**
622  * @brief Convert XGBoost parameter to JSON object.
623  */
624 template <typename Parameter>
625 Object ToJson(Parameter const& param) {
626  Object obj;
627  for (auto const& kv : param.__DICT__()) {
628  obj[kv.first] = kv.second;
629  }
630  return obj;
631 }
632 
640 /**
641  * @brief Load a XGBoost parameter from a JSON object.
642  */
643 template <typename Parameter>
644 Args FromJson(Json const& obj, Parameter* param) {
645  auto const& j_param = get<Object const>(obj);
646  Args args;
647  for (auto const& kv : j_param) {
648  args.emplace_back(kv.first, get<String const>(kv.second));
649  }
650  return param->UpdateAllowUnknown(args);
651 }
652 } // namespace xgboost
653 #endif // XGBOOST_JSON_H_
xgboost::IntrusivePtrCell
用于将引用计数嵌入到客户端对象的帮助类。详情请参阅 https://www....
653 #endif // XGBOOST_JSON_H_
定义: intrusive_ptr.h:20
侵入式指针的实现。一种智能指针,指向带有嵌入式引用计数的对象...
定义: intrusive_ptr.h:73
定义: json.h:114
xgboost::JsonArray::JsonArray
JsonArray(std::vector< Json > const &arr)
定义: json.h:121
653 #endif // XGBOOST_JSON_H_
JsonArray(JsonArray const &that)=delete
xgboost::JsonArray::operator[]
653 #endif // XGBOOST_JSON_H_
Json & operator[](std::string const &key) override
xgboost::JsonArray::GetArray
653 #endif // XGBOOST_JSON_H_
std::vector< Json > & GetArray() &
定义: json.h:134
JsonArray(std::vector< Json > &&arr) noexcept
定义: json.h:119
xgboost::JsonArray::operator==
xgboost::JsonArray::Save
void Save(JsonWriter *writer) const override
JsonArray()
定义: json.h:118
定义: json.h:128
xgboost::JsonArray::operator=
xgboost::JsonArray::IsClassOf
static bool IsClassOf(Value const *value)
xgboost::JsonArray::Save
std::vector< Json > const & GetArray() const &
xgboost::JsonArray::operator==
xgboost::JsonBoolean
描述 true 和 false。
xgboost::JsonArray::GetArray
定义: json.h:350
xgboost::JsonBoolean::IsClassOf
定义: json.h:356
xgboost::JsonBoolean::operator=
bool const & GetBoolean() &&
定义: json.h:349
xgboost::JsonBoolean::operator==
xgboost::JsonBoolean::Save
定义: json.h:132
定义: json.h:343
JsonBoolean(JsonBoolean &&value) noexcept
bool & GetBoolean() &
定义: json.h:351
xgboost::JsonInteger
定义: json.h:281
xgboost::JsonArray::operator==
JsonInteger(IntT value)
定义: json.h:291
xgboost::JsonArray::GetArray
xgboost::JsonArray::Save
定义: json.h:283
JsonInteger(JsonInteger &&that) noexcept
定义: json.h:303
xgboost::JsonInteger::operator=
xgboost::JsonInteger::GetInteger
Int const & GetInteger() const &
定义: json.h:310
xgboost::JsonInteger::IsClassOf
JsonInteger()
定义: json.h:289
Int & GetInteger() &
定义: json.h:311
xgboost::JsonArray::GetArray
定义: json.h:309
xgboost::JsonNull
xgboost::JsonArray::operator==
定义: json.h:132
xgboost::JsonArray::Save
定义: json.h:322
定义: json.h:321
JsonNull(JsonNull &&) noexcept
定义: json.h:323
xgboost::JsonNull::operator=
xgboost::JsonNull::Save
xgboost::JsonArray::operator==
xgboost::JsonNumber
定义: json.h:243
xgboost::JsonNumber::GetNumber
Float const & GetNumber() const &
定义: json.h:263
xgboost::JsonArray::GetArray
xgboost::JsonNumber::operator=
xgboost::JsonNumber::JsonNumber
JsonNumber(JsonNumber const &that)=delete
Float & GetNumber() &
xgboost::JsonArray::Save
JsonNumber(JsonNumber &&that) noexcept
定义: json.h:258
xgboost::JsonNumber::operator==
定义: json.h:132
定义: json.h:245
JsonArray(std::vector< Json > &&arr) noexcept
定义: json.h:251
定义: json.h:269
JsonNumber(FloatT value)
xgboost::JsonNumber::Save
定义: json.h:132
定义: json.h:205
xgboost::JsonObject::operator[]
侵入式指针的实现。一种智能指针,指向带有嵌入式引用计数的对象...
定义: json.h:221
xgboost::JsonArray::GetArray
定义: json.h:224
JsonObject(JsonObject &&that) noexcept
xgboost::JsonObject::Save
xgboost::JsonArray::operator==
定义: json.h:225
定义: json.h:222
xgboost::JsonObject::operator==
xgboost::JsonArray::Save
~JsonObject() override=default
xgboost::JsonObject::Map
std::map< std::string, Json, std::less<> > Map
定义: json.h:207
Map & GetObject() &
定义: json.h:226
xgboost::JsonObject::IsClassOf
xgboost::JsonArray::Save
JsonObject()
JsonObject(Map &&object) noexcept
xgboost::JsonReader
xgboost::JsonString
定义: json.h:87
xgboost::JsonString::IsClassOf
定义: json.h:109
xgboost::JsonArray::GetArray
xgboost::JsonArray::operator==
定义: json.h:94
xgboost::JsonString::Save
xgboost::JsonString::GetString
std::string const & GetString() &&
定义: json.h:102
std::string & GetString() &
定义: json.h:104
xgboost::JsonString::operator==
JsonString(std::string const &str)
定义: json.h:92
定义: json.h:96
std::string const & GetString() const &
JsonString()
定义: json.h:91
xgboost::JsonTypedArray
用于通用二进制 JSON 的类型化数组。
xgboost::JsonTypedArray::Set
void Set(size_t i, T v)
xgboost::JsonTypedArray::GetArray
std::vector< T > & GetArray() &
定义: json.h:132
xgboost::JsonArray::GetArray
xgboost::JsonTypedArray::Size
size_t Size() const
xgboost::JsonArray::operator==
xgboost::JsonArray::Save
T Type
定义: json.h:155
xgboost::JsonTypedArray::Save
xgboost::JsonTypedArray::operator==
xgboost::JsonTypedArray::JsonTypedArray
JsonTypedArray(std::size_t n)
定义: json.h:158
xgboost::JsonTypedArray::IsClassOf
JsonTypedArray(JsonTypedArray &&that) noexcept
定义: json.h:159
定义: json.h:157
std::vector< T > const & GetArray() const &
xgboost::JsonWriter
定义: json_io.h:110
xgboost::Json
表示 JSON 格式的数据结构。
定义: json.h:378
xgboost::Json::operator=
定义: json.h:413
xgboost::Json::Json
Json(JsonNull null)
定义: json.h:458
Json & operator=(JsonTypedArray< T, kind > &&array)
定义: json.h:434
Json & operator=(JsonString &&str)
xgboost::Json::operator[]
Json & operator[](std::string const &key) const
使用 std::string 为 Json 对象建立索引,用于 Json Object。
定义: json.h:476
定义: json.h:424
Json(JsonObject &&object)
定义: json.h:439
xgboost::Json::Dump
static void Dump(Json json, std::vector< char > *out, std::ios::openmode mode=std::ios::out)
Json(Json &&other) noexcept
定义: json.h:469
Json(Json const &other)=default
xgboost::Json::GetValue
Value const & GetValue() const &
返回对存储的 Json 值的引用。
定义: json.h:481
Json & operator=(Json const &other)=default
Json(JsonString &&str)
定义: json.h:445
定义: json.h:418
Json & operator[](int ind) const
使用 int 为 Json 对象建立索引,用于 Json 数组。
定义: json.h:478
Json & operator=(JsonObject &&object)
定义: json.h:440
定义: json.h:425
xgboost::Json::operator<<
friend std::ostream & operator<<(std::ostream &os, Json const &j)
定义: json.h:489
Json & operator=(JsonInteger integer)
Json & operator=(JsonBoolean boolean)
定义: json.h:453
xgboost::Json::Load
static Json Load(JsonReader *reader)
传入您自己的 JsonReader。
Json()=default
Json(JsonBoolean boolean)
定义: json.h:451
xgboost::Json::Ptr
IntrusivePtr< Value > const & Ptr() const
Json(JsonTypedArray< T, kind > &&list)
定义: json.h:431
Json(JsonNumber number)
定义: json.h:412
Json & operator=(JsonNull null)
定义: json.h:460
static Container Dump(Json json)
定义: json.h:397
xgboost::Json::operator==
bool operator==(Json const &rhs) const
定义: json.h:485
static void Dump(Json json, JsonWriter *writer)
使用您自己的 JsonWriter。
Json & operator=(Json &&other) noexcept
static Json Load(StringView str, std::ios::openmode mode=std::ios::in)
static void Dump(Json json, std::string *out, std::ios::openmode mode=std::ios::out)
Value & GetValue() &
定义: json.h:483
定义: json.h:25
virtual Value & operator=(Value const &rhs)=delete
xgboost::Value::operator==
xgboost::Value::Value
Value(ValueKind _kind)
定义: json.h:53
virtual Json & operator[](std::string const &key)
virtual ~Value()=default
xgboost::Value::ValueKind
LLVM RTTI 的简化实现。
xgboost::Value::ValueKind::kI32Array
xgboost::Value::ValueKind::kObject
xgboost::Value::ValueKind::kI16Array
xgboost::Value::ValueKind::kString
xgboost::Value::ValueKind::kBoolean
xgboost::Value::ValueKind::kNumber
xgboost::Value::ValueKind::kI8Array
xgboost::Value::ValueKind::kF64Array
xgboost::Value::ValueKind::kI64Array
xgboost::Value::ValueKind::kU8Array
xgboost::Value::ValueKind::kArray
@ kArray
@ kInteger
xgboost::Value::ValueKind::kF32Array
xgboost::Value::ValueKind::kNull
xgboost::Value::IntrusivePtrRefCount
ValueKind Type() const
xgboost::Value::TypeStr
std::string TypeStr() const
virtual void Save(JsonWriter *writer) const =0
intrusive_ptr.h
std
定义: 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
定义: json.h:277
xgboost::detail::IsF64T
std::enable_if_t< std::is_same_v< T, double > > IsF64T
xgboost::detail::IsSameT
std::enable_if_t< std::is_same_v< std::remove_cv_t< T >, std::remove_cv_t< U > >> IsSameT
xgboost::detail::GetImpl
JsonNumber::Float & GetImpl(T &val)
多目标树的核心数据结构。
定义: base.h:89
xgboost::Args
定义: json.h:73
xgboost::get
auto get(U &json) -> decltype(detail::GetImpl(*Cast< T >(&json.GetValue())))&
定义: json.h:599
xgboost::Cast
T * Cast(U *value)
xgboost::ToJson