4 #ifndef XGBOOST_JSON_H_
5 #define XGBOOST_JSON_H_
8 #include <xgboost/logging.h>
15 #include <type_traits>
74 return T::IsClassOf(value);
77 template <
typename T,
typename U>
80 return dynamic_cast<T*
>(value);
82 LOG(FATAL) <<
"无效的转换,从 " + value->TypeStr() +
" 到 " + T().TypeStr();
84 return dynamic_cast<T*
>(value);
115 std::vector<Json> vec_;
132 std::vector<Json>
const&
GetArray() && {
return vec_; }
133 std::vector<Json>
const&
GetArray() const & {
return vec_; }
150 template <
typename T, Value::ValueKind kind>
164 void Set(
size_t i, T v) { vec_[i] = v; }
165 size_t Size()
const {
return vec_.size(); }
169 std::vector<T>
const&
GetArray() && {
return vec_; }
170 std::vector<T>
const&
GetArray() const& {
return vec_; }
207 using Map = std::map<std::string, Json, std::less<>>
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>>>
239 template <
typename T>
240 using IsF64T = std::enable_if_t<std::is_same_v<T, double>>
252 template <
typename FloatT,
typename detail::IsSameT<FloatT, Float>* =
nullptr>
254 template <
typename FloatT,
typename detail::IsF64T<FloatT>* =
nullptr>
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>>
290 template <
typename IntT,
typename detail::IsSameT<IntT, Int>* =
nullptr>
292 template <
typename IntT,
typename detail::IsSameT<IntT, std::
size_t>* =
nullptr>
295 template <
typename IntT,
typename detail::IsSameT<IntT, std::
int32_t>* =
nullptr>
298 template <
typename IntT,
337 bool boolean_ =
false;
342 template <
typename Bool,
typename detail::IsSameT<std::remove_cv_t<Bool>,
bool>* =
nullptr>
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);
396 template <
typename Container = std::
string>
398 if constexpr (std::is_same_v<Container, std::string>) {
403 std::vector<char> str;
414 ptr_.reset(
new JsonNumber(std::move(number)));
426 ptr_.reset(
new JsonArray(std::forward<JsonArray>(array)));
430 template <
typename T, Value::ValueKind kind>
433 template <
typename T, Value::ValueKind kind>
441 ptr_.reset(
new JsonObject(std::forward<JsonObject>(
object)));
447 ptr_.reset(
new JsonString(std::forward<JsonString>(str)));
461 ptr_.reset(
new JsonNull(std::move(
null)));
476 [[nodiscard]]
Json&
operator[](std::string
const & key)
const {
return (*ptr_)[key]; }
486 return *ptr_ == *(rhs.ptr_);
511 template <
typename T>
519 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonNumber>>* =
nullptr>
521 return val.GetNumber();
523 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonNumber const>>* =
nullptr>
525 return val.GetNumber();
529 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonInteger>>* =
nullptr>
531 return val.GetInteger();
533 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonInteger const>>* =
nullptr>
535 return val.GetInteger();
539 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonString>>* =
nullptr>
541 return val.GetString();
543 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonString const>>* =
nullptr>
545 return val.GetString();
549 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonBoolean>>* =
nullptr>
551 return val.GetBoolean();
553 template <
typename T,
554 typename std::enable_if_t<std::is_same_v<T, JsonBoolean const>>* =
nullptr>
556 return val.GetBoolean();
560 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonArray>>* =
nullptr>
562 return val.GetArray();
564 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonArray const>>* =
nullptr>
566 return val.GetArray();
570 template <
typename T, Value::ValueKind kind>
574 template <
typename T, Value::ValueKind kind>
580 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonObject>>* =
nullptr>
582 return val.GetObject();
584 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonObject const>>* =
nullptr>
586 return val.GetObject();
599
600
601 template <
typename T,
typename U>
603 auto& value = *Cast<T>(&json.GetValue());
622
623
624 template <
typename Parameter>
627 for (
auto const& kv : param.__DICT__()) {
628 obj[kv.first] = kv.second;
641
642
643 template <
typename Parameter>
645 auto const& j_param = get<Object const>(obj);
647 for (
auto const& kv : j_param) {
648 args.emplace_back(kv.first, get<String const>(kv.second));
650 return param->UpdateAllowUnknown(args);
xgboost::IntrusivePtrCell
用于将引用计数嵌入到客户端对象的帮助类。详情请参阅 https://www....
侵入式指针的实现。一种智能指针,指向带有嵌入式引用计数的对象...
定义: intrusive_ptr.h:73
定义: json.h:114
xgboost::JsonArray::JsonArray
JsonArray(std::vector< Json > const &arr)
定义: json.h:121
JsonArray(JsonArray const &that)=delete
xgboost::JsonArray::operator[]
Json & operator[](std::string const &key) override
xgboost::JsonArray::GetArray
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: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==
xgboost::JsonArray::Save
定义: json.h:322
JsonNull(JsonNull &&) noexcept
定义: json.h:323
xgboost::JsonNull::operator=
xgboost::JsonNull::Save
xgboost::JsonArray::operator==
定义: 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==
JsonArray(std::vector< Json > &&arr) noexcept
定义: json.h:251
定义: json.h:269
JsonNumber(FloatT value)
xgboost::JsonNumber::Save
定义: json.h:205
xgboost::JsonObject::operator[]
侵入式指针的实现。一种智能指针,指向带有嵌入式引用计数的对象...
定义: json.h:221
xgboost::JsonArray::GetArray
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
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() &
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:424
Json(JsonObject &&object)
定义: json.h:439
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 const & GetValue() &&
Value & GetValue() &
定义: json.h:483
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)
xgboost::Value::ValueKind
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
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
定义: base.h:316
xgboost::IsA
定义: 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)