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
Specifies the size of the buffer to store tokens. The default is 2048 and the minimum value is 512...
Extended data has been read (msgpack only).
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
Prohibits use of the copy constructor and assignment operator for the class specified by TypeName...
#define NLIB_SAFE_BOOL(class_name, exp)
Defines a safe operator bool function in the class. Uses the C++11 explicit bool if it is available f...
A uint64_t type integer has been read.
bool strict
If a value other than 0 is set, a stricter error check is performed. The default is 0...
constexpr JsonStreamParserSettings() noexcept
Instantiates the object with default parameters (default constructor). Sets each data member to the d...
std::pair< errno_t, size_t > ToFloat(float *v, const StringView &str) noexcept
Internally calls nlib_float_from_chars() to convert a string to a numerical value. The returned value is a pair of the error value and the number of read characters.
The associative array has started.
nlib_utf8_t * buf
Stores strings or binary data.
UniquePtr owns the pointer, and when it goes out of scope, the pointer is released by the destructor ...
Defines that class that is corresponding to std::unique_ptr.
An int32_t type integer has been read.
#define NLIB_CEXPR14
constexpr is defined if C++14 constexpr is available for use. If not, holds an empty string...
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n) noexcept
Runs Parse(obj, data, n, settings) with the default JsonStreamParserSettings settings specified...
static errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj, bool peek) noexcept
Runs Parse(parser, obj, peek, NULL).
Event event
The event returned by Next().
A double type floating-point number has been read.
An empty structure indicating that an argument to a function needs to be moved.
Data structure used to store the JsonStreamParser settings parameters.
The class to parse JSON or msgpack in a pull manner.
The class for reading text from streams.
Event
The type used by JsonStreamParser::Next() and Token, and the event that corresponds to the data read ...
Object created when MessagePack, JSON, or CSV is read.
When an error occurs, the string indicating the location of the error is stored in path...
size_t max_map_size
Specifies the maximum associative array size. The default is 256 and the minimum value is 16...
size_t max_array_size
Specifies the maximum array size. The default is 8192 and the minimum value is 16.
An associative array key has been read.
A uint32_t type integer has been read.
constexpr JsonStreamParser() noexcept
Instantiates the object with default parameters (default constructor).
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
Runs Parse(obj, str, settings, NULL).
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
JSON or msgpack has finished (A return value of Next() when HasNext() returns false).
#define NLIB_CEXPR
Defines constexpr if it is available for use. If not, holds an empty string.
bool token_toobig
When the event is kEventString and the token is too large, stores a non-zero value. In this case, a null string is set to buf.
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings, Detail *detail) noexcept
Creates MpObject by parsing JSON.
std::pair< errno_t, size_t > ToDouble(double *v, const StringView &str) noexcept
Internally calls nlib_double_from_chars() to convert a string to a numerical value. The returned value is a pair of the error value and the number of read characters.
static errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj) noexcept
Runs Parse(parser, obj, false).
const Token & GetToken() const noexcept
Gets the token.
Stores data on the tokens obtained by the parser.
A string other than an associative array key has been read.
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str) noexcept
Runs Parse(obj, str, settings) with the default JsonStreamParserSettings settings specified...
#define NLIB_FINAL
Defines final if it is available for use. If not, holds an empty string.
int8_t ext
When the event is kEventExt, stores a data type 8-bit value.
An int64_t type integer has been read.
errno_t Init() noexcept
Initializes the parser using the default settings.
Binary data has been read (msgpack only).
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n, const JsonStreamParserSettings &settings) noexcept
Runs Parse(obj, data, n, settings, NULL).
size_t max_depth
Specifies the maximum value for the depth of array or associative array. The default is 7...
The associative array has finished.
Format format
Decides how formats are determined when parsing. The default is kFormatAdaptive.
A float type floating-point number has been read.
StringView GetLine(StringView &str) noexcept
Obtains the strings from the start to the end of the line. Its own object ( str) moves to the beginni...