3 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 4 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 11 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 12 #undef NLIB_VIS_PUBLIC 13 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 33 max_array_size(8192), max_map_size(256), token_buffer_size(2048), max_depth(7),
34 format(FORMAT_ADAPTIVE), strict(false) {}
95 return Parse(parser, obj,
false);
102 return Parse(obj, data, n, settings);
107 if (settings.
format == JsonStreamParserSettings::FORMAT_JSON) {
108 return Parse(obj, str, n, settings);
111 settings_.
format = JsonStreamParserSettings::FORMAT_JSON;
112 return Parse(obj, str, n, settings_);
117 return Parse(obj, str, settings);
132 return this->Init(settings);
153 struct JsonStreamParserPrivate;
154 JsonStreamParserPrivate* prv_;
160 NLIB_EINVAL_IFNULL(number);
161 switch (token.event) {
162 case EVENT_NUMBER_INT32:
163 *number = token.number.i32;
165 case EVENT_NUMBER_UINT32:
166 *number =
static_cast<int32_t
>(token.number.u32);
167 if (token.number.u32 > INT32_MAX)
return ERANGE;
169 case EVENT_NUMBER_INT64:
170 *number =
static_cast<int32_t
>(token.number.i64);
171 if (token.number.i64 > INT32_MAX ||
172 token.number.i64 < INT32_MIN)
return ERANGE;
174 case EVENT_NUMBER_UINT64:
175 *number =
static_cast<int32_t
>(token.number.u64);
176 if (token.number.u64 > INT32_MAX)
return ERANGE;
178 case EVENT_NUMBER_FLOAT:
179 *number =
static_cast<int32_t
>(token.number.f32);
180 if (token.number.f32 > static_cast<float>(INT32_MAX) ||
181 token.number.f32 <
static_cast<float>(INT32_MIN))
184 case EVENT_NUMBER_DOUBLE:
185 *number =
static_cast<int32_t
>(token.number.f64);
186 if (token.number.f64 > static_cast<double>(INT32_MAX) ||
187 token.number.f64 <
static_cast<double>(INT32_MIN))
197 NLIB_EINVAL_IFNULL(number);
198 switch (token.event) {
199 case EVENT_NUMBER_INT32:
200 *number =
static_cast<uint32_t
>(token.number.i32);
201 if (token.number.i32 < 0)
return ERANGE;
203 case EVENT_NUMBER_UINT32:
204 *number = token.number.u32;
206 case EVENT_NUMBER_INT64:
207 *number =
static_cast<uint32_t
>(token.number.i64);
208 if (token.number.i64 > UINT32_MAX ||
209 token.number.i64 < 0)
return ERANGE;
211 case EVENT_NUMBER_UINT64:
212 *number =
static_cast<uint32_t
>(token.number.u64);
213 if (token.number.u64 > UINT32_MAX)
return ERANGE;
215 case EVENT_NUMBER_FLOAT:
216 *number =
static_cast<uint32_t
>(token.number.f32);
217 if (token.number.f32 > static_cast<float>(UINT32_MAX) ||
218 token.number.f32 < 0.f)
221 case EVENT_NUMBER_DOUBLE:
222 *number =
static_cast<uint32_t
>(token.number.f64);
223 if (token.number.f64 > static_cast<double>(UINT32_MAX) ||
224 token.number.f64 < 0.0)
234 NLIB_EINVAL_IFNULL(number);
235 switch (token.event) {
236 case JsonStreamParser::EVENT_NUMBER_INT32:
237 *number = token.number.i32;
239 case JsonStreamParser::EVENT_NUMBER_UINT32:
240 *number =
static_cast<int64_t
>(token.number.u32);
242 case JsonStreamParser::EVENT_NUMBER_INT64:
243 *number = token.number.i64;
245 case JsonStreamParser::EVENT_NUMBER_UINT64:
246 *number =
static_cast<int64_t
>(token.number.u64);
247 if (token.number.u64 > INT64_MAX)
return ERANGE;
249 case EVENT_NUMBER_FLOAT:
250 *number =
static_cast<int64_t
>(token.number.f32);
251 if (token.number.f32 > static_cast<float>(INT64_MAX) ||
252 token.number.f32 <
static_cast<float>(INT64_MIN))
255 case EVENT_NUMBER_DOUBLE:
256 *number =
static_cast<int64_t
>(token.number.f64);
257 if (token.number.f64 > static_cast<double>(INT64_MAX) ||
258 token.number.f64 <
static_cast<double>(INT64_MIN))
268 NLIB_EINVAL_IFNULL(number);
269 switch (token.event) {
270 case EVENT_NUMBER_INT32:
271 *number =
static_cast<uint64_t
>(token.number.i32);
272 if (token.number.i32 < 0)
return ERANGE;
274 case EVENT_NUMBER_UINT32:
275 *number = token.number.u32;
277 case EVENT_NUMBER_INT64:
278 *number =
static_cast<uint64_t
>(token.number.i64);
279 if (token.number.i64 < 0)
return ERANGE;
281 case EVENT_NUMBER_UINT64:
282 *number = token.number.u64;
284 case EVENT_NUMBER_FLOAT:
285 *number =
static_cast<uint64_t
>(token.number.f32);
286 if (token.number.f32 > static_cast<float>(UINT64_MAX) ||
287 token.number.f32 < 0.f)
290 case EVENT_NUMBER_DOUBLE:
291 *number =
static_cast<uint64_t
>(token.number.f64);
292 if (token.number.f64 > static_cast<double>(UINT64_MAX) ||
293 token.number.f64 < 0.0)
303 NLIB_EINVAL_IFNULL(number);
304 switch (token.event) {
305 case EVENT_NUMBER_INT32:
306 *number =
static_cast<float>(token.number.i32);
307 if (token.number.i32 > 16777215 || token.number.i32 < -16777215)
310 case EVENT_NUMBER_UINT32:
311 *number =
static_cast<float>(token.number.u32);
312 if (token.number.u32 > 16777215)
315 case EVENT_NUMBER_INT64:
316 *number =
static_cast<float>(token.number.i64);
317 if (token.number.i64 > 16777215 || token.number.i64 < -16777215)
320 case EVENT_NUMBER_UINT64:
321 *number =
static_cast<float>(token.number.u64);
322 if (token.number.u64 > 16777215)
325 case EVENT_NUMBER_FLOAT:
326 *number = token.number.f32;
328 case EVENT_NUMBER_DOUBLE:
329 *number =
static_cast<float>(token.number.f32);
330 if (token.number.f64 < FLT_MIN ||
331 token.number.f64 > FLT_MAX)
342 NLIB_EINVAL_IFNULL(number);
343 switch (token.event) {
344 case EVENT_NUMBER_INT32:
345 *number =
static_cast<double>(token.number.i32);
347 case EVENT_NUMBER_UINT32:
348 *number =
static_cast<double>(token.number.u32);
350 case EVENT_NUMBER_INT64:
351 *number =
static_cast<double>(token.number.i64);
352 if (token.number.i64 > 9007199254740991LL ||
353 token.number.i64 < -9007199254740991LL)
356 case EVENT_NUMBER_UINT64:
357 *number =
static_cast<double>(token.number.u64);
358 if (token.number.u64 > 9007199254740991ULL)
361 case EVENT_NUMBER_FLOAT:
362 *number = token.number.f32;
364 case EVENT_NUMBER_DOUBLE:
365 *number = token.number.f64;
376 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 377 #undef NLIB_VIS_PUBLIC 378 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 381 #endif // INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ size_t token_buffer_size
トークンを格納するバッファのサイズを指定します。デフォルトは2048で512が最小の値です。 ...
#define NLIB_SAFE_BOOL(class_name, exp)
クラス内に安全なoperator bool()を定義します。 可能であればC++11のexplicit boolを利用します。 ...
bool strict
0以外を設定した場合、より厳密にエラーチェックを行います。デフォルトは0です。
constexpr JsonStreamParserSettings() noexcept
デフォルトコンストラクタです。各データメンバにデフォルト値を設定します。
char * buf
文字列やバイナリデータが格納されます。
バイナリデータを読み込みました(msgpackのみ)。
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)を実行します。 ...
拡張データを読み込みました(msgpackのみ)。
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が最小の値です。
#define NLIB_NOEXCEPT
環境に合わせてnoexcept 又は同等の定義がされます。
#define NLIB_CEXPR
利用可能であればconstexprが定義されます。そうでない場合は空文字列です。
bool token_toobig
イベントがEVENT_STRINGかつトークンが大きすぎた場合に、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 char *str, const JsonStreamParserSettings &settings) noexcept
JSONをパースして、MpObjectを作成します。
#define NLIB_FINAL
利用可能であればfinalが定義されます。そうでない場合は空文字列です。
int8_t ext
イベントがEVENT_EXTだった場合に、データ型に関する8ビットの値が格納されます。
errno_t Init() noexcept
デフォルト設定でパーサーの初期化を行います。
static errno_t Parse(UniquePtr< MpObject > &obj, const char *str) noexcept
JsonStreamParserSettingsのデフォルト設定でParse(obj, str, settingsを実行します。
size_t max_depth
配列や連想配列の深さの最大値を指定します。デフォルトは7です。
Format format
パースする際のフォーマット判定をどのように行うかを決定します。デフォルトはFORMAT_ADAPTIVEです。 ...