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
Casts a numeric token to uint64_t.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_utf8_t *str, Detail *detail) noexcept
A parameter omitted version of the above function which passes settings as the default value...
static std::pair< errno_t, nlib_time > ToTimestamp(const Token &token) noexcept
Converts a timestamp to nlib_time. It is converted only when Timestamp extension type in msgpack was ...
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).
static std::pair< errno_t, int64_t > ToInt64(const Token &token) noexcept
Casts a numeric token to int64_t.
#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...
static std::pair< errno_t, float > ToFloat(const Token &token) noexcept
Casts a numeric token to float.
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.
In the C++11 environment (which supports alias templates), std::unique_ptr is made an alias template...
Defines that class that is corresponding to std::unique_ptr.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_utf8_t *str, const JsonStreamParserSettings &settings, Detail *detail) noexcept
Creates and returns MpObject by parsing JSON.
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
A parameter omitted version of the above function which passes settings as the default value...
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
A parameter omitted version of the above function which passes nullptr as a parameter.
static errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj, bool peek) noexcept
A parameter omitted version of the above function which passes nullptr as a parameter.
static std::pair< errno_t, int32_t > ToInt32(const Token &token) noexcept
Casts a numeric token to int32_t.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(JsonStreamParser *parser) noexcept
A parameter omitted version of the above function which passes false as a parameter.
Event event
The event returned by Next().
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker, const JsonStreamParserSettings &settings) noexcept
A parameter omitted version of the above function which passes nullptr as a parameter.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(JsonStreamParser *parser, bool peek) noexcept
A parameter omitted version of the above function which passes nullptr as a parameter.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker) noexcept
A parameter omitted version of the above function which passes settings as the default value...
A double type floating-point number has been read.
An empty structure indicating that an argument to a function needs to be moved.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_byte_t *first, const nlib_byte_t *last) noexcept
A parameter omitted version of the above function which passes settings as the default value...
Data structure used to store the JsonStreamParser settings parameters.
The class to parse JSON or msgpack in a pull manner.
static std::pair< errno_t, uint32_t > ToUint32(const Token &token) noexcept
Casts a numeric token to uint32_t.
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.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_byte_t *first, const nlib_byte_t *last, const JsonStreamParserSettings &settings) noexcept
A parameter omitted version of the above function which passes nullptr as a parameter.
JsonStreamParser & operator=(JsonStreamParser &&rhs) noexcept
Move assignment operator.
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
A parameter omitted version of the above function which passes nullptr as a parameter.
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
JsonStreamParser(JsonStreamParser &&rhs) noexcept
Instantiates the object (move constructor).
#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 std::pair< errno_t, double > ToDouble(const Token &token) noexcept
Casts a numeric token to double.
static errno_t Parse(JsonStreamParser *parser, UniquePtr< MpObject > &obj) noexcept
A parameter omitted version of the above function which passes false as a parameter.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker, const JsonStreamParserSettings &settings, Detail *detail) noexcept
Runs Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings, detail).
Quickly accesses MessagePack expanded in memory.
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
A parameter omitted version of the above function which passes settings as the default value...
#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.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const nlib_byte_t *first, const nlib_byte_t *last, Detail *detail) noexcept
A parameter omitted version of the above function which passes settings as the default value...
errno_t Init() noexcept
A parameter omitted version of the above function which passes settings as the default value...
Binary data has been read (msgpack only).
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n, const JsonStreamParserSettings &settings) noexcept
A parameter omitted version of the above function which passes nullptr as a parameter.
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.
Defines the class for reading MessagePack at high speed.
static std::pair< errno_t, UniquePtr< MpObject > > Parse(const MpWalker &walker, Detail *detail) noexcept
A parameter omitted version of the above function which passes settings as the default value...
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...