nlib
nn::nlib::msgpack::MpWalker クラスfinal

メモリ上に展開されたMessagePackのデータに高速にアクセスします。 [詳解]

#include "nn/nlib/msgpack/MpWalker.h"

公開メンバ関数

const nlib_byte_tGetPtr () const noexcept
 MessagePackデータの現在位置へのポインタを取得します。 [詳解]
 
size_t GetSize () const noexcept
 MessagePackデータのサイズを取得します。 [詳解]
 
MpWalker Skip () const noexcept
 次のデータを読み飛ばしてその次を指し示すMpWalkerオブジェクトを返します。配列や連想配列の場合その全体を読み飛ばします。
 
 operator bool () const
 オブジェクトが初期化されて読み込み可能であればtrueを返します。
 
コンストラクタ、デストラクタ、及び初期化
constexpr MpWalker () noexcept
 デフォルトコンストラクタです。
 
constexpr MpWalker (const void *p, size_t n) noexcept
 初期化を行うコンストラクタです。 [詳解]
 
bool Init (const void *p, size_t n) noexcept
 デフォルトコンストラクタを利用した場合はこの関数で初期化します。 [詳解]
 
配列
MpWalker operator[] (size_t array_idx) const noexcept
 インデックスを指定して配列の要素にアクセスします。
 
MpWalker operator[] (int array_idx) const noexcept
 インデックスを指定して配列の要素にアクセスします。
 
MpWalker At (size_t idx) const noexcept
 インデックスを指定して配列の要素にアクセスします。 [詳解]
 
MpWalker GetArrayCount (uint32_t *n) const noexcept
 配列が格納されている場合、配列のサイズを取得します。 [詳解]
 
std::pair< MpWalker, uint32_t > GetArrayCount () const noexcept
 配列が格納されている場合、配列のサイズを取得します。 [詳解]
 
連想配列
MpWalker operator[] (const nlib_utf8_t *key) const noexcept
 文字列を指定して連想配列の要素にアクセスします。
 
MpWalker At (size_t idx, const nlib_utf8_t **key, size_t *n) const noexcept
 インデックスを指定して連想配列の要素にアクセスします。 [詳解]
 
MpWalker Find (const nlib_utf8_t *key) const noexcept
 文字列を指定して連想配列の要素にアクセスします。 [詳解]
 
MpWalker GetMapCount (uint32_t *n) const noexcept
 連想配列が格納されている場合、連想配列のサイズを取得します。 [詳解]
 
std::pair< MpWalker, uint32_t > GetMapCount () const noexcept
 連想配列が格納されている場合、連想配列のサイズを取得します。 [詳解]
 
文字列
MpWalker GetString (const nlib_utf8_t **str, uint32_t *n) const noexcept
 str formatのデータを取得します。 [詳解]
 
std::tuple< MpWalker, const nlib_utf8_t *, uint32_t > GetString () const noexcept
 文字列が格納されている場合、文字列(str format)を取得します。 [詳解]
 
バイナリ
MpWalker GetBinary (const void **bin, uint32_t *n) const noexcept
 bin formatのデータを取得します。 [詳解]
 
std::tuple< MpWalker, const nlib_byte_t *, uint32_t > GetBinary () const noexcept
 文字列が格納されている場合、バイナリ(bin format)のデータを取得します。 [詳解]
 
拡張データ
MpWalker GetExt (int8_t *tp, const void **bin, uint32_t *n) const noexcept
 ext formatのデータを取得します。 [詳解]
 
MpWalker GetTimestamp (nlib_time *val) const noexcept
 タイムスタンプを取得します。 [詳解]
 
std::tuple< MpWalker, int8_t, const nlib_byte_t *, uint32_t > GetExt () const noexcept
 拡張データ型が格納されている場合、拡張データ型(ext format)のデータを取得します。 [詳解]
 
std::pair< MpWalker, nlib_timeGetTimestamp () const noexcept
 タイムスタンプ拡張型がが格納されている場合、nlib_time型の値として取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 
null及びブール値
MpWalker GetNil () const noexcept
 nilを取得します。 [詳解]
 
MpWalker GetBoolean (bool *val) const noexcept
 ブール値が格納されている場合、ブール値を取得します。 [詳解]
 
