16 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 17 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 23 #include "nn/nlib/Swap.h" 27 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 28 #undef NLIB_VIS_PUBLIC 29 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 37 enum Format { kFormatAdaptive = 0, kFormatJson, kFormatMsgpack };
46 token_buffer_size(2048),
48 format(kFormatAdaptive),
114 return Parse(parser, obj, peek,
nullptr);
117 return Parse(parser, obj,
false);
124 return Parse(obj, data, n, settings,
nullptr);
128 return Parse(obj, data, n, settings);
133 if (settings.format == JsonStreamParserSettings::kFormatJson) {
134 return Parse(obj, str, n, settings, detail);
137 settings_.
format = JsonStreamParserSettings::kFormatJson;
138 return Parse(obj, str, n, settings_, detail);
143 return Parse(obj, str, settings,
nullptr);
147 return Parse(obj, str, settings);
149 #ifdef __cpp_rvalue_references 150 static std::pair<errno_t, UniquePtr<MpObject> >
152 static std::pair<errno_t, UniquePtr<MpObject> >
154 return Parse(parser, peek,
nullptr);
157 return Parse(parser,
false);
159 static std::pair<errno_t, UniquePtr<MpObject> >
163 static std::pair<errno_t, UniquePtr<MpObject> >
166 return Parse(first, last, settings, detail);
168 static std::pair<errno_t, UniquePtr<MpObject> >
171 return Parse(first, last, settings,
nullptr);
173 static std::pair<errno_t, UniquePtr<MpObject> >
176 return Parse(first, last, settings);
178 static std::pair<errno_t, UniquePtr<MpObject> >
181 return Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings, detail);
183 static std::pair<errno_t, UniquePtr<MpObject> >
186 return Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings, detail);
188 static std::pair<errno_t, UniquePtr<MpObject> >
190 return Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings,
nullptr);
194 return Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings,
nullptr);
196 static std::pair<errno_t, UniquePtr<MpObject> >
201 if (settings.format != JsonStreamParserSettings::kFormatJson)
202 return ::std::make_pair(EINVAL,
nullptr);
203 return Parse(first, last, settings, detail);
205 static std::pair<errno_t, UniquePtr<MpObject> >
207 return Parse(str, settings,
nullptr);
209 static std::pair<errno_t, UniquePtr<MpObject> >
212 settings.
format = JsonStreamParserSettings::kFormatJson;
213 return Parse(str, settings, detail);
216 return Parse(str,
nullptr);
230 std::pair<errno_t, int32_t> rval;
231 rval.first = ToInt32(token, &rval.second);
235 std::pair<errno_t, uint32_t> rval;
236 rval.first = ToUint32(token, &rval.second);
240 std::pair<errno_t, int64_t> rval;
241 rval.first = ToInt64(token, &rval.second);
245 std::pair<errno_t, uint64_t> rval;
246 rval.first = ToUint64(token, &rval.second);
250 std::pair<errno_t, float> rval;
251 rval.first =
ToFloat(token, &rval.second);
255 std::pair<errno_t, double> rval;
256 rval.first =
ToDouble(token, &rval.second);
260 std::pair<errno_t, nlib_time> rval;
261 rval.first = ToTimestamp(token, &rval.second);
266 token_.event = kNone;
267 token_.buf =
nullptr;
268 token_.number.u64 = 0U;
269 token_.token_toobig =
false;
273 #ifdef __cpp_rvalue_references 302 return this->Init(settings);
322 struct JsonStreamParserPrivate;
323 JsonStreamParserPrivate* prv_;
330 NLIB_EINVAL_IFNULL(number);
331 switch (token.event) {
332 case kEventNumberInt32:
333 *number = token.number.i32;
335 case kEventNumberUint32:
336 *number =
static_cast<int32_t
>(token.number.u32);
337 if (token.number.u32 > INT32_MAX)
return ERANGE;
339 case kEventNumberInt64:
340 *number =
static_cast<int32_t
>(token.number.i64);
341 if (token.number.i64 > INT32_MAX || token.number.i64 < INT32_MIN)
return ERANGE;
343 case kEventNumberUint64:
344 *number =
static_cast<int32_t
>(token.number.u64);
345 if (token.number.u64 > INT32_MAX)
return ERANGE;
347 case kEventNumberFloat:
348 *number =
static_cast<int32_t
>(token.number.f32);
349 if (token.number.f32 > static_cast<float>(INT32_MAX) ||
350 token.number.f32 <
static_cast<float>(INT32_MIN))
353 case kEventNumberDouble:
354 *number =
static_cast<int32_t
>(token.number.f64);
355 if (token.number.f64 > static_cast<double>(INT32_MAX) ||
356 token.number.f64 <
static_cast<double>(INT32_MIN))
366 NLIB_EINVAL_IFNULL(number);
367 switch (token.event) {
368 case kEventNumberInt32:
369 *number =
static_cast<uint32_t
>(token.number.i32);
370 if (token.number.i32 < 0)
return ERANGE;
372 case kEventNumberUint32:
373 *number = token.number.u32;
375 case kEventNumberInt64:
376 *number =
static_cast<uint32_t
>(token.number.i64);
377 if (token.number.i64 > UINT32_MAX || token.number.i64 < 0)
return ERANGE;
379 case kEventNumberUint64:
380 *number =
static_cast<uint32_t
>(token.number.u64);
381 if (token.number.u64 > UINT32_MAX)
return ERANGE;
383 case kEventNumberFloat:
384 *number =
static_cast<uint32_t
>(token.number.f32);
385 if (token.number.f32 > static_cast<float>(UINT32_MAX) || token.number.f32 < 0.f)
388 case kEventNumberDouble:
389 *number =
static_cast<uint32_t
>(token.number.f64);
390 if (token.number.f64 > static_cast<double>(UINT32_MAX) || token.number.f64 < 0.0)
400 NLIB_EINVAL_IFNULL(number);
401 switch (token.event) {
402 case JsonStreamParser::kEventNumberInt32:
403 *number = token.number.i32;
405 case JsonStreamParser::kEventNumberUint32:
406 *number =
static_cast<int64_t
>(token.number.u32);
408 case JsonStreamParser::kEventNumberInt64:
409 *number = token.number.i64;
411 case JsonStreamParser::kEventNumberUint64:
412 *number =
static_cast<int64_t
>(token.number.u64);
413 if (token.number.u64 > INT64_MAX)
return ERANGE;
415 case kEventNumberFloat:
416 *number =
static_cast<int64_t
>(token.number.f32);
417 if (token.number.f32 > static_cast<float>(INT64_MAX) ||
418 token.number.f32 <
static_cast<float>(INT64_MIN))
421 case kEventNumberDouble:
422 *number =
static_cast<int64_t
>(token.number.f64);
423 if (token.number.f64 > static_cast<double>(INT64_MAX) ||
424 token.number.f64 <
static_cast<double>(INT64_MIN))
434 NLIB_EINVAL_IFNULL(number);
435 switch (token.event) {
436 case kEventNumberInt32:
437 *number =
static_cast<uint64_t
>(token.number.i32);
438 if (token.number.i32 < 0)
return ERANGE;
440 case kEventNumberUint32:
441 *number = token.number.u32;
443 case kEventNumberInt64:
444 *number =
static_cast<uint64_t
>(token.number.i64);
445 if (token.number.i64 < 0)
return ERANGE;
447 case kEventNumberUint64:
448 *number = token.number.u64;
450 case kEventNumberFloat:
451 *number =
static_cast<uint64_t
>(token.number.f32);
452 if (token.number.f32 > static_cast<float>(UINT64_MAX) || token.number.f32 < 0.f)
455 case kEventNumberDouble:
456 *number =
static_cast<uint64_t
>(token.number.f64);
457 if (token.number.f64 > static_cast<double>(UINT64_MAX) || token.number.f64 < 0.0)
467 NLIB_EINVAL_IFNULL(number);
468 switch (token.event) {
469 case kEventNumberInt32:
470 *number =
static_cast<float>(token.number.i32);
471 if (token.number.i32 > 16777215 || token.number.i32 < -16777215)
return EDOM;
473 case kEventNumberUint32:
474 *number =
static_cast<float>(token.number.u32);
475 if (token.number.u32 > 16777215)
return EDOM;
477 case kEventNumberInt64:
478 *number =
static_cast<float>(token.number.i64);
479 if (token.number.i64 > 16777215 || token.number.i64 < -16777215)
return EDOM;
481 case kEventNumberUint64:
482 *number =
static_cast<float>(token.number.u64);
483 if (token.number.u64 > 16777215)
return EDOM;
485 case kEventNumberFloat:
486 *number = token.number.f32;
488 case kEventNumberDouble:
489 *number =
static_cast<float>(token.number.f64);
490 if (token.number.f64 < FLT_MIN || token.number.f64 > FLT_MAX)
501 NLIB_EINVAL_IFNULL(number);
502 switch (token.event) {
503 case kEventNumberInt32:
504 *number =
static_cast<double>(token.number.i32);
506 case kEventNumberUint32:
507 *number =
static_cast<double>(token.number.u32);
509 case kEventNumberInt64:
510 *number =
static_cast<double>(token.number.i64);
511 if (token.number.i64 > 9007199254740991LL || token.number.i64 < -9007199254740991LL)
514 case kEventNumberUint64:
515 *number =
static_cast<double>(token.number.u64);
516 if (token.number.u64 > 9007199254740991ULL)
return EDOM;
518 case kEventNumberFloat:
519 *number = token.number.f32;
521 case kEventNumberDouble:
522 *number = token.number.f64;
532 NLIB_DEFINE_STD_SWAP(::nlib_ns::msgpack::JsonStreamParser)
533 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 534 #undef NLIB_VIS_PUBLIC 535 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 538 #endif // INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_utf8_t *str) noexcept
static std::pair< errno_t, uint64_t > ToUint64(const Token &token) noexcept
数値トークンをuint64_tへキャストします。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_utf8_t *str, Detail *detail) noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
static std::pair< errno_t, nlib_time > ToTimestamp(const Token &token) noexcept
タイムスタンプをnlib_timeへ変換します。msgpackのTimestamp extension typeをパースした場合のみに変換さ...
size_t token_buffer_size
トークンを格納するバッファのサイズを指定します。デフォルトは2048で512が最小の値です。 ...
拡張データを読み込みました(msgpackのみ)。
static std::pair< errno_t, int64_t > ToInt64(const Token &token) noexcept
数値トークンをint64_tへキャストします。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
static std::pair< errno_t, float > ToFloat(const Token &token) noexcept
数値トークンをfloatへキャストします。
bool strict
0以外を設定した場合、より厳密にエラーチェックを行います。デフォルトは0です。
constexpr JsonStreamParserSettings() noexcept
デフォルトコンストラクタです。 各データメンバにデフォルト値を設定します。
std::pair< errno_t, size_t > ToFloat(float *v, const StringView &str) noexcept
内部でnlib_float_from_chars()を呼び出して、文字列を数値に変換します。戻り値はエラー値と読み込んだ文字...
nlib_utf8_t * buf
文字列やバイナリデータが格納されます。
C++11環境(エイリアステンプレートが可能な環境)においてはstd::unique_ptrにエイリアステンプレートされま...
std::unique_ptrに相当するクラスが定義されています。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_utf8_t *str, const JsonStreamParserSettings &settings, Detail *detail) noexcept
JSONをパースして、MpObjectを作成して返します。
#define NLIB_CEXPR14
C++14のconstexprが利用可能であればconstexprが定義されます。そうでない場合は空文字列です。 ...
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n) noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
上記関数の引数省略版で、nullptrを引数として渡します。
static errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj, bool peek) noexcept
上記関数の引数省略版で、nullptrを引数として渡します。
static std::pair< errno_t, int32_t > ToInt32(const Token &token) noexcept
数値トークンをint32_tへキャストします。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(JsonStreamParser *parser) noexcept
上記関数の引数省略版で、falseを引数として渡します。
Event event
Next()によって返されたイベント
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker, const JsonStreamParserSettings &settings) noexcept
上記関数の引数省略版で、nullptrを引数として渡します。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(JsonStreamParser *parser, bool peek) noexcept
上記関数の引数省略版で、nullptrを引数として渡します。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker) noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
空の構造体で、関数の引数をムーブすべきことを示すために利用されます。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_byte_t *first, const nlib_byte_t *last) noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
JsonStreamParserの設定パラメータ群を格納する構造体です。
JSON又はmsgpackをプル形式でパースするためのクラスです。
static std::pair< errno_t, uint32_t > ToUint32(const Token &token) noexcept
数値トークンをuint32_tへキャストします。
Event
JsonStreamParser::Next()及びTokenで利用される型で、パーサーが読み込んだデータに対応するイベントです。...
MessagePack, JSON及びCSVを読み込むと作成されるオブジェクトです。
エラーが発生した場合、pathにエラーが発生した箇所を示す文字列が格納されます。
size_t max_map_size
連想配列の最大サイズを指定します。デフォルトは256で16が最小の値です。
size_t max_array_size
配列の最大サイズを指定します。デフォルトは8192で16が最小の値です。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_byte_t *first, const nlib_byte_t *last, const JsonStreamParserSettings &settings) noexcept
上記関数の引数省略版で、nullptrを引数として渡します。
JsonStreamParser & operator=(JsonStreamParser &&rhs) noexcept
ムーブ代入演算子です。
constexpr JsonStreamParser() noexcept
デフォルトコンストラクタです。
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
上記関数の引数省略版で、nullptrを引数として渡します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
JsonStreamParser(JsonStreamParser &&rhs) noexcept
ムーブコンストラクタです。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
bool token_toobig
イベントがkEventStringかつトークンが大きすぎた場合に、0以外の値が格納されます。この場合bufにはヌル文...
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings, Detail *detail) noexcept
JSONをパースして、MpObjectを作成します。
std::pair< errno_t, size_t > ToDouble(double *v, const StringView &str) noexcept
内部でnlib_double_from_chars()を呼び出して、文字列を数値に変換します。戻り値はエラー値と読み込んだ文...
static std::pair< errno_t, double > ToDouble(const Token &token) noexcept
数値トークンをdoubleへキャストします。
static errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj) noexcept
上記関数の引数省略版で、falseを引数として渡します。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker, const JsonStreamParserSettings &settings, Detail *detail) noexcept
Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings, detail)を実行します。 ...
メモリ上に展開されたMessagePackのデータに高速にアクセスします。
パーサーが取得したトークンに関するデータが格納されています。
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str) noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
int8_t ext
イベントがkEventExtだった場合に、データ型に関する8ビットの値が格納されます。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_byte_t *first, const nlib_byte_t *last, Detail *detail) noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
errno_t Init() noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
バイナリデータを読み込みました(msgpackのみ)。
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n, const JsonStreamParserSettings &settings) noexcept
上記関数の引数省略版で、nullptrを引数として渡します。
size_t max_depth
配列や連想配列の深さの最大値を指定します。デフォルトは7です。
Format format
パースする際のフォーマット判定をどのように行うかを決定します。デフォルトはkFormatAdaptiveです。 ...
MessagePackを高速に読み込むためのクラスが定義されています。
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker, Detail *detail) noexcept
上記関数の引数省略版で、settingsをデフォルト値で渡します。
StringView GetLine(StringView &str) noexcept
先頭から行末までの文字列を取得します。自身のオブジェクト(str)は次の行の行頭に移動します。 ...