16 #ifndef INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 17 #define INCLUDE_NN_NLIB_MSGPACK_JSONSTREAMPARSER_H_ 24 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 25 #undef NLIB_VIS_PUBLIC 26 #define NLIB_VIS_PUBLIC NLIB_WINEXPORT 46 max_array_size(8192), max_map_size(256), token_buffer_size(2048), max_depth(7),
47 format(FORMAT_ADAPTIVE), strict(false) {}
108 return Parse(parser, obj,
false);
115 return Parse(obj, data, n, settings);
120 if (settings.
format == JsonStreamParserSettings::FORMAT_JSON) {
121 return Parse(obj, str, n, settings);
124 settings_.
format = JsonStreamParserSettings::FORMAT_JSON;
125 return Parse(obj, str, n, settings_);
130 return Parse(obj, str, settings);
145 return this->Init(settings);
166 struct JsonStreamParserPrivate;
167 JsonStreamParserPrivate* prv_;
173 NLIB_EINVAL_IFNULL(number);
174 switch (token.event) {
175 case EVENT_NUMBER_INT32:
176 *number = token.number.i32;
178 case EVENT_NUMBER_UINT32:
179 *number =
static_cast<int32_t
>(token.number.u32);
180 if (token.number.u32 > INT32_MAX)
return ERANGE;
182 case EVENT_NUMBER_INT64:
183 *number =
static_cast<int32_t
>(token.number.i64);
184 if (token.number.i64 > INT32_MAX ||
185 token.number.i64 < INT32_MIN)
return ERANGE;
187 case EVENT_NUMBER_UINT64:
188 *number =
static_cast<int32_t
>(token.number.u64);
189 if (token.number.u64 > INT32_MAX)
return ERANGE;
191 case EVENT_NUMBER_FLOAT:
192 *number =
static_cast<int32_t
>(token.number.f32);
193 if (token.number.f32 > static_cast<float>(INT32_MAX) ||
194 token.number.f32 <
static_cast<float>(INT32_MIN))
197 case EVENT_NUMBER_DOUBLE:
198 *number =
static_cast<int32_t
>(token.number.f64);
199 if (token.number.f64 > static_cast<double>(INT32_MAX) ||
200 token.number.f64 <
static_cast<double>(INT32_MIN))
210 NLIB_EINVAL_IFNULL(number);
211 switch (token.event) {
212 case EVENT_NUMBER_INT32:
213 *number =
static_cast<uint32_t
>(token.number.i32);
214 if (token.number.i32 < 0)
return ERANGE;
216 case EVENT_NUMBER_UINT32:
217 *number = token.number.u32;
219 case EVENT_NUMBER_INT64:
220 *number =
static_cast<uint32_t
>(token.number.i64);
221 if (token.number.i64 > UINT32_MAX ||
222 token.number.i64 < 0)
return ERANGE;
224 case EVENT_NUMBER_UINT64:
225 *number =
static_cast<uint32_t
>(token.number.u64);
226 if (token.number.u64 > UINT32_MAX)
return ERANGE;
228 case EVENT_NUMBER_FLOAT:
229 *number =
static_cast<uint32_t
>(token.number.f32);
230 if (token.number.f32 > static_cast<float>(UINT32_MAX) ||
231 token.number.f32 < 0.f)
234 case EVENT_NUMBER_DOUBLE:
235 *number =
static_cast<uint32_t
>(token.number.f64);
236 if (token.number.f64 > static_cast<double>(UINT32_MAX) ||
237 token.number.f64 < 0.0)
247 NLIB_EINVAL_IFNULL(number);
248 switch (token.event) {
249 case JsonStreamParser::EVENT_NUMBER_INT32:
250 *number = token.number.i32;
252 case JsonStreamParser::EVENT_NUMBER_UINT32:
253 *number =
static_cast<int64_t
>(token.number.u32);
255 case JsonStreamParser::EVENT_NUMBER_INT64:
256 *number = token.number.i64;
258 case JsonStreamParser::EVENT_NUMBER_UINT64:
259 *number =
static_cast<int64_t
>(token.number.u64);
260 if (token.number.u64 > INT64_MAX)
return ERANGE;
262 case EVENT_NUMBER_FLOAT:
263 *number =
static_cast<int64_t
>(token.number.f32);
264 if (token.number.f32 > static_cast<float>(INT64_MAX) ||
265 token.number.f32 <
static_cast<float>(INT64_MIN))
268 case EVENT_NUMBER_DOUBLE:
269 *number =
static_cast<int64_t
>(token.number.f64);
270 if (token.number.f64 > static_cast<double>(INT64_MAX) ||
271 token.number.f64 <
static_cast<double>(INT64_MIN))
281 NLIB_EINVAL_IFNULL(number);
282 switch (token.event) {
283 case EVENT_NUMBER_INT32:
284 *number =
static_cast<uint64_t
>(token.number.i32);
285 if (token.number.i32 < 0)
return ERANGE;
287 case EVENT_NUMBER_UINT32:
288 *number = token.number.u32;
290 case EVENT_NUMBER_INT64:
291 *number =
static_cast<uint64_t
>(token.number.i64);
292 if (token.number.i64 < 0)
return ERANGE;
294 case EVENT_NUMBER_UINT64:
295 *number = token.number.u64;
297 case EVENT_NUMBER_FLOAT:
298 *number =
static_cast<uint64_t
>(token.number.f32);
299 if (token.number.f32 > static_cast<float>(UINT64_MAX) ||
300 token.number.f32 < 0.f)
303 case EVENT_NUMBER_DOUBLE:
304 *number =
static_cast<uint64_t
>(token.number.f64);
305 if (token.number.f64 > static_cast<double>(UINT64_MAX) ||
306 token.number.f64 < 0.0)
316 NLIB_EINVAL_IFNULL(number);
317 switch (token.event) {
318 case EVENT_NUMBER_INT32:
319 *number =
static_cast<float>(token.number.i32);
320 if (token.number.i32 > 16777215 || token.number.i32 < -16777215)
323 case EVENT_NUMBER_UINT32:
324 *number =
static_cast<float>(token.number.u32);
325 if (token.number.u32 > 16777215)
328 case EVENT_NUMBER_INT64:
329 *number =
static_cast<float>(token.number.i64);
330 if (token.number.i64 > 16777215 || token.number.i64 < -16777215)
333 case EVENT_NUMBER_UINT64:
334 *number =
static_cast<float>(token.number.u64);
335 if (token.number.u64 > 16777215)
338 case EVENT_NUMBER_FLOAT:
339 *number = token.number.f32;
341 case EVENT_NUMBER_DOUBLE:
342 *number =
static_cast<float>(token.number.f32);
343 if (token.number.f64 < FLT_MIN ||
344 token.number.f64 > FLT_MAX)
355 NLIB_EINVAL_IFNULL(number);
356 switch (token.event) {
357 case EVENT_NUMBER_INT32:
358 *number =
static_cast<double>(token.number.i32);
360 case EVENT_NUMBER_UINT32:
361 *number =
static_cast<double>(token.number.u32);
363 case EVENT_NUMBER_INT64:
364 *number =
static_cast<double>(token.number.i64);
365 if (token.number.i64 > 9007199254740991LL ||
366 token.number.i64 < -9007199254740991LL)
369 case EVENT_NUMBER_UINT64:
370 *number =
static_cast<double>(token.number.u64);
371 if (token.number.u64 > 9007199254740991ULL)
374 case EVENT_NUMBER_FLOAT:
375 *number = token.number.f32;
377 case EVENT_NUMBER_DOUBLE:
378 *number = token.number.f64;
389 #if defined(_MSC_VER) && defined(nx_msgpack_EXPORTS) 390 #undef NLIB_VIS_PUBLIC 391 #define NLIB_VIS_PUBLIC NLIB_WINIMPORT 394 #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です。 ...