std::pair< MpWalker, bool > GetBoolean () const noexcept
 ブール値が格納されている場合、ブール値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 
数値
MpWalker GetInt (int32_t *val) const noexcept
 符号付き整数値を取得します。 [詳解]
 
MpWalker GetInt (int64_t *val) const noexcept
 符号付き整数値を取得します。 [詳解]
 
MpWalker GetUint (uint32_t *val) const noexcept
 符号なし整数値を取得します。 [詳解]
 
MpWalker GetUint (uint64_t *val) const noexcept
 符号なし整数値を取得します。 [詳解]
 
MpWalker GetFloat (float *val) const noexcept
 単精度浮動小数点数を取得します。 [詳解]
 
MpWalker GetDouble (double *val) const noexcept
 倍精度浮動小数点数を取得します。 [詳解]
 
std::pair< MpWalker, int32_t > GetInt32 () const noexcept
 int32_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 
std::pair< MpWalker, int64_t > GetInt64 () const noexcept
 int64_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 
std::pair< MpWalker, uint32_t > GetUint32 () const noexcept
 uint32_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 
std::pair< MpWalker, uint64_t > GetUint64 () const noexcept
 uint64_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 
std::pair< MpWalker, float > GetFloat () const noexcept
 float型に格納できる数値が格納されている場合、数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 
std::pair< MpWalker, double > GetDouble () const noexcept
 double型に格納できる数値が格納されている場合、数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。 [詳解]
 

詳解

メモリ上に展開されたMessagePackのデータに高速にアクセスします。

説明
JsonStreamParserを利用してMessagePackのデータ読み込む場合、MpObjectを動的に構築します。 この動作は便利なのですが、必要でないデータに関してもMpObjectが構築されることになる等のオーバーヘッドが問題となることがあります。
MpWalkerを利用して連想配列のキーや配列のインデックスを指定して必要な部分に移動してから、JsonStreamParserを利用することで必要なデータについてのみMpObjectを構築すれば、効率よくMessagePackのデータを利用することが可能になります。
飛ばし読みをして属性"key"以下のみをMpObjectとして構築するコード例を以下に示します。
const nlib_utf8_t* json = R"({ "a": { "key": "bad" }, "b" : [1, "key", 3], "key": ["That", "is", "correct"] })";
size_t n = ToMsgpack(buf, json);
MpWalker root(&buf[0], n);
MpWalker x = root["key"]; // moving to right after the toplevel key 'key'
SUCCEED_IF(x);
SUCCEED_IF(r.first == 0);
ToJson(parsed_value, *r.second.get());
nlib_printf("parsed value: %s\n", parsed_value);
/*
Output:
parsed value: ["That","is","correct"]
*/

MpWalker.h36 行目に定義があります。

構築子と解体子

◆ MpWalker()

nn::nlib::msgpack::MpWalker::MpWalker ( const void *  p,
size_t  n 
)
inlinenoexcept

初期化を行うコンストラクタです。

引数
[in]pMessagePackデータへのポインタ
[in]nデータサイズ

MpWalker.h39 行目に定義があります。

関数詳解

◆ At() [1/2]

nn::nlib::msgpack::MpWalker::At ( size_t  idx) const
noexcept

インデックスを指定して配列の要素にアクセスします。

引数
[in]idx配列のインデックス
戻り値
成功した場合、配列の要素の値を指すMpWalkerオブジェクト
説明
配列の要素を指し示すMpWalkerオブジェクトを返します。 配列でなかったり、指定されたインデックスが存在しない等の場合は、デフォルトコンストラクタで構築されたMpWalkerオブジェクトを返します。
結果は以下のコードのようにオブジェクトを評価することで判定可能です。
const nlib_utf8_t* json = R"(["a", "b", "c", "d", "e"])";
size_t n = ToMsgpack(buf, json);
MpWalker root(&buf[0], n);
nlib_printf("root[3]: %s\n", root[3] ? "exists" : "not exists");
nlib_printf("root[5]: %s\n", root[5] ? "exists" : "not exists");

◆ At() [2/2]

