Go to the documentation of this file.
4 #ifndef XGBOOST_JSON_H_
5 #define XGBOOST_JSON_H_
7 #include <xgboost/logging.h>
47 virtual ~Value() =
default;
65 return T::IsClassOf(value);
68 template <
typename T,
typename U>
71 return dynamic_cast<T*
>(value);
73 LOG(FATAL) <<
"Invalid cast, from " + value->TypeStr() +
" to " + T().TypeStr();
75 return dynamic_cast<T*
>(value);
90 void Save(JsonWriter* writer)
override;
92 Json&
operator[](std::string
const & key)
override;
96 std::string
const&
GetString() const & {
return str_; }
108 std::vector<Json> vec_;
119 void Save(JsonWriter* writer)
override;
121 Json&
operator[](std::string
const & key)
override;
124 std::vector<Json>
const&
GetArray() && {
return vec_; }
125 std::vector<Json>
const&
GetArray() const & {
return vec_; }
137 std::map<std::string, Json> object_;
141 JsonObject(std::map<std::string, Json>&&
object) noexcept;
150 std::map<std::string, Json>
const&
GetObject() && {
return object_; }
151 std::map<std::string, Json>
const&
GetObject() const & {
return object_; }
152 std::map<std::string, Json> &
GetObject() & {
return object_; }
172 template <
typename FloatT,
173 typename std::enable_if<std::is_same<FloatT, Float>::value>::type* =
nullptr>
177 template <
typename FloatT,
178 typename std::enable_if<std::is_same<FloatT, double>::value>::type* =
nullptr>
180 number_{
static_cast<Float>(value)} {}
184 void Save(JsonWriter* writer)
override;
186 Json&
operator[](std::string
const & key)
override;
211 template <
typename IntT,
212 typename std::enable_if<std::is_same<IntT, Int>::value>::type* =
nullptr>
214 template <
typename IntT,
215 typename std::enable_if<std::is_same<IntT, size_t>::value>::type* =
nullptr>
217 integer_{
static_cast<Int>(value)} {}
218 template <
typename IntT,
219 typename std::enable_if<std::is_same<IntT, int32_t>::value>::type* =
nullptr>
221 integer_{
static_cast<Int>(value)} {}
222 template <
typename IntT,
223 typename std::enable_if<
224 std::is_same<IntT, uint32_t>::value &&
225 !std::is_same<std::size_t, uint32_t>::value>::type * =
nullptr>
228 integer_{
static_cast<Int>(value)} {}
233 Json&
operator[](std::string
const & key)
override;
270 bool boolean_ =
false;
275 template <
typename Bool,
276 typename std::enable_if<
277 std::is_same<Bool, bool>::value ||
278 std::is_same<Bool, bool const>::value>::type* =
nullptr>
284 void Save(JsonWriter* writer)
override;
286 Json&
operator[](std::string
const & key)
override;
304 using Traits = std::char_traits<CharT>;
311 explicit StringView(std::string
const& str): str_{str.c_str()}, size_{str.size()} {}
312 explicit StringView(CharT
const* str) : str_{str}, size_{Traits::length(str)} {}
315 CharT
const&
at(
size_t p)
const {
319 size_t size()
const {
return size_; }
324 std::string
substr(
size_t beg,
size_t n)
const {
325 CHECK_LE(beg, size_);
326 return std::string {str_ + beg, n < (size_ - beg) ? n : (size_ - beg)};
328 CharT
const*
c_str()
const {
return str_; }
330 CharT
const*
cbegin()
const {
return str_; }
331 CharT
const*
cend()
const {
return str_ +
size(); }
332 CharT
const*
begin()
const {
return str_; }
333 CharT
const*
end()
const {
return str_ +
size(); }
336 std::ostream &
operator<<(std::ostream &os, StringView
const v);
363 static void Dump(
Json json, std::string* out);
370 ptr_.reset(
new JsonNumber(std::move(number)));
385 ptr_.reset(
new JsonArray(std::move(array)));
393 ptr_.reset(
new JsonObject(std::move(
object)));
412 ptr_{
new JsonNull(std::move(
null))} {}
414 ptr_.reset(
new JsonNull(std::move(
null)));
439 return *ptr_ == *(rhs.ptr_);
453 template <
typename T>
462 template <
typename T,
463 typename std::enable_if<
464 std::is_same<T, JsonNumber>::value>::type* =
nullptr>
466 return val.GetNumber();
468 template <
typename T,
469 typename std::enable_if<
470 std::is_same<T, JsonNumber const>::value>::type* =
nullptr>
472 return val.GetNumber();
476 template <
typename T,
477 typename std::enable_if<
478 std::is_same<T, JsonInteger>::value>::type* =
nullptr>
480 return val.GetInteger();
482 template <
typename T,
483 typename std::enable_if<
484 std::is_same<T, JsonInteger const>::value>::type* =
nullptr>
486 return val.GetInteger();
490 template <
typename T,
491 typename std::enable_if<
492 std::is_same<T, JsonString>::value>::type* =
nullptr>
494 return val.GetString();
496 template <
typename T,
497 typename std::enable_if<
498 std::is_same<T, JsonString const>::value>::type* =
nullptr>
500 return val.GetString();
504 template <
typename T,
505 typename std::enable_if<
506 std::is_same<T, JsonBoolean>::value>::type* =
nullptr>
508 return val.GetBoolean();
510 template <
typename T,
511 typename std::enable_if<
512 std::is_same<T, JsonBoolean const>::value>::type* =
nullptr>
514 return val.GetBoolean();
518 template <
typename T,
519 typename std::enable_if<
520 std::is_same<T, JsonArray>::value>::type* =
nullptr>
522 return val.GetArray();
524 template <
typename T,
525 typename std::enable_if<
526 std::is_same<T, JsonArray const>::value>::type* =
nullptr>
528 return val.GetArray();
532 template <
typename T,
533 typename std::enable_if<
534 std::is_same<T, JsonObject>::value>::type* =
nullptr>
535 std::map<std::string, Json>&
GetImpl(T& val) {
536 return val.GetObject();
538 template <
typename T,
539 typename std::enable_if<
540 std::is_same<T, JsonObject const>::value>::type* =
nullptr>
541 std::map<std::string, Json>
const&
GetImpl(T& val) {
542 return val.GetObject();
555 template <
typename T,
typename U>
557 auto& value = *Cast<T>(&json.GetValue());
570 template <
typename Parameter>
573 for (
auto const& kv : param.__DICT__()) {
574 obj[kv.first] = kv.second;
579 template <
typename Parameter>
581 auto const& j_param = get<Object const>(obj);
582 std::map<std::string, std::string> m;
583 for (
auto const& kv : j_param) {
584 m[kv.first] = get<String const>(kv.second);
586 return param->UpdateAllowUnknown(m);
589 #endif // XGBOOST_JSON_H_
void Save(JsonWriter *writer) override
Describes both true and false.
Definition: json.h:269
Args FromJson(Json const &obj, Parameter *param)
Definition: json.h:580
Implementation of Intrusive Pointer. A smart pointer that points to an object with an embedded refere...
Definition: intrusive_ptr.h:72
Json & operator=(JsonBoolean boolean)
Definition: json.h:406
Json & operator[](std::string const &key) const
Index Json object with a std::string, used for Json Object.
Definition: json.h:429
Json & operator=(JsonNumber number)
Definition: json.h:369
Float & GetNumber() &
Definition: json.h:191
JsonInteger(JsonInteger &&that) noexcept
Definition: json.h:230
std::vector< std::pair< std::string, std::string > > Args
Definition: base.h:265
void Save(JsonWriter *writer) override
JsonNumber::Float & GetImpl(T &val)
Definition: json.h:465
Value & operator=(Value const &rhs) override
JsonBoolean(JsonBoolean &&value) noexcept
Definition: json.h:281
void Save(JsonWriter *writer) override
static bool IsClassOf(Value const *value)
Definition: json.h:296
std::vector< Json > & GetArray() &
Definition: json.h:126
CharT const & operator[](size_t p) const
Definition: json.h:314
JsonInteger()
Definition: json.h:210
Value & operator=(Value const &rhs) override
Value & operator=(Value const &rhs) override
static bool IsClassOf(Value const *value)
Definition: json.h:157
StringView(CharT const *str, size_t size)
Definition: json.h:310
void swap(xgboost::IntrusivePtr< T > &x, xgboost::IntrusivePtr< T > &y) noexcept
Definition: intrusive_ptr.h:208
JsonString(std::string &&str) noexcept
Definition: json.h:85
static void Dump(Json json, std::string *out)
ValueKind
Simplified implementation of LLVM RTTI.
Definition: json.h:34
macro for using C++11 enum class as DMLC parameter
JsonNull(JsonNull &&) noexcept
Definition: json.h:253
StringView(CharT const *str)
Definition: json.h:312
virtual bool operator==(Value const &rhs) const =0
Json & operator[](std::string const &key) override
std::string & GetString() &
Definition: json.h:97
Json(JsonBoolean boolean)
Definition: json.h:404
bool operator==(Value const &rhs) const override
std::string TypeStr() const
Json & operator=(JsonObject object)
Definition: json.h:392
bool operator==(Value const &rhs) const override
float Float
Definition: json.h:165
bool operator==(Json const &rhs) const
Definition: json.h:438
virtual Json & operator[](std::string const &key)=0
std::string substr(size_t beg, size_t n) const
Definition: json.h:324
std::map< std::string, Json > const & GetObject() const &
Definition: json.h:151
Value const & GetValue() const &
Return the reference to stored Json value.
Definition: json.h:434
Json & operator[](std::string const &key) override
std::basic_ostream< E, T > & operator<<(std::basic_ostream< E, T > &os, IntrusivePtr< Y > const &p)
Definition: intrusive_ptr.h:199
Implementation of Intrusive Ptr.
int64_t Int
Definition: json.h:204
CharT const * cend() const
Definition: json.h:331
CharT const * cbegin() const
Definition: json.h:330
Json & operator[](std::string const &key) override
Int const & GetInteger() &&
Definition: json.h:239
bool operator==(Value const &rhs) const override
Json & operator=(JsonArray array)
Definition: json.h:384
Json & operator=(JsonNull null)
Definition: json.h:413
JsonNull(std::nullptr_t)
Definition: json.h:252
void Save(JsonWriter *writer) override
JsonArray(std::vector< Json > const &arr)
Definition: json.h:114
Json(JsonNull null)
Definition: json.h:411
bool operator==(Value const &rhs) const override
Value & operator=(Value const &rhs) override
virtual Value & operator=(Value const &rhs)=0
bool const & GetBoolean() const &
Definition: json.h:290
bool operator==(Value const &rhs) const override
static bool IsClassOf(Value const *value)
Definition: json.h:197
virtual void Save(JsonWriter *writer)=0
std::string const & GetString() const &
Definition: json.h:96
JsonNumber()
Definition: json.h:171
Json(JsonString str)
Definition: json.h:397
bool & GetBoolean() &
Definition: json.h:291
Json(JsonNumber number)
Definition: json.h:368
Json(JsonObject object)
Definition: json.h:390
Json & operator[](int ind) const
Index Json object with int, used for Json Array.
Definition: json.h:431
Value const & GetValue() &&
Definition: json.h:435
Float const & GetNumber() const &
Definition: json.h:190
Json(Json &&other) noexcept
Definition: json.h:422
void Save(JsonWriter *writer) override
Value & operator=(Value const &rhs) override
JsonString(std::string const &str)
Definition: json.h:83
Value(ValueKind _kind)
Definition: json.h:44
Int & GetInteger() &
Definition: json.h:241
Json & operator[](std::string const &key) override
CharT const & at(size_t p) const
Definition: json.h:315
T * Cast(U *value)
Definition: json.h:69
bool operator==(Value const &rhs) const override
Value & operator=(Value const &rhs) override
friend IntrusivePtrCell & IntrusivePtrRefCount(xgboost::Value const *t) noexcept
Definition: json.h:28
bool const & GetBoolean() &&
Definition: json.h:289
bool operator==(Value const &rhs) const override
Json & operator[](std::string const &key) override
static bool IsClassOf(Value const *value)
Definition: json.h:244
JsonBoolean()
Definition: json.h:273
JsonArray()
Definition: json.h:111
Json(JsonArray list)
Definition: json.h:382
Helper class for embedding reference counting into client objects. See https://www....
Definition: intrusive_ptr.h:19
JsonObject()
Definition: json.h:140
JsonString(JsonString &&str) noexcept
Definition: json.h:87
void Save(JsonWriter *writer) override
static bool IsClassOf(Value const *value)
Definition: json.h:102
std::string const & GetString() &&
Definition: json.h:95
Json(JsonInteger integer)
Definition: json.h:375
std::vector< Json > const & GetArray() &&
Definition: json.h:124
JsonBoolean(Bool value)
Definition: json.h:279
JsonNumber(FloatT value)
Definition: json.h:174
static Json Load(StringView str)
Load a Json object from string.
Json & operator=(Json &&other) noexcept
Definition: json.h:423
Json & operator[](std::string const &key) override
Int const & GetInteger() const &
Definition: json.h:240
JsonNumber(JsonNumber &&that) noexcept
Definition: json.h:182
std::map< std::string, Json > const & GetObject() &&
Definition: json.h:150
JsonInteger(IntT value)
Definition: json.h:213
CharT const * end() const
Definition: json.h:333
Value & GetValue() &
Definition: json.h:436
Json & operator[](std::string const &key) override
ValueKind Type() const
Definition: json.h:46
Float const & GetNumber() &&
Definition: json.h:189
JsonArray(std::vector< Json > &&arr) noexcept
Definition: json.h:112
JsonString()
Definition: json.h:82
Value & operator=(Value const &rhs) override
JsonNull()
Definition: json.h:251
friend std::ostream & operator<<(std::ostream &os, Json const &j)
Definition: json.h:442
Json & operator=(JsonString str)
Definition: json.h:399
Object ToJson(Parameter const ¶m)
Definition: json.h:571
void Save(JsonWriter *writer) override
Json & operator=(JsonInteger integer)
Definition: json.h:376
CharT const * c_str() const
Definition: json.h:328
Definition: json_io.h:115
static bool IsClassOf(Value const *value)
Definition: json.h:263
Data structure representing JSON format.
Definition: json.h:355
static bool IsClassOf(Value const *value)
Definition: json.h:131
bool IsA(Value const *value)
Definition: json.h:64
auto get(U &json) -> decltype(detail::GetImpl(*Cast< T >(&json.GetValue())))&
Get Json value.
Definition: json.h:556
size_t size() const
Definition: json.h:319
~JsonObject() override=default
std::vector< Json > const & GetArray() const &
Definition: json.h:125
Json()
Definition: json.h:365
StringView(std::string const &str)
Definition: json.h:311
std::map< std::string, Json > & GetObject() &
Definition: json.h:152
namespace of xgboost
Definition: base.h:110
CharT const * begin() const
Definition: json.h:332