4 #ifndef XGBOOST_JSON_H_
5 #define XGBOOST_JSON_H_
8 #include <xgboost/logging.h>
15 #include <type_traits>
80 return T::IsClassOf(value);
83 template <
typename T,
typename U>
86 return dynamic_cast<T*
>(value);
88 LOG(FATAL) <<
"Invalid cast, from " + value->TypeStr() +
" to " + T().TypeStr();
90 return dynamic_cast<T*
>(value);
121 std::vector<Json> vec_;
138 std::vector<Json>
const&
GetArray() && {
return vec_; }
139 std::vector<Json>
const&
GetArray() const & {
return vec_; }
156 template <
typename T, Value::ValueKind kind>
170 void Set(
size_t i, T v) { vec_[i] = v; }
171 size_t Size()
const {
return vec_.size(); }
175 std::vector<T>
const&
GetArray() && {
return vec_; }
176 std::vector<T>
const&
GetArray() const& {
return vec_; }
225 using Map = std::map<std::string, Json, std::less<>>;
254 template <
typename T,
typename U>
255 using IsSameT = std::enable_if_t<std::is_same_v<std::remove_cv_t<T>, std::remove_cv_t<U>>>;
257 template <
typename T>
258 using IsF64T = std::enable_if_t<std::is_same_v<T, double>>;
270 template <
typename FloatT,
typename detail::IsSameT<FloatT, Float>* =
nullptr>
272 template <
typename FloatT,
typename detail::IsF64T<FloatT>* =
nullptr>
293 template <
typename IntT>
294 using Not32SizeT = std::enable_if_t<std::is_same_v<IntT, std::uint32_t> &&
295 !std::is_same_v<std::size_t, std::uint32_t>>;
308 template <
typename IntT,
typename detail::IsSameT<IntT, Int>* =
nullptr>
310 template <
typename IntT,
typename detail::IsSameT<IntT, std::
size_t>* =
nullptr>
313 template <
typename IntT,
typename detail::IsSameT<IntT, std::
int32_t>* =
nullptr>
316 template <
typename IntT,
355 bool boolean_ =
false;
360 template <
typename Bool,
typename detail::IsSameT<std::remove_cv_t<Bool>,
bool>* =
nullptr>
409 static void Dump(
Json json, std::string* out, std::ios::openmode mode = std::ios::out);
410 static void Dump(
Json json, std::vector<char>* out, std::ios::openmode mode = std::ios::out);
414 template <
typename Container = std::
string>
416 if constexpr (std::is_same_v<Container, std::string>) {
421 std::vector<char> str;
432 ptr_.reset(
new JsonNumber(std::move(number)));
444 ptr_.reset(
new JsonArray(std::forward<JsonArray>(array)));
448 template <
typename T, Value::ValueKind kind>
451 template <
typename T, Value::ValueKind kind>
459 ptr_.reset(
new JsonObject(std::forward<JsonObject>(
object)));
465 ptr_.reset(
new JsonString(std::forward<JsonString>(str)));
479 ptr_.reset(
new JsonNull(std::move(
null)));
504 return *ptr_ == *(rhs.ptr_);
529 template <
typename T>
537 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonNumber>>* =
nullptr>
539 return val.GetNumber();
541 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonNumber const>>* =
nullptr>
543 return val.GetNumber();
547 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonInteger>>* =
nullptr>
549 return val.GetInteger();
551 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonInteger const>>* =
nullptr>
553 return val.GetInteger();
557 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonString>>* =
nullptr>
559 return val.GetString();
561 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonString const>>* =
nullptr>
563 return val.GetString();
567 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonBoolean>>* =
nullptr>
569 return val.GetBoolean();
571 template <
typename T,
572 typename std::enable_if_t<std::is_same_v<T, JsonBoolean const>>* =
nullptr>
574 return val.GetBoolean();
578 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonArray>>* =
nullptr>
580 return val.GetArray();
582 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonArray const>>* =
nullptr>
584 return val.GetArray();
588 template <
typename T, Value::ValueKind kind>
592 template <
typename T, Value::ValueKind kind>
598 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonObject>>* =
nullptr>
600 return val.GetObject();
602 template <
typename T,
typename std::enable_if_t<std::is_same_v<T, JsonObject const>>* =
nullptr>
604 return val.GetObject();
616 template <
typename T,
typename U>
618 auto& value = *Cast<T>(&json.GetValue());
639 template <
typename Parameter>
642 for (
auto const& kv : param.__DICT__()) {
643 obj[kv.first] = kv.second;
658 template <
typename Parameter>
660 auto const& j_param = get<Object const>(obj);
662 for (
auto const& kv : j_param) {
663 args.emplace_back(kv.first, get<String const>(kv.second));
665 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:127
JsonArray(JsonArray const &that)=delete
Json & operator[](std::string const &key) override
Definition: json.h:136
std::vector< Json > const & GetArray() &&
Definition: json.h:138
std::vector< Json > & GetArray() &
Definition: json.h:140
JsonArray(std::vector< Json > &&arr) noexcept
Definition: json.h:125
JsonArray(JsonArray &&that) noexcept
bool operator==(Value const &rhs) const override
void Save(JsonWriter *writer) const override
JsonArray()
Definition: json.h:124
Json & operator[](int ind) override
Definition: json.h:134
Value & operator=(Value const &rhs) override=delete
static bool IsClassOf(Value const *value)
Definition: json.h:145
std::vector< Json > const & GetArray() const &
Definition: json.h:139
Describes both true and false.
Definition: json.h:354
bool const & GetBoolean() const &
Definition: json.h:368
static bool IsClassOf(Value const *value)
Definition: json.h:374
Value & operator=(Value const &rhs) override=delete
bool const & GetBoolean() &&
Definition: json.h:367
bool operator==(Value const &rhs) const override
void Save(JsonWriter *writer) const override
JsonBoolean()
Definition: json.h:358
JsonBoolean(Bool value)
Definition: json.h:361
JsonBoolean(JsonBoolean &&value) noexcept
Definition: json.h:362
bool & GetBoolean() &
Definition: json.h:369
void Save(JsonWriter *writer) const override
JsonInteger(IntT value)
Definition: json.h:309
int64_t Int
Definition: json.h:301
JsonInteger(JsonInteger &&that) noexcept
Definition: json.h:321
Value & operator=(Value const &rhs) override=delete
Int const & GetInteger() const &
Definition: json.h:328
bool operator==(Value const &rhs) const override
static bool IsClassOf(Value const *value)
Definition: json.h:332
JsonInteger()
Definition: json.h:307
Int & GetInteger() &
Definition: json.h:329
Int const & GetInteger() &&
Definition: json.h:327
JsonNull(std::nullptr_t)
Definition: json.h:340
JsonNull()
Definition: json.h:339
bool operator==(Value const &rhs) const override
JsonNull(JsonNull &&) noexcept
Definition: json.h:341
Value & operator=(Value const &rhs) override=delete
void Save(JsonWriter *writer) const override
static bool IsClassOf(Value const *value)
Definition: json.h:348
Float const & GetNumber() const &
Definition: json.h:281
Float const & GetNumber() &&
Definition: json.h:280
Value & operator=(Value const &rhs) override=delete
JsonNumber(JsonNumber const &that)=delete
Float & GetNumber() &
Definition: json.h:282
JsonNumber(JsonNumber &&that) noexcept
Definition: json.h:276
bool operator==(Value const &rhs) const override
float Float
Definition: json.h:263
JsonNumber()
Definition: json.h:269
static bool IsClassOf(Value const *value)
Definition: json.h:287
JsonNumber(FloatT value)
Definition: json.h:271
void Save(JsonWriter *writer) const override
Json & operator[](int ind) override
Definition: json.h:239
Map const & GetObject() &&
Definition: json.h:242
JsonObject(JsonObject &&that) noexcept
void Save(JsonWriter *writer) const override
Map const & GetObject() const &
Definition: json.h:243
Json & operator[](std::string const &key) override
Definition: json.h:240
bool operator==(Value const &rhs) const override
~JsonObject() override=default
std::map< std::string, Json, std::less<> > Map
Definition: json.h:225
Value & operator=(Value const &rhs) override=delete
Map & GetObject() &
Definition: json.h:244
JsonObject(JsonObject const &that)=delete
static bool IsClassOf(Value const *value)
Definition: json.h:249
JsonObject()
Definition: json.h:231
JsonObject(Map &&object) noexcept
A json reader, currently error checking and utf-8 is not fully supported.
Definition: json_io.h:21
static bool IsClassOf(Value const *value)
Definition: json.h:115
JsonString(std::string &&str) noexcept
Definition: json.h:100
void Save(JsonWriter *writer) const override
std::string const & GetString() &&
Definition: json.h:108
std::string & GetString() &
Definition: json.h:110
bool operator==(Value const &rhs) const override
Value & operator=(Value const &rhs) override=delete
JsonString(std::string const &str)
Definition: json.h:98
JsonString(JsonString &&str) noexcept
Definition: json.h:102
std::string const & GetString() const &
Definition: json.h:109
JsonString()
Definition: json.h:97
Typed array for Universal Binary JSON.
Definition: json.h:157
void Set(size_t i, T v)
Definition: json.h:170
T value_type
Definition: json.h:161
std::vector< T > & GetArray() &
Definition: json.h:177
std::vector< T > const & GetArray() &&
Definition: json.h:175
size_t Size() const
Definition: json.h:171
void Save(JsonWriter *writer) const override
bool operator==(Value const &rhs) const override
JsonTypedArray(std::size_t n)
Definition: json.h:164
Value & operator=(Value const &rhs) override=delete
static bool IsClassOf(Value const *value)
Definition: json.h:179
JsonTypedArray(JsonTypedArray &&that) noexcept
Definition: json.h:165
JsonTypedArray()
Definition: json.h:163
std::vector< T > const & GetArray() const &
Definition: json.h:176
Definition: json_io.h:111
Data structure representing JSON format.
Definition: json.h:396
Json & operator=(JsonNumber number)
Definition: json.h:431
Json(JsonNull null)
Definition: json.h:476
Json & operator=(JsonTypedArray< T, kind > &&array)
Definition: json.h:452
Json & operator=(JsonString &&str)
Definition: json.h:464
Json & operator[](std::string const &key) const
Index Json object with a std::string, used for Json Object.
Definition: json.h:494
Json(JsonArray &&list)
Definition: json.h:442
Json(JsonObject &&object)
Definition: json.h:457
static void Dump(Json json, std::vector< char > *out, std::ios::openmode mode=std::ios::out)
Json(Json &&other) noexcept
Definition: json.h:487
Json(Json const &other)=default
Value const & GetValue() const &
Return the reference to stored Json value.
Definition: json.h:499
Json & operator=(Json const &other)=default
Json(JsonString &&str)
Definition: json.h:463
Json(JsonInteger integer)
Definition: json.h:436
Json & operator[](int ind) const
Index Json object with int, used for Json Array.
Definition: json.h:496
Json & operator=(JsonObject &&object)
Definition: json.h:458
Json & operator=(JsonArray &&array)
Definition: json.h:443
friend std::ostream & operator<<(std::ostream &os, Json const &j)
Definition: json.h:507
Json & operator=(JsonInteger integer)
Definition: json.h:437
Json & operator=(JsonBoolean boolean)
Definition: json.h:471
static Json Load(JsonReader *reader)
Pass your own JsonReader.
Json(JsonBoolean boolean)
Definition: json.h:469
IntrusivePtr< Value > const & Ptr() const
Definition: json.h:514
Json(JsonTypedArray< T, kind > &&list)
Definition: json.h:449
Json(JsonNumber number)
Definition: json.h:430
Json & operator=(JsonNull null)
Definition: json.h:478
static Container Dump(Json json)
Definition: json.h:415
bool operator==(Json const &rhs) const
Definition: json.h:503
static void Dump(Json json, JsonWriter *writer)
Use your own JsonWriter.
Json & operator=(Json &&other) noexcept
Definition: json.h:488
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:500
Value & GetValue() &
Definition: json.h:501
virtual Value & operator=(Value const &rhs)=delete
virtual bool operator==(Value const &rhs) const =0
Value(ValueKind _kind)
Definition: json.h:59
ValueKind
Simplified implementation of LLVM RTTI.
Definition: json.h:38
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:61
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
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:295
std::enable_if_t< std::is_same_v< T, double > > IsF64T
Definition: json.h:258
std::enable_if_t< std::is_same_v< std::remove_cv_t< T >, std::remove_cv_t< U > >> IsSameT
Definition: json.h:255
JsonNumber::Float & GetImpl(T &val)
Definition: json.h:538
Learner interface that integrates objective, gbm and evaluation together. This is the user facing XGB...
Definition: base.h:89
std::vector< std::pair< std::string, std::string > > Args
Definition: base.h:306
bool IsA(Value const *value)
Definition: json.h:79
auto get(U &json) -> decltype(detail::GetImpl(*Cast< T >(&json.GetValue())))&
Get Json value.
Definition: json.h:617
T * Cast(U *value)
Definition: json.h:84
Object ToJson(Parameter const ¶m)
Convert XGBoost parameter to JSON object.
Definition: json.h:640
Args FromJson(Json const &obj, Parameter *param)
Load a XGBoost parameter from a JSON object.
Definition: json.h:659
macro for using C++11 enum class as DMLC parameter
Definition: string_view.h:16