nn::nlib::msgpack::MpWalker::At ( size_t  idx,
const nlib_utf8_t **  key,
size_t *  n 
) const
noexcept

インデックスを指定して連想配列の要素にアクセスします。

引数
[in]idx連想配列のインデックス
[out]key対応する連想配列のキー(ヌル終端しません)
[out]n対応する連想配列のキーの長さ
戻り値
成功した場合、連想配列の値を指すMpWalkerオブジェクト

◆ Find()

nn::nlib::msgpack::MpWalker::Find ( const nlib_utf8_t key) const
noexcept

文字列を指定して連想配列の要素にアクセスします。

引数
[in]key連想配列のキー
戻り値
成功した場合、連想配列の値を指すMpWalkerオブジェクト
説明
連想配列の要素を指し示すMpWalkerオブジェクトを返します。 連想配列でなかったり、指定されたキーが存在しない等の場合は、デフォルトコンストラクタで構築されたMpWalkerオブジェクトを返します。
結果は以下のコードのようにオブジェクトを評価することで判定可能です。
const nlib_utf8_t* json = R"({"key1": 1, "key2" : 2, "key3" : 3})";
size_t n = ToMsgpack(buf, json);
MpWalker root(&buf[0], n);
nlib_printf("root[key2]: %s\n", root["key2"] ? "exists" : "not exists");
nlib_printf("root[key4]: %s\n", root["key4"] ? "exists" : "not exists");

◆ GetArrayCount() [1/2]

nn::nlib::msgpack::MpWalker::GetArrayCount ( uint32_t *  n) const
noexcept

配列が格納されている場合、配列のサイズを取得します。

引数
[out]n配列のサイズ
戻り値
成功した場合、次の要素(配列内の最初の要素)を指すMpWalkerオブジェクト

◆ GetArrayCount() [2/2]

nn::nlib::msgpack::MpWalker::GetArrayCount ( ) const
inlinenoexcept

配列が格納されている場合、配列のサイズを取得します。

戻り値
MpWalkerオブジェクトと配列のサイズのペア
説明
戻り値のMpWalkerオブジェクトは、成功した場合次の要素(配列内の最初の要素)を指し、失敗した場合は無効な値となります。
以下のコードは配列のサイズを取得し、配列の要素を1つずつ取得するサンプルです。
const nlib_utf8_t* json = R"([[1,2,3], "a", { "b" : 1 }, false, null])";
size_t n = ToMsgpack(buf, json);
MpWalker root(&buf[0], n);
auto ac_result = root.GetArrayCount();
SUCCEED_IF(ac_result.first);
nlib_printf("Array Count: %u\n", ac_result.second);
for (uint32_t i = 0; i < ac_result.second; ++i) {
auto r = JsonStreamParser::Parse(ac_result.first);
SUCCEED_IF(r.first == 0);
ToJson(parsed_value, *r.second.get());
nlib_printf("root[%u]: %s\n", i, parsed_value);
ac_result.first = ac_result.first.Skip();
SUCCEED_IF(ac_result.first);
}
/*
Output:
Array Count: 5
root[0]: [1,2,3]
root[1]: "a"
root[2]: {"b":1}
root[3]: false
root[4]: null
*/

MpWalker.h106 行目に定義があります。

◆ GetBinary() [1/2]

nn::nlib::msgpack::MpWalker::GetBinary ( const void **  bin,
uint32_t *  n 
) const
noexcept

bin formatのデータを取得します。

引数
[out]binバイナリへのポインタ
[out]nバイナリの長さ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-bin

◆ GetBinary() [2/2]

nn::nlib::msgpack::MpWalker::GetBinary ( ) const
inlinenoexcept

文字列が格納されている場合、バイナリ(bin format)のデータを取得します。

戻り値
MpWalkerオブジェクトとバイナリへのポインタとバイナリ長のタプル
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-bin

MpWalker.h87 行目に定義があります。

◆ GetBoolean() [1/2]

nn::nlib::msgpack::MpWalker::GetBoolean ( bool *  val) const
noexcept

ブール値が格納されている場合、ブール値を取得します。

引数
[out]valブール値へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetBoolean() [2/2]

nn::nlib::msgpack::MpWalker::GetBoolean ( ) const
inlinenoexcept

