4#ifndef XGBOOST_JSON_IO_H_
5#define XGBOOST_JSON_IO_H_
8#include <xgboost/json.h>
25 using Char = std::int8_t;
28 size_t constexpr static kMaxNumLength = std::numeric_limits<double>::max_digits10 + 1;
36 size_t Pos()
const {
return pos_; }
38 void Forward() { pos_++; }
39 void Forward(uint32_t n) { pos_ += n; }
48 if (XGBOOST_EXPECT((cursor_.Pos() == raw_str_.size()),
false)) {
51 char ch = raw_str_[cursor_.Pos()];
57 if (cursor_.Pos() == raw_str_.size()) {
60 Char ch = raw_str_[cursor_.Pos()];
65 Char GetNextNonSpaceChar() {
72 Char GetConsecutiveChar(
char expected_char) {
73 Char result = GetNextChar();
74 if (XGBOOST_EXPECT(result != expected_char,
false)) { Expect(expected_char, result); }
78 void Error(std::string msg)
const;
81 void Expect(Char c, Char got) {
82 std::string msg =
"Expecting: \"";
87 }
else if (got == 0) {
90 msg += std::to_string(got) +
" \"";
95 virtual Json ParseString();
96 virtual Json ParseObject();
97 virtual Json ParseArray();
98 virtual Json ParseNumber();
99 virtual Json ParseBoolean();
100 virtual Json ParseNull();
105 explicit JsonReader(StringView str) :
108 virtual ~JsonReader() =
default;
114 template <typename T, std::enable_if_t<!std::is_same<Json, T>::value>* =
nullptr>
115 void Save(T
const& v) {
118 template <
typename Array,
typename Fn>
119 void WriteArray(
Array const* arr, Fn&& fn) {
120 stream_->emplace_back(
'[');
121 auto const& vec = arr->GetArray();
122 size_t size = vec.size();
123 for (
size_t i = 0; i < size; ++i) {
124 auto const& value = vec[i];
125 this->Save(fn(value));
127 stream_->emplace_back(
',');
130 stream_->emplace_back(
']');
134 std::vector<char>* stream_;
137 explicit JsonWriter(std::vector<char>* stream) : stream_{stream} {}
141 virtual void Save(
Json json);
143 virtual void Visit(
JsonArray const* arr);
144 virtual void Visit(
F32Array const* arr);
145 virtual void Visit(
U8Array const* arr);
146 virtual void Visit(
I32Array const* arr);
147 virtual void Visit(
I64Array const* arr);
151 virtual void Visit(
JsonNull const* null);
156#if defined(__GLIBC__)
161inline uint16_t BuiltinBSwap(uint16_t v) {
162 return __builtin_bswap16(v);
166inline uint32_t BuiltinBSwap(uint32_t v) {
167 return __builtin_bswap32(v);
171inline uint64_t BuiltinBSwap(uint64_t v) {
172 return __builtin_bswap64(v);
182template <
typename T, std::enable_if_t<sizeof(T) == 1>* =
nullptr>
183inline T ToBigEndian(T v) {
187template <
typename T, std::enable_if_t<sizeof(T) != 1>* =
nullptr>
188inline T ToBigEndian(T v) {
189 static_assert(std::is_pod<T>::value,
"Only pod is supported.");
190#if DMLC_LITTLE_ENDIAN
191 auto constexpr kS =
sizeof(T);
192 std::conditional_t<kS == 2, uint16_t, std::conditional_t<kS == 4, uint32_t, uint64_t>> u;
193 std::memcpy(&u, &v,
sizeof(u));
195 std::memcpy(&v, &u,
sizeof(u));
206 template <
typename T>
208 auto ptr = this->raw_str_.c_str() + cursor_.Pos();
210 std::memcpy(&v, ptr,
sizeof(v));
211 cursor_.Forward(
sizeof(v));
215 template <
typename T>
217 auto v = ReadStream<T>();
222 template <
typename TypedArray>
223 auto ParseTypedArray(int64_t n) {
224 TypedArray results{
static_cast<size_t>(n)};
225 for (int64_t i = 0; i < n; ++i) {
226 auto v = this->ReadPrimitive<typename TypedArray::Type>();
229 return Json{std::move(results)};
232 std::string DecodeStr();
234 Json ParseArray()
override;
235 Json ParseObject()
override;
238 using JsonReader::JsonReader;
239 Json Load()
override;
246 void Visit(
JsonArray const* arr)
override;
247 void Visit(
F32Array const* arr)
override;
248 void Visit(
U8Array const* arr)
override;
249 void Visit(
I32Array const* arr)
override;
250 void Visit(
I64Array const* arr)
override;
254 void Visit(
JsonNull const* null)
override;
259 using JsonWriter::JsonWriter;
260 void Save(
Json json)
override;
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
Reader for UBJSON https://ubjson.org/.
Definition json_io.h:203
Writer for UBJSON https://ubjson.org/.
Definition json_io.h:245
Endian testing, need c++11.
Copyright 2015-2023 by XGBoost Contributors.
void ByteSwap(void *data, size_t elem_bytes, size_t num_elems)
A generic inplace byte swapping function.
Definition endian.h:51
namespace of xgboost
Definition base.h:90
Definition string_view.h:15