16 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 17 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 23 #include "nn/nlib/Swap.h" 26 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 27 #undef NLIB_VIS_PUBLIC 28 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 40 FORMAT_ADAPTIVE = kFormatAdaptive,
41 FORMAT_JSON = kFormatJson,
42 FORMAT_MSGPACK = kFormatMsgpack
51 max_array_size(8192), max_map_size(256), token_buffer_size(2048), max_depth(7),
52 format(kFormatAdaptive), strict(false) {}
78 EVENT_NULL = kEventNull,
79 EVENT_TRUE = kEventTrue,
80 EVENT_FALSE = kEventFalse,
81 EVENT_STRING = kEventString,
82 EVENT_NUMBER_INT32 = kEventNumberInt32,
83 EVENT_NUMBER_UINT32 = kEventNumberUint32,
84 EVENT_NUMBER_INT64 = kEventNumberInt64,
85 EVENT_NUMBER_UINT64 = kEventNumberUint64,
86 EVENT_NUMBER_FLOAT = kEventNumberFloat,
87 EVENT_NUMBER_DOUBLE = kEventNumberDouble,
88 EVENT_START_ARRAY = kEventStartArray,
89 EVENT_END_ARRAY = kEventEndArray,
90 EVENT_START_MAP = kEventStartMap,
91 EVENT_END_MAP = kEventEndMap,
92 EVENT_KEY_NAME = kEventKeyName,
93 EVENT_BINARY = kEventBinary,
94 EVENT_EXT = kEventExt,
95 EVENT_END_DOCUMENT = kEventEndDocument
112 ERROR_COLON = kErrorColon,
113 ERROR_COMMA = kErrorComma,
114 ERROR_QUOTE = kErrorQuote,
115 ERROR_KEY_TOOLONG = kErrorKeyTooLong,
116 ERROR_NUMBER_TOOLONG = kErrorNumberTooLong,
117 ERROR_ARRAY_TOOBIG = kErrorArrayTooBig,
118 ERROR_MAP_TOOBIG = kErrorMapTooBig,
119 ERROR_CHARACTER = kErrorCharacter,
120 ERROR_NUMBER_RANGE = kErrorNumberRange,
121 ERROR_DEPTH = kErrorDepth,
122 ERROR_TOKEN = kErrorToken,
123 ERROR_STREAM = kErrorStream
149 return Parse(parser, obj, peek,
nullptr);
152 return Parse(parser, obj,
false);
159 return Parse(obj, data, n, settings,
nullptr);
163 return Parse(obj, data, n, settings);
169 if (settings.
format == JsonStreamParserSettings::kFormatJson) {
170 return Parse(obj, str, n, settings, detail);
173 settings_.
format = JsonStreamParserSettings::kFormatJson;
174 return Parse(obj, str, n, settings_, detail);
179 return Parse(obj, str, settings,
nullptr);
183 return Parse(obj, str, settings);
185 #ifdef __cpp_rvalue_references 186 static ::std::pair<errno_t, UniquePtr<MpObject> >
188 static ::std::pair<errno_t, UniquePtr<MpObject> >
190 return Parse(parser, peek,
nullptr);
192 static ::std::pair<errno_t, UniquePtr<MpObject> >
194 return Parse(parser,
false);
196 static ::std::pair<errno_t, UniquePtr<MpObject> >
200 static ::std::pair<errno_t, UniquePtr<MpObject> >
203 return Parse(first, last, settings, detail);
205 static ::std::pair<errno_t, UniquePtr<MpObject> >
208 return Parse(first, last, settings,
nullptr);
210 static ::std::pair<errno_t, UniquePtr<MpObject> >
213 return Parse(first, last, settings);
215 static ::std::pair<errno_t, UniquePtr<MpObject> >
220 if (settings.
format != JsonStreamParserSettings::kFormatJson)
221 return ::std::make_pair(EINVAL,
nullptr);
222 return Parse(first, last, settings, detail);
224 static ::std::pair<errno_t, UniquePtr<MpObject> >
226 return Parse(str, settings,
nullptr);
228 static ::std::pair<errno_t, UniquePtr<MpObject> >
231 settings.
format = JsonStreamParserSettings::kFormatJson;
232 return Parse(str, settings, detail);
234 static ::std::pair<errno_t, UniquePtr<MpObject> >
236 return Parse(str,
nullptr);
249 std::pair<errno_t, int32_t> rval;
250 rval.first = ToInt32(token, &rval.second);
254 std::pair<errno_t, uint32_t> rval;
255 rval.first = ToUint32(token, &rval.second);
259 std::pair<errno_t, int64_t> rval;
260 rval.first = ToInt64(token, &rval.second);
264 std::pair<errno_t, uint64_t> rval;
265 rval.first = ToUint64(token, &rval.second);
269 std::pair<errno_t, float> rval;
270 rval.first =
ToFloat(token, &rval.second);
274 std::pair<errno_t, double> rval;
275 rval.first =
ToDouble(token, &rval.second);
279 std::pair<errno_t, nlib_time> rval;
280 rval.first = ToTimestamp(token, &rval.second);
285 : prv_(
nullptr), error_(kOk), token_() {
286 token_.event = kNone;
287 token_.buf =
nullptr;
288 token_.number.u64 = 0U;
289 token_.token_toobig =
false;
293 #ifdef __cpp_rvalue_references 295 : prv_(rhs.prv_), error_(rhs.error_), token_(rhs.token_) {
307 : prv_(rhs.prv_), error_(rhs.error_), token_(rhs.token_) {
319 swap(prv_, rhs.prv_);
320 swap(error_, rhs.error_);
321 swap(token_, rhs.token_);
326 return this->Init(settings);
347 struct JsonStreamParserPrivate;
348 JsonStreamParserPrivate* prv_;
355 NLIB_EINVAL_IFNULL(number);
356 switch (token.event) {
357 case kEventNumberInt32:
358 *number = token.number.i32;
360 case kEventNumberUint32:
361 *number =
static_cast<int32_t
>(token.number.u32);
362 if (token.number.u32 > INT32_MAX)
return ERANGE;
364 case kEventNumberInt64:
365 *number =
static_cast<int32_t
>(token.number.i64);
366 if (token.number.i64 > INT32_MAX ||
367 token.number.i64 < INT32_MIN)
return ERANGE;
369 case kEventNumberUint64:
370 *number =
static_cast<int32_t
>(token.number.u64);
371 if (token.number.u64 > INT32_MAX)
return ERANGE;
373 case kEventNumberFloat:
374 *number =
static_cast<int32_t
>(token.number.f32);
375 if (token.number.f32 > static_cast<float>(INT32_MAX) ||
376 token.number.f32 <
static_cast<float>(INT32_MIN))
379 case kEventNumberDouble:
380 *number =
static_cast<int32_t
>(token.number.f64);
381 if (token.number.f64 > static_cast<double>(INT32_MAX) ||
382 token.number.f64 <
static_cast<double>(INT32_MIN))
392 NLIB_EINVAL_IFNULL(number);
393 switch (token.event) {
394 case kEventNumberInt32:
395 *number =
static_cast<uint32_t
>(token.number.i32);
396 if (token.number.i32 < 0)
return ERANGE;
398 case kEventNumberUint32:
399 *number = token.number.u32;
401 case kEventNumberInt64:
402 *number =
static_cast<uint32_t
>(token.number.i64);
403 if (token.number.i64 > UINT32_MAX ||
404 token.number.i64 < 0)
return ERANGE;
406 case kEventNumberUint64:
407 *number =
static_cast<uint32_t
>(token.number.u64);
408 if (token.number.u64 > UINT32_MAX)
return ERANGE;
410 case kEventNumberFloat:
411 *number =
static_cast<uint32_t
>(token.number.f32);
412 if (token.number.f32 > static_cast<float>(UINT32_MAX) ||
413 token.number.f32 < 0.f)
416 case kEventNumberDouble:
417 *number =
static_cast<uint32_t
>(token.number.f64);
418 if (token.number.f64 > static_cast<double>(UINT32_MAX) ||
419 token.number.f64 < 0.0)
429 NLIB_EINVAL_IFNULL(number);
430 switch (token.event) {
431 case JsonStreamParser::kEventNumberInt32:
432 *number = token.number.i32;
434 case JsonStreamParser::kEventNumberUint32:
435 *number =
static_cast<int64_t
>(token.number.u32);
437 case JsonStreamParser::kEventNumberInt64:
438 *number = token.number.i64;
440 case JsonStreamParser::kEventNumberUint64:
441 *number =
static_cast<int64_t
>(token.number.u64);
442 if (token.number.u64 > INT64_MAX)
return ERANGE;
444 case kEventNumberFloat:
445 *number =
static_cast<int64_t
>(token.number.f32);
446 if (token.number.f32 > static_cast<float>(INT64_MAX) ||
447 token.number.f32 <
static_cast<float>(INT64_MIN))
450 case kEventNumberDouble:
451 *number =
static_cast<int64_t
>(token.number.f64);
452 if (token.number.f64 > static_cast<double>(INT64_MAX) ||
453 token.number.f64 <
static_cast<double>(INT64_MIN))
463 NLIB_EINVAL_IFNULL(number);
464 switch (token.event) {
465 case kEventNumberInt32:
466 *number =
static_cast<uint64_t
>(token.number.i32);
467 if (token.number.i32 < 0)
return ERANGE;
469 case kEventNumberUint32:
470 *number = token.number.u32;
472 case kEventNumberInt64:
473 *number =
static_cast<uint64_t
>(token.number.i64);
474 if (token.number.i64 < 0)
return ERANGE;
476 case kEventNumberUint64:
477 *number = token.number.u64;
479 case kEventNumberFloat:
480 *number =
static_cast<uint64_t
>(token.number.f32);
481 if (token.number.f32 > static_cast<float>(UINT64_MAX) ||
482 token.number.f32 < 0.f)
485 case kEventNumberDouble:
486 *number =
static_cast<uint64_t
>(token.number.f64);
487 if (token.number.f64 > static_cast<double>(UINT64_MAX) ||
488 token.number.f64 < 0.0)
498 NLIB_EINVAL_IFNULL(number);
499 switch (token.event) {
500 case kEventNumberInt32:
501 *number =
static_cast<float>(token.number.i32);
502 if (token.number.i32 > 16777215 || token.number.i32 < -16777215)
505 case kEventNumberUint32:
506 *number =
static_cast<float>(token.number.u32);
507 if (token.number.u32 > 16777215)
510 case kEventNumberInt64:
511 *number =
static_cast<float>(token.number.i64);
512 if (token.number.i64 > 16777215 || token.number.i64 < -16777215)
515 case kEventNumberUint64:
516 *number =
static_cast<float>(token.number.u64);
517 if (token.number.u64 > 16777215)
520 case kEventNumberFloat:
521 *number = token.number.f32;
523 case kEventNumberDouble:
524 *number =
static_cast<float>(token.number.f32);
525 if (token.number.f64 < FLT_MIN ||
526 token.number.f64 > FLT_MAX)
537 NLIB_EINVAL_IFNULL(number);
538 switch (token.event) {
539 case kEventNumberInt32:
540 *number =
static_cast<double>(token.number.i32);
542 case kEventNumberUint32:
543 *number =
static_cast<double>(token.number.u32);
545 case kEventNumberInt64:
546 *number =
static_cast<double>(token.number.i64);
547 if (token.number.i64 > 9007199254740991LL ||
548 token.number.i64 < -9007199254740991LL)
551 case kEventNumberUint64:
552 *number =
static_cast<double>(token.number.u64);
553 if (token.number.u64 > 9007199254740991ULL)
556 case kEventNumberFloat:
557 *number = token.number.f32;
559 case kEventNumberDouble:
560 *number = token.number.f64;
570 NLIB_DEFINE_STD_SWAP(::nlib_ns::msgpack::JsonStreamParser)
571 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 572 #undef NLIB_VIS_PUBLIC 573 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 576 #endif // INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ size_t token_buffer_size
トークンを格納するバッファのサイズを指定します。デフォルトは2048で512が最小の値です。 ...
拡張データを読み込みました(msgpackのみ)。
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
TypeName で指定されたクラスのコピーコンストラクタと代入演算子を禁止します。
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
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
文字列やバイナリデータが格納されます。
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
std::unique_ptrに相当するクラスが定義されています。
#define NLIB_CEXPR14
C++14のconstexprが利用可能であればconstexprが定義されます。そうでない場合は空文字列です。 ...
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n) noexcept
JsonStreamParserSettingsのデフォルト設定でParse(obj, data, n, settings)を実行します。 ...
static errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj, bool peek) noexcept
Parse(parser, obj, peek, NULL)を実行します。
Event event
Next()によって返されたイベント
空の構造体で、関数の引数をムーブすべきことを示すために利用されます。
JsonStreamParserの設定パラメータ群を格納する構造体です。
JSON又はmsgpackをプル形式でパースするためのクラスです。
Event
JsonStreamParser::Next()及びTokenで利用される型で、パーサーが読み込んだデータに対応するイベントです。...
MessagePack, JSON及びCSVを読み込むと作成されるオブジェクトです。
エラーが発生した場合、pathにエラーが発生した箇所を示す文字列が格納されます。
size_t max_map_size
連想配列の最大サイズを指定します。デフォルトは256で16が最小の値です。
size_t max_array_size
配列の最大サイズを指定します。デフォルトは8192で16が最小の値です。
constexpr JsonStreamParser() noexcept
デフォルトコンストラクタです。
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
Parse(obj, str, settings, NULL)を実行します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
JSON又はmsgpackが終了しました(HasNext()がfalseを返した場合のNext()の戻り値)。
#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 errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj) noexcept
Parse(parser, obj, false)を実行します。
const Token & GetToken() const noexcept
トークンを取得します。
パーサーが取得したトークンに関するデータが格納されています。
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str) noexcept
JsonStreamParserSettingsのデフォルト設定でParse(obj, str, settingsを実行します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
int8_t ext
イベントがkEventExtだった場合に、データ型に関する8ビットの値が格納されます。
errno_t Init() noexcept
デフォルト設定でパーサーの初期化を行います。
バイナリデータを読み込みました(msgpackのみ)。
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n, const JsonStreamParserSettings &settings) noexcept
Parse(obj, data, n, settings, NULL)を実行します。
size_t max_depth
配列や連想配列の深さの最大値を指定します。デフォルトは7です。
Format format
パースする際のフォーマット判定をどのように行うかを決定します。デフォルトはkFormatAdaptiveです。 ...
StringView GetLine(StringView &str) noexcept
先頭から行末までの文字列を取得します。自身のオブジェクト(str)は次の行の行頭に移動します。 ...