ブール値が格納されている場合、ブール値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとブール値のペア

MpWalker.h111 行目に定義があります。

◆ GetDouble() [1/2]

nn::nlib::msgpack::MpWalker::GetDouble ( double *  val) const
noexcept

倍精度浮動小数点数を取得します。

引数
[out]val倍精度浮動小数点数へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetDouble() [2/2]

nn::nlib::msgpack::MpWalker::GetDouble ( ) const
inlinenoexcept

double型に格納できる数値が格納されている場合、数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとdouble型の値のペア

MpWalker.h141 行目に定義があります。

◆ GetExt() [1/2]

nn::nlib::msgpack::MpWalker::GetExt ( int8_t *  tp,
const void **  bin,
uint32_t *  n 
) const
noexcept

ext formatのデータを取得します。

引数
[out]tpオブジェクトの型を示す数値
[out]binバイナリへのポインタ
[out]nバイナリの長さ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext

◆ GetExt() [2/2]

nn::nlib::msgpack::MpWalker::GetExt ( ) const
inlinenoexcept

拡張データ型が格納されている場合、拡張データ型(ext format)のデータを取得します。

戻り値
MpWalkerオブジェクト、オブジェクトの型を示す数値、バイナリへのポインタとバイナリ長のタプル
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-ext

MpWalker.h93 行目に定義があります。

◆ GetFloat() [1/2]

nn::nlib::msgpack::MpWalker::GetFloat ( float *  val) const
noexcept

単精度浮動小数点数を取得します。

引数
[out]val単精度浮動小数点数へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetFloat() [2/2]

nn::nlib::msgpack::MpWalker::GetFloat ( ) const
inlinenoexcept

float型に格納できる数値が格納されている場合、数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとfloat型の値のペア

MpWalker.h136 行目に定義があります。

◆ GetInt() [1/2]

nn::nlib::msgpack::MpWalker::GetInt ( int32_t *  val) const
noexcept

符号付き整数値を取得します。

引数
[out]val符号付き整数値へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetInt() [2/2]

nn::nlib::msgpack::MpWalker::GetInt ( int64_t *  val) const
noexcept

符号付き整数値を取得します。

引数
[out]val符号付き整数値へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetInt32()

nn::nlib::msgpack::MpWalker::GetInt32 ( ) const
inlinenoexcept

int32_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとint32_t型の値のペア

MpWalker.h116 行目に定義があります。

◆ GetInt64()

nn::nlib::msgpack::MpWalker::GetInt64 ( ) const
inlinenoexcept

int64_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとint64_t型の値のペア

MpWalker.h121 行目に定義があります。

◆ GetMapCount() [1/2]

nn::nlib::msgpack::MpWalker::GetMapCount ( uint32_t *  n) const
noexcept

連想配列が格納されている場合、連想配列のサイズを取得します。

引数
[out]n連想配列のサイズ
戻り値
成功した場合、次の要素(連想配列内の最初のキー)を指すMpWalkerオブジェクト

◆ GetMapCount() [2/2]

nn::nlib::msgpack::MpWalker::GetMapCount ( ) const
inlinenoexcept

連想配列が格納されている場合、連想配列のサイズを取得します。

戻り値
MpWalkerオブジェクトと連想配列のサイズのペア。
説明
戻り値のMpWalkerオブジェクトは、成功した場合次の要素(連想配列内の最初のキー)を指し、失敗した場合は無効な値となります。
以下のコードは連想配列のサイズを取得し、連想配列の要素を1つずつ取得するサンプルです。
const nlib_utf8_t* json = R"({"key1" : "value", "key2" : [1,2,3], "key3" : [true, null]})";
size_t n = ToMsgpack(buf, json);
MpWalker root(&buf[0], n);
auto ac_result = root.GetMapCount();
SUCCEED_IF(ac_result.first);
nlib_printf("Map Count: %u\n", ac_result.second);
for (uint32_t i = 0; i < ac_result.second; ++i) {
auto r = JsonStreamParser::Parse(ac_result.first);
SUCCEED_IF(r.first == 0);
ToJson(parsed_key, *r.second.get());
ac_result.first = ac_result.first.Skip();
SUCCEED_IF(ac_result.first);
r = JsonStreamParser::Parse(ac_result.first);
SUCCEED_IF(r.first == 0);
ToJson(parsed_value, *r.second.get());
nlib_printf("root[%s]: %s\n", parsed_key, parsed_value);
ac_result.first = ac_result.first.Skip();
SUCCEED_IF(ac_result.first);
}
/*
Output:
Map Count: 3
root["key1"]: "value"
root["key2"]: [1,2,3]
root["key3"]: [true,null]
*/

