10#include <xgboost/string_view.h>
54 virtual ~Value() =
default;
56 virtual void Save(JsonWriter* writer)
const = 0;
58 virtual Json& operator[](std::string
const& key);
59 virtual Json& operator[](
int ind);
61 virtual bool operator==(Value
const& rhs)
const = 0;
62#if !defined(__APPLE__)
63 virtual Value& operator=(Value
const& rhs) =
delete;
66 std::string TypeStr()
const;
73bool IsA(Value
const* value) {
74 return T::IsClassOf(value);
77template <
typename T,
typename U>
80 return dynamic_cast<T*
>(value);
82 LOG(FATAL) <<
"Invalid cast, from " + value->TypeStr() +
" to " + T().TypeStr();
84 return dynamic_cast<T*
>(value);
93 Value(ValueKind::kString), str_{str} {}
95 Value(ValueKind::kString), str_{std::forward<std::string>(str)} {}
102 std::string
const& GetString() && {
return str_; }
103 std::string
const& GetString()
const & {
return str_; }
104 std::string& GetString() & {
return str_; }
106 bool operator==(
Value const& rhs)
const override;
108 static bool IsClassOf(
Value const* value) {
109 return value->Type() == ValueKind::kString;
114 std::vector<Json> vec_;
118 JsonArray(std::vector<Json>&& arr)
noexcept
119 :
Value(ValueKind::kArray), vec_{std::forward<std::vector<Json>>(arr)} {}
120 JsonArray(std::vector<Json>
const& arr) :
121 Value(ValueKind::kArray), vec_{arr} {}
127 Json& operator[](
int ind)
override {
return vec_.at(ind); }
129 Json& operator[](std::string
const& key)
override {
return Value::operator[](key); }
131 std::vector<Json>
const& GetArray() && {
return vec_; }
132 std::vector<Json>
const& GetArray()
const & {
return vec_; }
133 std::vector<Json>& GetArray() & {
return vec_; }
135 bool operator==(
Value const& rhs)
const override;
137 static bool IsClassOf(
Value const* value) {
138 return value->Type() == ValueKind::kArray;
148template <
typename T, Value::ValueKind kind>
159 bool operator==(
Value const& rhs)
const override;
161 void Set(
size_t i, T v) { vec_[i] = v; }
162 size_t Size()
const {
return vec_.size(); }
166 std::vector<T>
const& GetArray() && {
return vec_; }
167 std::vector<T>
const& GetArray()
const& {
return vec_; }
168 std::vector<T>& GetArray() & {
return vec_; }
170 static bool IsClassOf(
Value const* value) {
return value->Type() == kind; }
192 using Map = std::map<std::string, Json, std::less<>>;
206 Json& operator[](
int ind)
override {
return Value::operator[](ind); }
207 Json& operator[](std::string
const& key)
override {
return object_[key]; }
209 Map
const& GetObject() && {
return object_; }
210 Map
const& GetObject()
const& {
return object_; }
211 Map& GetObject() & {
return object_; }
213 bool operator==(
Value const& rhs)
const override;
215 static bool IsClassOf(
Value const* value) {
return value->Type() == ValueKind::kObject; }
228 template <
typename FloatT,
229 typename std::enable_if<std::is_same<FloatT, Float>::value>::type* =
nullptr>
233 template <
typename FloatT,
234 typename std::enable_if<std::is_same<FloatT, double>::value>::type* =
nullptr>
236 number_{
static_cast<Float
>(value)} {}
242 Float
const& GetNumber() && {
return number_; }
243 Float
const& GetNumber()
const & {
return number_; }
244 Float& GetNumber() & {
return number_; }
246 bool operator==(
Value const& rhs)
const override;
248 static bool IsClassOf(
Value const* value) {
249 return value->Type() == ValueKind::kNumber;
262 template <
typename IntT,
263 typename std::enable_if<std::is_same<IntT, Int>::value>::type* =
nullptr>
265 template <
typename IntT,
266 typename std::enable_if<std::is_same<IntT, size_t>::value>::type* =
nullptr>
268 integer_{
static_cast<Int
>(value)} {}
269 template <
typename IntT,
270 typename std::enable_if<std::is_same<IntT, int32_t>::value>::type* =
nullptr>
272 integer_{
static_cast<Int
>(value)} {}
273 template <
typename IntT,
274 typename std::enable_if<
275 std::is_same<IntT, uint32_t>::value &&
276 !std::is_same<std::size_t, uint32_t>::value>::type * =
nullptr>
278 :
Value(ValueKind::kInteger),
279 integer_{
static_cast<Int
>(value)} {}
282 :
Value{ValueKind::kInteger}, integer_{that.integer_} {}
284 bool operator==(
Value const& rhs)
const override;
286 Int
const& GetInteger() && {
return integer_; }
287 Int
const& GetInteger()
const & {
return integer_; }
288 Int& GetInteger() & {
return integer_; }
291 static bool IsClassOf(
Value const* value) {
292 return value->Type() == ValueKind::kInteger;
304 bool operator==(
Value const& rhs)
const override;
306 static bool IsClassOf(
Value const* value) {
307 return value->Type() == ValueKind::kNull;
313 bool boolean_ =
false;
318 template <
typename Bool,
319 typename std::enable_if<
320 std::is_same<Bool, bool>::value ||
321 std::is_same<Bool, bool const>::value>::type* =
nullptr>
323 Value(ValueKind::kBoolean), boolean_{value} {}
325 Value(ValueKind::kBoolean), boolean_{value.boolean_} {}
329 bool const& GetBoolean() && {
return boolean_; }
330 bool const& GetBoolean()
const & {
return boolean_; }
331 bool& GetBoolean() & {
return boolean_; }
333 bool operator==(
Value const& rhs)
const override;
335 static bool IsClassOf(
Value const* value) {
336 return value->Type() == ValueKind::kBoolean;
370 static void Dump(
Json json, std::string* out, std::ios::openmode mode = std::ios::out);
371 static void Dump(
Json json, std::vector<char>* out, std::ios::openmode mode = std::ios::out);
380 ptr_.reset(
new JsonNumber(std::move(number)));
392 ptr_.reset(
new JsonArray(std::forward<JsonArray>(array)));
396 template <
typename T, Value::ValueKind kind>
399 template <
typename T, Value::ValueKind kind>
407 ptr_.reset(
new JsonObject(std::forward<JsonObject>(
object)));
413 ptr_.reset(
new JsonString(std::forward<JsonString>(str)));
425 ptr_{
new JsonNull(std::move(null))} {}
427 ptr_.reset(
new JsonNull(std::move(null)));
433 Json& operator=(
Json const& other) =
default;
436 Json &operator=(
Json &&other)
noexcept {
449 Value&
GetValue() & {
return *ptr_; }
451 bool operator==(Json
const& rhs)
const {
452 return *ptr_ == *(rhs.ptr_);
455 friend std::ostream& operator<<(std::ostream& os, Json
const& j) {
462 IntrusivePtr<Value>
const& Ptr()
const {
return ptr_; }
465 IntrusivePtr<Value> ptr_{
new JsonNull};
486 typename std::enable_if<
487 std::is_same<T, JsonNumber>::value>::type* =
nullptr>
488JsonNumber::Float& GetImpl(T& val) {
489 return val.GetNumber();
492 typename std::enable_if<
493 std::is_same<T, JsonNumber const>::value>::type* =
nullptr>
494JsonNumber::Float
const& GetImpl(T& val) {
495 return val.GetNumber();
500 typename std::enable_if<
501 std::is_same<T, JsonInteger>::value>::type* =
nullptr>
502JsonInteger::Int& GetImpl(T& val) {
503 return val.GetInteger();
506 typename std::enable_if<
507 std::is_same<T, JsonInteger const>::value>::type* =
nullptr>
508JsonInteger::Int
const& GetImpl(T& val) {
509 return val.GetInteger();
514 typename std::enable_if<
515 std::is_same<T, JsonString>::value>::type* =
nullptr>
516std::string& GetImpl(T& val) {
517 return val.GetString();
520 typename std::enable_if<
521 std::is_same<T, JsonString const>::value>::type* =
nullptr>
522std::string
const& GetImpl(T& val) {
523 return val.GetString();
528 typename std::enable_if<
529 std::is_same<T, JsonBoolean>::value>::type* =
nullptr>
530bool& GetImpl(T& val) {
531 return val.GetBoolean();
534 typename std::enable_if<
535 std::is_same<T, JsonBoolean const>::value>::type* =
nullptr>
536bool const& GetImpl(T& val) {
537 return val.GetBoolean();
542 typename std::enable_if<
543 std::is_same<T, JsonArray>::value>::type* =
nullptr>
544std::vector<Json>& GetImpl(T& val) {
545 return val.GetArray();
548 typename std::enable_if<
549 std::is_same<T, JsonArray const>::value>::type* =
nullptr>
550std::vector<Json>
const& GetImpl(T& val) {
551 return val.GetArray();
555template <
typename T, Value::ValueKind kind>
556std::vector<T>& GetImpl(JsonTypedArray<T, kind>& val) {
557 return val.GetArray();
559template <
typename T, Value::ValueKind kind>
560std::vector<T>
const& GetImpl(JsonTypedArray<T, kind>
const& val) {
561 return val.GetArray();
565template <typename T, typename std::enable_if<std::is_same<T, JsonObject>::value>::type* =
nullptr>
566JsonObject::Map& GetImpl(T& val) {
567 return val.GetObject();
570 typename std::enable_if<std::is_same<T, JsonObject const>::value>::type* =
nullptr>
571JsonObject::Map
const& GetImpl(T& val) {
572 return val.GetObject();
584template <
typename T,
typename U>
585auto get(U& json) ->
decltype(detail::GetImpl(*Cast<T>(&json.GetValue())))& {
586 auto& value = *Cast<T>(&json.GetValue());
587 return detail::GetImpl(value);
590using Object = JsonObject;
591using Array = JsonArray;
592using Number = JsonNumber;
593using Integer = JsonInteger;
594using Boolean = JsonBoolean;
595using String = JsonString;
596using Null = JsonNull;
600template <
typename Head>
601bool TypeCheckImpl(Json
const& value) {
602 return IsA<Head>(value);
605template <
typename Head,
typename... JT>
606std::enable_if_t<
sizeof...(JT) != 0,
bool> TypeCheckImpl(Json
const& value) {
607 return IsA<Head>(value) || TypeCheckImpl<JT...>(value);
610template <
typename Head>
611std::string TypeCheckError() {
612 return "`" + Head{}.TypeStr() +
"`";
615template <
typename Head,
typename... JT>
616std::enable_if_t<
sizeof...(JT) != 0, std::string> TypeCheckError() {
617 return "`" + Head{}.TypeStr() +
"`, " + TypeCheckError<JT...>();
627template <
typename... JT>
629 if (!detail::TypeCheckImpl<JT...>(value)) {
630 LOG(FATAL) <<
"Invalid type for: `" << name <<
"`, expecting one of the: {`"
631 << detail::TypeCheckError<JT...>() <<
"}, got: `" << value.GetValue().TypeStr()
645template <
typename Parameter>
648 for (
auto const& kv : param.__DICT__()) {
649 obj[kv.first] = kv.second;
664template <
typename Parameter>
666 auto const& j_param = get<Object const>(obj);
668 for (
auto const& kv : j_param) {
669 args.emplace_back(kv.first, get<String const>(kv.second));
671 return param->UpdateAllowUnknown(args);
Helper class for embedding reference counting into client objects. See https://www....
Definition intrusive_ptr.h:20
Describes both true and false.
Definition json.h:312
A json reader, currently error checking and utf-8 is not fully supported.
Definition json_io.h:23
Typed array for Universal Binary JSON.
Definition json.h:149
Data structure representing JSON format.
Definition json.h:357
Json & operator[](int ind) const
Index Json object with int, used for Json Array.
Definition json.h:444
static Json Load(StringView str, std::ios::openmode mode=std::ios::in)
Decode the JSON object.
Definition json.cc:652
Json & operator[](std::string const &key) const
Index Json object with a std::string, used for Json Object.
Definition json.h:442
static void Dump(Json json, std::string *out, std::ios::openmode mode=std::ios::out)
Encode the JSON object.
Definition json.cc:669
Value const & GetValue() const &
Return the reference to stored Json value.
Definition json.h:447
ValueKind
Simplified implementation of LLVM RTTI.
Definition json.h:36
defines console logging options for xgboost. Use to enforce unified print behavior.
macro for using C++11 enum class as DMLC parameter
Implementation of Intrusive Ptr.
detail namespace with internal helper functions
Definition json.hpp:249
NLOHMANN_BASIC_JSON_TPL_DECLARATION void swap(nlohmann::NLOHMANN_BASIC_JSON_TPL &j1, nlohmann::NLOHMANN_BASIC_JSON_TPL &j2) noexcept(//NOLINT(readability-inconsistent-declaration-parameter-name, cert-dcl58-cpp) is_nothrow_move_constructible< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value &&//NOLINT(misc-redundant-expression) is_nothrow_move_assignable< nlohmann::NLOHMANN_BASIC_JSON_TPL >::value)
exchanges the values of two JSON objects
Definition json.hpp:24418
namespace of xgboost
Definition base.h:90
void TypeCheck(Json const &value, StringView name)
Type check for JSON-based parameters.
Definition json.h:628
auto get(U &json) -> decltype(detail::GetImpl(*Cast< T >(&json.GetValue())))&
Get Json value.
Definition json.h:585
Object ToJson(Parameter const ¶m)
Convert XGBoost parameter to JSON object.
Definition json.h:646
Args FromJson(Json const &obj, Parameter *param)
Load a XGBoost parameter from a JSON object.
Definition json.h:665
Definition string_view.h:15