4 #ifndef XGBOOST_JSON_H_ 5 #define XGBOOST_JSON_H_ 7 #include <xgboost/logging.h> 39 virtual ~Value() =
default;
57 return T::isClassOf(value);
60 template <
typename T,
typename U>
63 return dynamic_cast<T*
>(value);
65 LOG(FATAL) <<
"Invalid cast, from " + value->TypeStr() +
" to " + T().TypeStr();
67 return dynamic_cast<T*
>(value);
85 std::string
const&
getString() const & {
return str_; }
97 std::vector<Json> vec_;
113 std::vector<Json>
const&
getArray() && {
return vec_; }
114 std::vector<Json>
const&
getArray() const & {
return vec_; }
126 std::map<std::string, Json> object_;
130 JsonObject(std::map<std::string, Json>&&
object);
139 std::map<std::string, Json>
const&
getObject() && {
return object_; }
140 std::map<std::string, Json>
const&
getObject() const & {
return object_; }
141 std::map<std::string, Json> &
getObject() & {
return object_; }
161 template <
typename FloatT,
162 typename std::enable_if<std::is_same<FloatT, Float>::value>::type* =
nullptr>
166 template <
typename FloatT,
167 typename std::enable_if<std::is_same<FloatT, double>::value>::type* =
nullptr>
169 number_{
static_cast<Float>(value)} {}
198 template <
typename IntT,
199 typename std::enable_if<std::is_same<IntT, Int>::value>::type* =
nullptr>
201 template <
typename IntT,
202 typename std::enable_if<std::is_same<IntT, size_t>::value>::type* =
nullptr>
204 integer_{
static_cast<Int>(value)} {}
205 template <
typename IntT,
206 typename std::enable_if<std::is_same<IntT, int32_t>::value>::type* =
nullptr>
208 integer_{
static_cast<Int>(value)} {}
209 template <
typename IntT,
210 typename std::enable_if<
211 std::is_same<IntT, uint32_t>::value &&
212 !std::is_same<std::size_t, uint32_t>::value>::type * =
nullptr>
215 integer_{
static_cast<Int>(value)} {}
258 template <
typename Bool,
259 typename std::enable_if<
260 std::is_same<Bool, bool>::value ||
261 std::is_same<Bool, bool const>::value>::type* =
nullptr>
296 size_t size()
const {
return size_; }
301 std::string
substr(
size_t beg,
size_t n)
const {
302 CHECK_LE(beg, size_);
303 return std::string {str_ + beg, n < (size_ - beg) ? n : (size_ - beg)};
305 char const*
c_str()
const {
return str_; }
334 static void Dump(
Json json, std::ostream* stream,
335 bool pretty = ConsoleLogger::ShouldLog(
336 ConsoleLogger::LogVerbosity::kDebug));
337 static void Dump(
Json json, std::string* out,
338 bool pretty = ConsoleLogger::ShouldLog(
339 ConsoleLogger::LogVerbosity::kDebug));
346 ptr_.reset(
new JsonNumber(std::move(number)));
361 ptr_.reset(
new JsonArray(std::move(array)));
369 ptr_.reset(
new JsonObject(std::move(
object)));
388 ptr_{
new JsonNull(std::move(null))} {}
390 ptr_.reset(
new JsonNull(std::move(null)));
398 Json(
Json&& other) : ptr_{std::move(other.ptr_)} {}
400 ptr_ = std::move(other.ptr_);
415 return *ptr_ == *(rhs.ptr_);
426 std::shared_ptr<Value> ptr_;
429 template <
typename T>
438 template <
typename T,
439 typename std::enable_if<
440 std::is_same<T, JsonNumber>::value>::type* =
nullptr>
442 return val.getNumber();
444 template <
typename T,
445 typename std::enable_if<
446 std::is_same<T, JsonNumber const>::value>::type* =
nullptr>
448 return val.getNumber();
452 template <
typename T,
453 typename std::enable_if<
454 std::is_same<T, JsonInteger>::value>::type* =
nullptr>
456 return val.getInteger();
458 template <
typename T,
459 typename std::enable_if<
460 std::is_same<T, JsonInteger const>::value>::type* =
nullptr>
462 return val.getInteger();
466 template <
typename T,
467 typename std::enable_if<
468 std::is_same<T, JsonString>::value>::type* =
nullptr>
470 return val.getString();
472 template <
typename T,
473 typename std::enable_if<
474 std::is_same<T, JsonString const>::value>::type* =
nullptr>
476 return val.getString();
480 template <
typename T,
481 typename std::enable_if<
482 std::is_same<T, JsonBoolean>::value>::type* =
nullptr>
484 return val.getBoolean();
486 template <
typename T,
487 typename std::enable_if<
488 std::is_same<T, JsonBoolean const>::value>::type* =
nullptr>
490 return val.getBoolean();
494 template <
typename T,
495 typename std::enable_if<
496 std::is_same<T, JsonArray>::value>::type* =
nullptr>
498 return val.getArray();
500 template <
typename T,
501 typename std::enable_if<
502 std::is_same<T, JsonArray const>::value>::type* =
nullptr>
504 return val.getArray();
508 template <
typename T,
509 typename std::enable_if<
510 std::is_same<T, JsonObject>::value>::type* =
nullptr>
511 std::map<std::string, Json>&
GetImpl(T& val) {
512 return val.getObject();
514 template <
typename T,
515 typename std::enable_if<
516 std::is_same<T, JsonObject const>::value>::type* =
nullptr>
517 std::map<std::string, Json>
const&
GetImpl(T& val) {
518 return val.getObject();
531 template <
typename T,
typename U>
533 auto& value = *Cast<T>(&json.GetValue());
547 template <
typename Parameter>
550 for (
auto const& kv : param.__DICT__()) {
551 obj[kv.first] = kv.second;
556 template <
typename Parameter>
558 auto const& j_param = get<Object const>(obj);
559 std::map<std::string, std::string> m;
560 for (
auto const& kv : j_param) {
561 m[kv.first] = get<String const>(kv.second);
563 param->UpdateAllowUnknown(m);
566 #endif // XGBOOST_JSON_H_ JsonInteger(IntT value)
Definition: json.h:200
virtual void Save(JsonWriter *writer)=0
int64_t Int
Definition: json.h:191
std::map< std::string, Json > & getObject() &
Definition: json.h:141
bool IsA(Value const *value)
Definition: json.h:56
std::map< std::string, Json > const & getObject() const &
Definition: json.h:140
Value const & GetValue() const &
Definition: json.h:410
JsonNumber::Float & GetImpl(T &val)
Definition: json.h:441
std::map< std::string, Json > const & getObject() &&
Definition: json.h:139
Value(ValueKind _kind)
Definition: json.h:36
bool const & getBoolean() &&
Definition: json.h:270
JsonString(std::string const &str)
Definition: json.h:74
static bool isClassOf(Value const *value)
Definition: json.h:228
std::vector< Json > const & getArray() const &
Definition: json.h:114
JsonBoolean()
Definition: json.h:256
Json & operator=(JsonInteger integer)
Definition: json.h:352
static bool isClassOf(Value const *value)
Definition: json.h:91
StringView(CharT const *str, size_t size)
Definition: json.h:289
std::vector< Json > const & getArray() &&
Definition: json.h:113
CharT const & at(size_t p) const
Definition: json.h:292
friend std::ostream & operator<<(std::ostream &os, Json const &j)
Definition: json.h:418
static bool isClassOf(Value const *value)
Definition: json.h:277
CharT const & operator[](size_t p) const
Definition: json.h:291
JsonNull(std::nullptr_t)
Definition: json.h:236
JsonArray(std::vector< Json > const &arr)
Definition: json.h:103
std::string const & getString() const &
Definition: json.h:85
Describes both true and false.
Definition: json.h:252
std::vector< Json > & getArray() &
Definition: json.h:115
size_t size_
Definition: json.h:285
std::string substr(size_t beg, size_t n) const
Definition: json.h:301
Int const & getInteger() const &
Definition: json.h:224
ValueKind Type() const
Definition: json.h:38
Json & operator=(JsonArray array)
Definition: json.h:360
Int & getInteger() &
Definition: json.h:225
JsonArray()
Definition: json.h:100
Json & operator[](int ind) const
Index Json object with int, used for Json Array.
Definition: json.h:407
JsonBoolean(Bool value)
Definition: json.h:262
JsonNull()
Definition: json.h:235
std::map< std::string, Json > const & GetImpl(T &val)
Definition: json.h:517
Float const & getNumber() &&
Definition: json.h:176
void fromJson(Json const &obj, Parameter *param)
Definition: json.h:557
T * Cast(U *value)
Definition: json.h:61
static bool isClassOf(Value const *value)
Definition: json.h:146
Json(JsonInteger integer)
Definition: json.h:351
char CharT
Definition: json.h:283
Object toJson(Parameter const ¶m)
Definition: json.h:548
JsonInteger()
Definition: json.h:197
Float & getNumber() &
Definition: json.h:178
bool const & getBoolean() const &
Definition: json.h:271
Json & operator=(JsonString str)
Definition: json.h:375
Value const & GetValue() &&
Definition: json.h:411
Json & operator=(JsonNumber number)
Definition: json.h:345
size_t size() const
Definition: json.h:296
float Float
Definition: json.h:154
Json & operator=(JsonNull null)
Definition: json.h:389
Json(Json &&other)
Definition: json.h:398
virtual bool operator==(Value const &rhs) const =0
std::string const & getString() &&
Definition: json.h:84
JsonString(std::string &&str)
Definition: json.h:76
ValueKind
Simplified implementation of LLVM RTTI.
Definition: json.h:26
CharT const * str_
Definition: json.h:284
Json(JsonString str)
Definition: json.h:373
Json()
Definition: json.h:341
namespace of xgboost
Definition: base.h:102
Json(JsonArray list)
Definition: json.h:358
Json(Json const &other)
Definition: json.h:395
Float const & getNumber() const &
Definition: json.h:177
JsonArray(std::vector< Json > &&arr)
Definition: json.h:101
Int const & getInteger() &&
Definition: json.h:223
Json(JsonObject object)
Definition: json.h:366
Value & GetValue() &
Definition: json.h:412
std::string & getString() &
Definition: json.h:86
Json & operator=(Json &&other)
Definition: json.h:399
JsonObject()
Definition: json.h:129
bool operator==(Json const &rhs) const
Definition: json.h:414
Definition: json_io.h:119
std::string TypeStr() const
virtual Json & operator[](std::string const &key)=0
Data structure representing JSON format.
Definition: json.h:325
Json & operator[](std::string const &key) const
Index Json object with a std::string, used for Json Object.
Definition: json.h:405
static bool isClassOf(Value const *value)
Definition: json.h:120
char const * c_str() const
Definition: json.h:305
Json & operator=(JsonBoolean boolean)
Definition: json.h:382
JsonNumber(FloatT value)
Definition: json.h:163
static void Dump(Json json, std::ostream *stream, bool pretty=ConsoleLogger::ShouldLog(ConsoleLogger::LogVerbosity::kDebug))
Dump json into stream.
JsonNumber()
Definition: json.h:160
Json(JsonNull null)
Definition: json.h:387
Json & operator=(JsonObject object)
Definition: json.h:368
bool & getBoolean() &
Definition: json.h:272
Json(JsonNumber number)
Definition: json.h:344
static bool isClassOf(Value const *value)
Definition: json.h:246
JsonString()
Definition: json.h:73
Json(JsonBoolean boolean)
Definition: json.h:380
static bool isClassOf(Value const *value)
Definition: json.h:184
virtual Value & operator=(Value const &rhs)=0