4 #ifndef XGBOOST_JSON_H_ 
 5 #define XGBOOST_JSON_H_ 
 8 #include <xgboost/logging.h> 
 15 #include <type_traits>  
 76  return T::IsClassOf(value);
 
 79 template <
typename T, 
typename U>
 
 82  return dynamic_cast<T*
>(value);
 
 84  LOG(FATAL) << 
"Invalid cast, from " + value->TypeStr() + 
" to " + T().TypeStr();
 
 86  return dynamic_cast<T*
>(value); 
 
 117  std::vector<Json> vec_;
 
 134  std::vector<Json> 
const& 
GetArray() && { 
return vec_; }
 
 135  std::vector<Json> 
const& 
GetArray() const & { 
return vec_; }
 
 152 template <
typename T, Value::ValueKind kind>
 
 166  void Set(
size_t i, T v) { vec_[i] = v; }
 
 167  size_t Size()
 const { 
return vec_.size(); }
 
 171  std::vector<T> 
const& 
GetArray() && { 
return vec_; }
 
 172  std::vector<T> 
const& 
GetArray() const& { 
return vec_; }
 
 221  using Map = std::map<std::string, Json, std::less<>>;
 
 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>>>;
 
 253 template <
typename T>
 
 254 using IsF64T = std::enable_if_t<std::is_same_v<T, double>>;
 
 266  template <
typename FloatT, 
typename detail::IsSameT<FloatT, Float>* = 
nullptr>
 
 268  template <
typename FloatT, 
typename detail::IsF64T<FloatT>* = 
nullptr>
 
 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>>;
 
 304  template <
typename IntT, 
typename detail::IsSameT<IntT, Int>* = 
nullptr>
 
 306  template <
typename IntT, 
typename detail::IsSameT<IntT, std::
size_t>* = 
nullptr>
 
 309  template <
typename IntT, 
typename detail::IsSameT<IntT, std::
int32_t>* = 
nullptr>
 
 312  template <
typename IntT,
 
 351  bool boolean_ = 
false;
 
 356  template <
typename Bool, 
typename detail::IsSameT<std::remove_cv_t<Bool>, 
bool>* = 
nullptr>
 
 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);
 
 410  template <
typename Container = std::
string>
 
 412  if constexpr (std::is_same_v<Container, std::string>) {
 
 417  std::vector<char> str;
 
 428  ptr_.reset(
new JsonNumber(std::move(number)));
 
 440  ptr_.reset(
new JsonArray(std::forward<JsonArray>(array)));
 
 444  template <
typename T, Value::ValueKind kind>
 
 447  template <
typename T, Value::ValueKind kind>
 
 455  ptr_.reset(
new JsonObject(std::forward<JsonObject>(
object)));
 
 461  ptr_.reset(
new JsonString(std::forward<JsonString>(str)));
 
 475  ptr_.reset(
new JsonNull(std::move(
null)));
 
 500  return *ptr_ == *(rhs.ptr_);
 
 525 template <
typename T>
 
 533 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonNumber>>* = 
nullptr>
 
 535  return val.GetNumber();
 
 537 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonNumber const>>* = 
nullptr>
 
 539  return val.GetNumber();
 
 543 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonInteger>>* = 
nullptr>
 
 545  return val.GetInteger();
 
 547 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonInteger const>>* = 
nullptr>
 
 549  return val.GetInteger();
 
 553 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonString>>* = 
nullptr>
 
 555  return val.GetString();
 
 557 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonString const>>* = 
nullptr>
 
 559  return val.GetString();
 
 563 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonBoolean>>* = 
nullptr>
 
 565  return val.GetBoolean();
 
 567 template <
typename T,
 
 568  typename std::enable_if_t<std::is_same_v<T, JsonBoolean const>>* = 
nullptr>
 
 570  return val.GetBoolean();
 
 574 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonArray>>* = 
nullptr>
 
 576  return val.GetArray();
 
 578 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonArray const>>* = 
nullptr>
 
 580  return val.GetArray();
 
 584 template <
typename T, Value::ValueKind kind>
 
 588 template <
typename T, Value::ValueKind kind>
 
 594 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonObject>>* = 
nullptr>
 
 596  return val.GetObject();
 
 598 template <
typename T, 
typename std::enable_if_t<std::is_same_v<T, JsonObject const>>* = 
nullptr>
 
 600  return val.GetObject();
 
 612 template <
typename T, 
typename U>
 
 614  auto& value = *Cast<T>(&json.GetValue());
 
 635 template <
typename Parameter>
 
 638  for (
auto const& kv : param.__DICT__()) {
 
 639  obj[kv.first] = kv.second;
 
 654 template <
typename Parameter>
 
 656  auto const& j_param = get<Object const>(obj);
 
 658  for (
auto const& kv : j_param) {
 
 659  args.emplace_back(kv.first, get<String const>(kv.second));
 
 661  return param->UpdateAllowUnknown(args);
 
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
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
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
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
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
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
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(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
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 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 ¶m)
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
Definition: string_view.h:16