16 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 17 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 22 #include "nn/nlib/Swap.h" 25 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 26 #undef NLIB_VIS_PUBLIC 27 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 39 FORMAT_ADAPTIVE = kFormatAdaptive,
40 FORMAT_JSON = kFormatJson,
41 FORMAT_MSGPACK = kFormatMsgpack
50 max_array_size(8192), max_map_size(256), token_buffer_size(2048), max_depth(7),
51 format(kFormatAdaptive), strict(false) {}
77 EVENT_NULL = kEventNull,
78 EVENT_TRUE = kEventTrue,
79 EVENT_FALSE = kEventFalse,
80 EVENT_STRING = kEventString,
81 EVENT_NUMBER_INT32 = kEventNumberInt32,
82 EVENT_NUMBER_UINT32 = kEventNumberUint32,
83 EVENT_NUMBER_INT64 = kEventNumberInt64,
84 EVENT_NUMBER_UINT64 = kEventNumberUint64,
85 EVENT_NUMBER_FLOAT = kEventNumberFloat,
86 EVENT_NUMBER_DOUBLE = kEventNumberDouble,
87 EVENT_START_ARRAY = kEventStartArray,
88 EVENT_END_ARRAY = kEventEndArray,
89 EVENT_START_MAP = kEventStartMap,
90 EVENT_END_MAP = kEventEndMap,
91 EVENT_KEY_NAME = kEventKeyName,
92 EVENT_BINARY = kEventBinary,
93 EVENT_EXT = kEventExt,
94 EVENT_END_DOCUMENT = kEventEndDocument
111 ERROR_COLON = kErrorColon,
112 ERROR_COMMA = kErrorComma,
113 ERROR_QUOTE = kErrorQuote,
114 ERROR_KEY_TOOLONG = kErrorKeyTooLong,
115 ERROR_NUMBER_TOOLONG = kErrorNumberTooLong,
116 ERROR_ARRAY_TOOBIG = kErrorArrayTooBig,
117 ERROR_MAP_TOOBIG = kErrorMapTooBig,
118 ERROR_CHARACTER = kErrorCharacter,
119 ERROR_NUMBER_RANGE = kErrorNumberRange,
120 ERROR_DEPTH = kErrorDepth,
121 ERROR_TOKEN = kErrorToken,
122 ERROR_STREAM = kErrorStream
144 return Parse(parser, obj,
false);
151 return Parse(obj, data, n, settings);
156 if (settings.
format == JsonStreamParserSettings::kFormatJson) {
157 return Parse(obj, str, n, settings);
160 settings_.
format = JsonStreamParserSettings::kFormatJson;
161 return Parse(obj, str, n, settings_);
166 return Parse(obj, str, settings);
182 return this->Init(settings);
197 swap(prv_, rhs.prv_);
198 swap(error_, rhs.error_);
199 swap(token_, rhs.token_);
209 struct JsonStreamParserPrivate;
210 JsonStreamParserPrivate* prv_;
217 NLIB_EINVAL_IFNULL(number);
218 switch (token.event) {
219 case kEventNumberInt32:
220 *number = token.number.i32;
222 case kEventNumberUint32:
223 *number =
static_cast<int32_t
>(token.number.u32);
224 if (token.number.u32 > INT32_MAX)
return ERANGE;
226 case kEventNumberInt64:
227 *number =
static_cast<int32_t
>(token.number.i64);
228 if (token.number.i64 > INT32_MAX ||
229 token.number.i64 < INT32_MIN)
return ERANGE;
231 case kEventNumberUint64:
232 *number =
static_cast<int32_t
>(token.number.u64);
233 if (token.number.u64 > INT32_MAX)
return ERANGE;
235 case kEventNumberFloat:
236 *number =
static_cast<int32_t
>(token.number.f32);
237 if (token.number.f32 > static_cast<float>(INT32_MAX) ||
238 token.number.f32 <
static_cast<float>(INT32_MIN))
241 case kEventNumberDouble:
242 *number =
static_cast<int32_t
>(token.number.f64);
243 if (token.number.f64 > static_cast<double>(INT32_MAX) ||
244 token.number.f64 <
static_cast<double>(INT32_MIN))
254 NLIB_EINVAL_IFNULL(number);
255 switch (token.event) {
256 case kEventNumberInt32:
257 *number =
static_cast<uint32_t
>(token.number.i32);
258 if (token.number.i32 < 0)
return ERANGE;
260 case kEventNumberUint32:
261 *number = token.number.u32;
263 case kEventNumberInt64:
264 *number =
static_cast<uint32_t
>(token.number.i64);
265 if (token.number.i64 > UINT32_MAX ||
266 token.number.i64 < 0)
return ERANGE;
268 case kEventNumberUint64:
269 *number =
static_cast<uint32_t
>(token.number.u64);
270 if (token.number.u64 > UINT32_MAX)
return ERANGE;
272 case kEventNumberFloat:
273 *number =
static_cast<uint32_t
>(token.number.f32);
274 if (token.number.f32 > static_cast<float>(UINT32_MAX) ||
275 token.number.f32 < 0.f)
278 case kEventNumberDouble:
279 *number =
static_cast<uint32_t
>(token.number.f64);
280 if (token.number.f64 > static_cast<double>(UINT32_MAX) ||
281 token.number.f64 < 0.0)
291 NLIB_EINVAL_IFNULL(number);
292 switch (token.event) {
293 case JsonStreamParser::kEventNumberInt32:
294 *number = token.number.i32;
296 case JsonStreamParser::kEventNumberUint32:
297 *number =
static_cast<int64_t
>(token.number.u32);
299 case JsonStreamParser::kEventNumberInt64:
300 *number = token.number.i64;
302 case JsonStreamParser::kEventNumberUint64:
303 *number =
static_cast<int64_t
>(token.number.u64);
304 if (token.number.u64 > INT64_MAX)
return ERANGE;
306 case kEventNumberFloat:
307 *number =
static_cast<int64_t
>(token.number.f32);
308 if (token.number.f32 > static_cast<float>(INT64_MAX) ||
309 token.number.f32 <
static_cast<float>(INT64_MIN))
312 case kEventNumberDouble:
313 *number =
static_cast<int64_t
>(token.number.f64);
314 if (token.number.f64 > static_cast<double>(INT64_MAX) ||
315 token.number.f64 <
static_cast<double>(INT64_MIN))
325 NLIB_EINVAL_IFNULL(number);
326 switch (token.event) {
327 case kEventNumberInt32:
328 *number =
static_cast<uint64_t
>(token.number.i32);
329 if (token.number.i32 < 0)
return ERANGE;
331 case kEventNumberUint32:
332 *number = token.number.u32;
334 case kEventNumberInt64:
335 *number =
static_cast<uint64_t
>(token.number.i64);
336 if (token.number.i64 < 0)
return ERANGE;
338 case kEventNumberUint64:
339 *number = token.number.u64;
341 case kEventNumberFloat:
342 *number =
static_cast<uint64_t
>(token.number.f32);
343 if (token.number.f32 > static_cast<float>(UINT64_MAX) ||
344 token.number.f32 < 0.f)
347 case kEventNumberDouble:
348 *number =
static_cast<uint64_t
>(token.number.f64);
349 if (token.number.f64 > static_cast<double>(UINT64_MAX) ||
350 token.number.f64 < 0.0)
360 NLIB_EINVAL_IFNULL(number);
361 switch (token.event) {
362 case kEventNumberInt32:
363 *number =
static_cast<float>(token.number.i32);
364 if (token.number.i32 > 16777215 || token.number.i32 < -16777215)
367 case kEventNumberUint32:
368 *number =
static_cast<float>(token.number.u32);
369 if (token.number.u32 > 16777215)
372 case kEventNumberInt64:
373 *number =
static_cast<float>(token.number.i64);
374 if (token.number.i64 > 16777215 || token.number.i64 < -16777215)
377 case kEventNumberUint64:
378 *number =
static_cast<float>(token.number.u64);
379 if (token.number.u64 > 16777215)
382 case kEventNumberFloat:
383 *number = token.number.f32;
385 case kEventNumberDouble:
386 *number =
static_cast<float>(token.number.f32);
387 if (token.number.f64 < FLT_MIN ||
388 token.number.f64 > FLT_MAX)
399 NLIB_EINVAL_IFNULL(number);
400 switch (token.event) {
401 case kEventNumberInt32:
402 *number =
static_cast<double>(token.number.i32);
404 case kEventNumberUint32:
405 *number =
static_cast<double>(token.number.u32);
407 case kEventNumberInt64:
408 *number =
static_cast<double>(token.number.i64);
409 if (token.number.i64 > 9007199254740991LL ||
410 token.number.i64 < -9007199254740991LL)
413 case kEventNumberUint64:
414 *number =
static_cast<double>(token.number.u64);
415 if (token.number.u64 > 9007199254740991ULL)
418 case kEventNumberFloat:
419 *number = token.number.f32;
421 case kEventNumberDouble:
422 *number = token.number.f64;
432 NLIB_DEFINE_STD_SWAP(::nlib_ns::msgpack::JsonStreamParser)
433 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 434 #undef NLIB_VIS_PUBLIC 435 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 438 #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
デフォルトコンストラクタです。各データメンバにデフォルト値を設定します。
nlib_utf8_t * buf
文字列やバイナリデータが格納されます。
UniquePtrはポインタの所有権を保持し、UniquePtrがスコープから出るときにデストラクタでポインタをDELで指...
std::unique_ptrに相当するクラスが定義されています。
static errno_t Parse(UniquePtr< MpObject > &obj, const void *data, size_t n) noexcept
JsonStreamParserSettingsのデフォルト設定でParse(obj, data, n, settings)を実行します。 ...
Event event
Next()によって返されたイベント
JsonStreamParserの設定パラメータ群を格納する構造体です。
JSON又はmsgpackをプル形式でパースするためのクラスです。
Event
JsonStreamParser::Next()及びTokenで利用される型で、パーサーが読み込んだデータに対応するイベントです。...
MessagePack, JSON及びCSVを読み込むと作成されるオブジェクトです。
size_t max_map_size
連想配列の最大サイズを指定します。デフォルトは256で16が最小の値です。
size_t max_array_size
配列の最大サイズを指定します。デフォルトは8192で16が最小の値です。
static errno_t Parse(UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
JSONをパースして、MpObjectを作成します。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
JSON又はmsgpackが終了しました(HasNext()がfalseを返した場合のNext()の戻り値)。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
bool token_toobig
イベントがkEventStringかつトークンが大きすぎた場合に、0以外の値が格納されます。この場合bufにはヌル文...
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のみ)。
size_t max_depth
配列や連想配列の深さの最大値を指定します。デフォルトは7です。
Format format
パースする際のフォーマット判定をどのように行うかを決定します。デフォルトはkFormatAdaptiveです。 ...