MpWalker.h101 行目に定義があります。

◆ GetNil()

nn::nlib::msgpack::MpWalker::GetNil ( ) const
noexcept

nilを取得します。

戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetPtr()

nn::nlib::msgpack::MpWalker::GetPtr ( ) const
inlinenoexcept

MessagePackデータの現在位置へのポインタを取得します。

戻り値
MessagePackデータへのポインタ

MpWalker.h57 行目に定義があります。

◆ GetSize()

nn::nlib::msgpack::MpWalker::GetSize ( ) const
inlinenoexcept

MessagePackデータのサイズを取得します。

戻り値
MessagePackデータのサイズ

MpWalker.h60 行目に定義があります。

◆ GetString() [1/2]

nn::nlib::msgpack::MpWalker::GetString ( const nlib_utf8_t **  str,
uint32_t *  n 
) const
noexcept

str formatのデータを取得します。

引数
[out]str文字列(ヌル終端しません)へのポインタ
[out]n文字列の長さ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト
説明
文字列がUTF-8であるかどうかのチェックは行われません。必要な場合はユーザー自身で行う必要があります。
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str

◆ GetString() [2/2]

nn::nlib::msgpack::MpWalker::GetString ( ) const
inlinenoexcept

文字列が格納されている場合、文字列(str format)を取得します。

戻り値
MpWalkerオブジェクトと文字列へのポインタと文字列長のタプル
説明
文字列へのポインタはバッファ内のアドレスを指しています。 文字列がUTF-8であるかどうかのチェックは行われません。必要な場合はユーザー自身で行う必要があります。
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-str

MpWalker.h82 行目に定義があります。

◆ GetTimestamp() [1/2]

nn::nlib::msgpack::MpWalker::GetTimestamp ( nlib_time val) const
noexcept

タイムスタンプを取得します。

引数
[out]val時刻の値へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetTimestamp() [2/2]

nn::nlib::msgpack::MpWalker::GetTimestamp ( ) const
inlinenoexcept

タイムスタンプ拡張型がが格納されている場合、nlib_time型の値として取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとnlib_time型の値のペア

MpWalker.h146 行目に定義があります。

◆ GetUint() [1/2]

nn::nlib::msgpack::MpWalker::GetUint ( uint32_t *  val) const
noexcept

符号なし整数値を取得します。

引数
[out]val符号なし整数値へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetUint() [2/2]

nn::nlib::msgpack::MpWalker::GetUint ( uint64_t *  val) const
noexcept

符号なし整数値を取得します。

引数
[out]val符号なし整数値へのポインタ
戻り値
成功した場合、次の要素を指すMpWalkerオブジェクト

◆ GetUint32()

nn::nlib::msgpack::MpWalker::GetUint32 ( ) const
inlinenoexcept

uint32_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとuint32_t型の値のペア

MpWalker.h126 行目に定義があります。

◆ GetUint64()

nn::nlib::msgpack::MpWalker::GetUint64 ( ) const
inlinenoexcept

uint64_t型に格納できる整数値が格納されている場合、整数値を取得します。戻り値のMpWalkerオブジェクトは、成功した場合次の要素を指し、失敗した場合は無効な値となります。

戻り値
MpWalkerオブジェクトとuint64_t型の値のペア

MpWalker.h131 行目に定義があります。

◆ Init()

nn::nlib::msgpack::MpWalker::Init ( const void *  p,
size_t  n 
)
inlinenoexcept

デフォルトコンストラクタを利用した場合はこの関数で初期化します。

引数
[in]pMessagePackデータへのポインタ
[in]nデータサイズ
戻り値
成功ならばtrue(常に成功)

MpWalker.h42 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: