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

MessagePack又はJSONを読み込むことで作成されるオブジェクトです。 [詳解]

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

公開型

enum  ObjectType {
  kNil = 0,
  kBoolean,
  kUint64,
  kInt64,
  kFloat,
  kDouble,
  kString,
  kArray,
  kMap,
  kBinary,
  kExt
}
 MpObjectに格納されているオブジェクトの型情報です。 [詳解]
 

公開メンバ関数

errno_t Resize (uint32_t n)
 配列や連想配列のリサイズをします。 [詳解]
 
MpObjectClone () const noexcept
 オブジェクトの複製を作成します。 [詳解]
 
uint32_t GetSize () const noexcept
 配列や連想配列や文字列やバイナリの場合にそのサイズを返します。 [詳解]
 
型専用アクセサクラスの利用

配列、連想配列等には専用のアクセサクラスを経由してアクセスすることもできます。反復子等が定義されています。

MpObjectAsArray AsArray () noexcept
 配列にアクセスするためのオブジェクトを返します。IsArray()が真である必要があります。
 
const MpObjectAsArray AsArray () const noexcept
 上記関数のconst修飾付き版です。
 
MpObjectAsMap AsMap () noexcept
 連想配列にアクセスするためのオブジェクトを返します。IsMap()が真である必要があります。
 
const MpObjectAsMap AsMap () const noexcept
 上記関数のconst修飾付き版です。
 
MpObjectAsString AsString () noexcept
 文字列にアクセスするためのオブジェクトを返します。IsString()が真である必要があります。
 
const MpObjectAsString AsString () const noexcept
 上記関数のconst修飾付き版です。
 
MpObjectAsBinary AsBinary () noexcept
 バイナリにアクセスするためのオブジェクトを返します。IsBinary()が真である必要があります。
 
const MpObjectAsBinary AsBinary () const noexcept
 上記関数のconst修飾付き版です。
 
MpObjectAsExt AsExt () noexcept
 拡張データ型にアクセスするためのオブジェクトを返します。IsExt()が真である必要があります。
 
const MpObjectAsExt AsExt () const noexcept
 上記関数のconst修飾付き版です。
 
配列型(kArray型)の利用
MpObjectGetArrayItem (size_t n) noexcept
 インデックスを指定して配列内のオブジェクトを取得します。 [詳解]
 
const MpObjectGetArrayItem (size_t n) const noexcept
 上記関数のconst修飾付き版です。
 
MpObjectoperator[] (size_t n)
 配列である場合に配列の要素への参照を返します。 [詳解]
 
const MpObjectoperator[] (size_t n) const
 上記関数のconst修飾付き版です。
 
MpObjectAppendArrayItem () noexcept
 オブジェクトが配列を格納している場合、要素を末尾に追加します。 [詳解]
 
MpObjectInsertArrayItem (size_t n) noexcept
 オブジェクトが配列を格納している場合、要素を指定されたインデックスの場所に挿入します。 [詳解]
 
errno_t GetArrayItem (size_t n, MpObject **obj) noexcept
 インデックスを指定して配列内のオブジェクトを取得します。 [詳解]
 
errno_t GetArrayItem (size_t n, const MpObject **obj) const noexcept
 上記関数のconst修飾付き版です。
 
errno_t RemoveArrayItem (size_t n, MpObject *obj) noexcept
 インデックスを指定して配列内のオブジェクトを削除します。 [詳解]
 
errno_t InitArray (uint32_t n) noexcept
 オブジェクトをn 個の要素を持つ配列として初期化します。 [詳解]
 
連想配列型(kMap型)の利用
const MpObjectGetMapItem (const nlib_utf8_t *str) const noexcept
 上記関数のconst修飾付き版です。
 
MpObjectGetMapItem (const nlib_utf8_t *str) noexcept
 文字列を指定して連想配列内のオブジェクトを取得します。 [詳解]
 
template<class STDSTRING >
const MpObjectGetMapItem (const STDSTRING &str) const noexcept
 上記関数のconst修飾付き版です。
 
template<class STDSTRING >
MpObjectGetMapItem (const STDSTRING &str) noexcept
 文字列を指定して連想配列内のオブジェクトを取得します。 [詳解]
 
MpObjectKvAppendMapItem () noexcept
 オブジェクトが連想配列を格納している場合、要素を末尾に追加します。 [詳解]
 
errno_t GetMapItem (size_t n, MpObjectKv **obj) noexcept
 インデックスを指定して連想配列内のオブジェクトを取得します。 [詳解]
 
errno_t GetMapItem (size_t n, const MpObjectKv **obj) const noexcept
 上記関数のconst修飾付き版です。
 
errno_t GetMapItem (const nlib_utf8_t *str, size_t n, MpObjectKv **obj) noexcept
 キーとなる非ヌル終端の文字列を指定して連想配列のキーと値のペアを取得します。 [詳解]
 
errno_t GetMapItem (const nlib_utf8_t *str, size_t n, const MpObjectKv **obj) const noexcept
 キーとなる非ヌル終端の文字列を指定して連想配列のキーと値のペアを取得します。
 
errno_t RemoveMapItem (size_t n, MpObjectKv *kv) noexcept
 インデックスを指定して連想配列内のキーとオブジェクトを削除します。 [詳解]
 
errno_t RemoveMapItem (const nlib_utf8_t *key, MpObjectKv *kv) noexcept
 キーを指定して連想配列内のキーとオブジェクトを削除します。 [詳解]
 
template<class STDSTRING >
errno_t RemoveMapItem (const STDSTRING &str, MpObjectKv *kv) noexcept
 キーを指定して連想配列内のキーとオブジェクトを削除します。 [詳解]
 
errno_t InitMap (uint32_t n) noexcept
 オブジェクトをn個の要素を持つ連想配列として初期化します。 [詳解]
 
コンストラクタ、デストラクタ、及び初期化
 MpObject () noexcept
 デフォルトコンストラクタです。 nil型に設定されます。
 
 ~MpObject () noexcept
 デストラクタです。
 
 MpObject (MpObject &&rhs) noexcept
 ムーブコンストラクタです。
 
MpObjectoperator= (MpObject &&rhs) noexcept
 ムーブ代入演算子です。
 
 MpObject (MpObject &rhs, move_tag) noexcept
 ムーブコンストラクタに相当します。
 
MpObjectassign (MpObject &rhs, move_tag) noexcept
 swapを利用したムーブにより代入します。
 
template<class T >
 MpObject (const T &x)
 T型のオブジェクトをボックス化するコンストラクタです。 [詳解]
 
文字列型(STRING型)の利用
nlib_utf8_tGetString () noexcept
 オブジェクトから文字列を取得します。
 
const nlib_utf8_tGetString () const noexcept
 上記関数のconst修飾付き版です。
 
errno_t InitString (uint32_t n) noexcept
 オブジェクトを文字列として初期化します。 [詳解]
 
errno_t InitString (const nlib_utf8_t *str, uint32_t n) noexcept
 オブジェクトを文字列として初期化します。 [詳解]
 
errno_t InitString (const nlib_utf8_t *str) noexcept
 オブジェクトを文字列として初期化します。 [詳解]
 
バイナリ型(BINARY型)の利用
void * GetBinary (uint32_t *n) noexcept
 オブジェクトからバイナリを取得します。
 
const void * GetBinary (uint32_t *n) const noexcept
 オブジェクトからバイナリを取得します。
 
std::tuple< errno_t, const nlib_byte_t *, uint32_t > GetBinary () const noexcept
 バイナリデータを取り出します。バイナリ型ではない場合、エラー値にEACCESが設定されます。 [詳解]
 
errno_t InitBinary (uint32_t n) noexcept
 オブジェクトをバイナリとして初期化します。 [詳解]
 
errno_t InitBinary (const void *p, uint32_t n) noexcept
 オブジェクトをバイナリとして初期化します。 [詳解]
 
拡張データ型(<tt>kExt</tt>
void * GetExt (int8_t *tp, uint32_t *n) noexcept
 オブジェクトから拡張データ型を取得します。 [詳解]
 
const void * GetExt (int8_t *tp, uint32_t *n) const noexcept
 オブジェクトから拡張データ型を取得します。
 
std::tuple< errno_t, int8_t, const nlib_byte_t *, uint32_t > GetExt () const noexcept
 拡張データを取り出します。拡張データ型ではない場合、エラー値にEACCESが設定されます。 [詳解]
 
std::pair< errno_t, nlib_timeGetTimestamp () const noexcept
 オブジェクトからタイムスタンプを取得します。 [詳解]
 
errno_t InitExt (int8_t tp, uint32_t n) noexcept
 オブジェクトを拡張データ型として初期化します。 [詳解]
 
errno_t InitExt (int8_t tp, const void *p, uint32_t n) noexcept
 オブジェクトを拡張データ型として初期化します。 [詳解]
 
errno_t InitTimestamp (nlib_time t) noexcept
 オブジェクトを拡張データ型のタイムスタンプとして初期化します。 [詳解]
 
ボックス化

数値・文字列・ベクタ等をボックス化してMpObjectのインスタンスとして格納します。

errno_t Box (const nlib_utf8_t *str) noexcept
 文字列をボックス化します。 [詳解]
 
template<uint32_t n>
errno_t Box (const nlib_utf8_t(&str)[n]) noexcept
 文字列をボックス化します。 [詳解]
 
template<class T , uint32_t n>
errno_t Box (const T(&vec)[n])
 配列をボックス化します。 [詳解]
 
template<class T >
errno_t Box (const T &v)
 オブジェクトをボックス化します。 [詳解]
 
template<class T >
MpObjectoperator= (const T &x)
 値をMpObjectに代入します。 [詳解]
 
アンボックス化

MpObjectのインスタンスをアンボックス化して数値・文字列・ベクタ等に格納します。

template<class T , size_t n>
errno_t Unbox (T(&a)[n]) const
 オブジェクトの値をアンボックス化します。 [詳解]
 
template<size_t n>
errno_t Unbox (nlib_utf8_t(&str)[n]) const noexcept
 Unbox(T (&a)[n]) を御覧ください。
 
template<class T >
errno_t Unbox (T *a, size_t n) const
 配列データをアンボックス化します。 [詳解]
 
errno_t Unbox (nlib_utf8_t *str, size_t n) const noexcept
 Unbox(T* a, size_t n) の説明を御覧ください。
 
template<class T >
errno_t Unbox (T v) const
 オブジェクトをアンボックス化します。 [詳解]
 
型の取得と判定
ObjectType GetType () const noexcept
 オブジェクトの型を返します。 [詳解]
 
bool IsNil () const noexcept
 格納されている値ががnilであるかどうかを調べます。
 
bool IsBoolean () const noexcept
 格納されている値が真偽値であるかどうかを調べます。
 
bool IsInteger () const noexcept
 格納されている値が整数値であるかどうかを調べます。
 
bool IsFloat () const noexcept
 格納されている値が単精度浮動小数点型であるかどうかを調べます。
 
bool IsDouble () const noexcept
 格納されている値が倍精度浮動小数点型であるかどうかを調べます。
 
bool IsString () const noexcept
 格納されている値が文字列であるかどうかを調べます。
 
bool IsBinary () const noexcept
 格納されている値がバイナリであるかどうかを調べます。
 
bool IsExt () const noexcept
 格納されている値が拡張データであるかどうかを調べます。
 
bool IsArray () const noexcept
 格納されている値が配列であるかどうかを調べます。
 
bool IsMap () const noexcept
 格納されている値が連想配列であるかどうかを調べます。
 

静的公開メンバ関数

static bool IsJsonPointer (const nlib_utf8_t *first, const nlib_utf8_t *last) noexcept
 文字列を指定してJSON Pointerであるかどうかを判定します。 [詳解]
 
static bool IsJsonPointer (const nlib_utf8_t *str) noexcept
 上記関数の引数省略版で、ヌル終端する文字列を受け取ります。
 
static errno_t ResolveJsonPointer (MpObject **result, MpObject *root, const nlib_utf8_t *json_pointer) noexcept
 json_pointerによって参照されるMpObject*resultに格納します。 [詳解]
 
static errno_t DigByJsonPointer (MpObject **result, MpObject *root, const nlib_utf8_t *json_pointer) noexcept
 json_pointerによってMpObjectを参照しますが、新たにMpObjectを追加する場合があります。 [詳解]
 
static errno_t RemoveByJsonPointer (MpObjectKv *removed, MpObject *root, const nlib_utf8_t *json_pointer) noexcept
 json_pointerによって参照されるMpObjectを削除してremovedに格納します。 [詳解]
 

詳解

MessagePack又はJSONを読み込むことで作成されるオブジェクトです。

説明
Boxメソッドによるボックス化、又はJSONやMessagePackのデータを読み込んで作成される動的型つきオブジェクトです。 静的型オブジェクトへの変換はUnboxメソッドを用いて行います。 デフォルトでBox化とUnbox化に対応している型は、各種数値型, 配列, 文字列, bool, nil, std::pair, std::vector, std::map, std::stringです。 C++11においては、std::array, std::unordered_map, std::tupleにも対応します。
ユーザー定義型をBox化する場合は、次の2つの関数テンプレートを特殊化する必要があります。
例えば以下のような形になります。エラーが発生した場合は0以外を返す必要があります。
bool BoxCustomData() {
Vec3 vec = { 1.f, 2.f, 3.f };
MpObject obj;
SUCCEED_IF(obj.Box(vec) == 0);
float x, y, z;
auto ar = obj.AsArray();
ar[0].Unbox(&x);
ar[1].Unbox(&y);
ar[2].Unbox(&z);
nlib_printf("obj[0]: %f, obj[1]: %f, obj[2]: %f\n", x, y, z);
return true;
/*
Output:
obj[0]: 1.000000, obj[1]: 2.000000, obj[2]: 3.000000
*/
}
bool UnboxCustomData() {
Vec3 vec;
MpObject obj;
obj.InitArray(3);
auto ar = obj.AsArray();
ar[0].Box(1.f);
ar[1].Box(2.f);
ar[2].Box(3.f);
SUCCEED_IF(obj.Unbox(&vec) == 0);
nlib_printf("Vec.x: %f, Vec.y: %f, Vec.z: %f\n", vec.x, vec.y, vec.z);
return true;
/*
Output:
Vec.x: 1.000000, Vec.y: 2.000000, Vec.z: 3.000000
*/
}
errno_t型を返す関数は、0以外には以下の値を返す可能性があります。
  • EINVAL: 引数が不正です
  • ENOMEM: メモリの確保に失敗しました
  • EACCES: 型変換に失敗しました。
  • ERANGE: 配列等のインデックスが範囲外です。
  • EILSEQ: データにエラーがあります。

MpObject.h96 行目に定義があります。

列挙型メンバ詳解

◆ ObjectType

MpObjectに格納されているオブジェクトの型情報です。

説明
GetType()で取得できます。
列挙値
kNil 

nil型を表します。

kBoolean 

真偽値型を表します。内部表現はboolです。

kUint64 

非負整数型を表します。内部表現はuint64_tです。

kInt64 

整数型を表します。内部表現はint64_tです。

kFloat 

浮動小数型を表します。内部表現はfloatです。

kDouble 

浮動小数型を表します。内部表現はdoubleです。

kString 

バイト列(文字列)を表します。

kArray 

配列を表します。内部ではMpObjectの列として表現されています。

kMap 

連想配列を表します。内部ではMpObjectのペアの列として表現されています。

kBinary 

msgpack専用でバイナリデータを表します。

kExt 

msgpack専用で拡張データ型を表します。

MpObject.h336 行目に定義があります。

構築子と解体子

◆ MpObject()

template<class T >
nn::nlib::msgpack::MpObject::MpObject ( const T &  x)
inline

T型のオブジェクトをボックス化するコンストラクタです。

テンプレート引数
Tボックス化対象の型
引数
[in]xMpObjectへボックス化する値

MpObject.h197 行目に定義があります。

関数詳解

◆ AppendArrayItem()

nn::nlib::msgpack::MpObject::AppendArrayItem ( )
noexcept

オブジェクトが配列を格納している場合、要素を末尾に追加します。

戻り値
成功した場合は追加された要素へのポインタ。失敗した場合はNULL

◆ AppendMapItem()

nn::nlib::msgpack::MpObject::AppendMapItem ( )
noexcept

オブジェクトが連想配列を格納している場合、要素を末尾に追加します。

戻り値
成功した場合は追加された要素へのポインタ。失敗した場合はNULL

◆ Box() [1/4]

nn::nlib::msgpack::MpObject::Box ( const nlib_utf8_t str)
noexcept

文字列をボックス化します。

引数
[in]str文字列
戻り値
0ならば成功。それ以外はエラー
説明
文字列はkString型のデータとして格納されます。

◆ Box() [2/4]

template<uint32_t n>
errno_t nn::nlib::msgpack::MpObject::Box ( const nlib_utf8_t(&)  str[n])
noexcept

文字列をボックス化します。

テンプレート引数
n配列のサイズ
引数
[in]strヌル終端する文字列
戻り値
0ならば成功。それ以外はエラー
説明
文字列はkString型のデータとして格納されます。

MpObject.h1258 行目に定義があります。

◆ Box() [3/4]

template<class T, uint32_t n>
errno_t nn::nlib::msgpack::MpObject::Box ( const T(&)  vec[n])

配列をボックス化します。

引数
[in]vecボックス化する配列
テンプレート引数
T要素の型
n要素数
戻り値
0ならば成功
説明
Tの型により、ボックス化の動作が異なります。以下の表に動作の違いを示します。
Tの型 説明
nlib_utf8_t 文字列としてヌル文字までの文字列がMpObject::kString型にボックス化される。
それ以外 配列としてMpObject::kArray型にボックス化される。

MpObject.h1267 行目に定義があります。

◆ Box() [4/4]

template<class T >
nn::nlib::msgpack::MpObject::Box ( const T &  v)
inline

オブジェクトをボックス化します。

テンプレート引数
Tボックス化するオブジェクトの型
引数
[in]vボックス化するオブジェクト
戻り値
0ならば成功。それ以外はエラー。
説明
静的型オブジェクトをボックス化して動的型オブジェクトに変換します。 ボックス化の途中で動的にメモリを確保する場合、失敗した場合に0以外を返します。
Tの型により動作は異なります。以下の表に動作の違いを示します。
Tの型 説明
nil MpObject::kNil型として格納されます。この操作でエラーを返すことはありません。
bool MpObject::kBoolean型として格納されます。この操作でエラーを返すことはありません。
符号つき整数型 MpObject::kInt64型として格納されます。この操作でエラーを返すことはありません。
符号なし整数型 MpObject::kUint64型として格納されます。この操作でエラーを返すことはありません。
float MpObject::kFloat型として格納されます。この操作でエラーを返すことはありません。
double MpObject::kDouble型として格納されます。この操作でエラーを返すことはありません。
std::string MpObject::kString型として格納されます。
std::vector MpObject::kArray型として格納されます。
Nlist MpObject::kArray型として格納されます。
std::pair サイズが2のMpObject::kArray型として格納されます。
std::map MpObject::kMap型として格納されます。
std::array MpObject::kArray型として格納されます。
std::tuple MpObject::kArray型として格納されます。
std::unordered_map MpObject::kMap型として格納されます。
なお、配列をボックス化する場合、通常は配列としてボックス化されますが、char型の配列のみは文字列としてボックス化されます。 以下がコード例になります。
int ar[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
MpObject ar_obj;
SUCCEED_IF(ar_obj.Box(ar) == 0);
NLIB_ASSERT(ar_obj.IsArray());
NLIB_ASSERT(ar_obj.GetSize() == 10);
std::vector<int> vec(&ar[0], &ar[0] + 10);
MpObject vec_obj;
SUCCEED_IF(vec_obj.Box(vec) == 0);
NLIB_ASSERT(vec_obj.IsArray());
NLIB_ASSERT(vec_obj.GetSize() == 10);
MpObject str_obj;
const char str[] = "string data";
SUCCEED_IF(str_obj.Box(str) == 0);
SUCCEED_IF(str_obj.IsString());
SUCCEED_IF(str_obj.GetSize() == 11);

MpObject.h288 行目に定義があります。

◆ Clone()

nn::nlib::msgpack::MpObject::Clone ( ) const
noexcept

オブジェクトの複製を作成します。

戻り値
複製されたオブジェクトへのポインタ
説明
途中で複製に失敗した場合は、それまでの複製のために確保したメモリを全て解放してNULLを返します。

◆ DigByJsonPointer()

nn::nlib::msgpack::MpObject::DigByJsonPointer ( MpObject **  result,
MpObject root,
const nlib_utf8_t json_pointer 
)
staticnoexcept

json_pointerによってMpObjectを参照しますが、新たにMpObjectを追加する場合があります。

引数
[in,out]resultjson_pointerによって参照されたオブジェクト
[in]rootjson_pointerによる参照の起点となる根元のオブジェクト
[in]json_pointerJSON Pointerの文字列
戻り値
0json_pointerの最後の参照トークンが辿れず、辿れるように新たにMpObjectが作成された場合
EEXIST既にjson_pointerが指し示すMpObjectが存在する場合
EINVALresult, root, 又はjson_pointerNULLの場合
EILSEQjson_pointerの文法が間違っていた場合
ENOENTjson_pointer内の最後でない参照トークンを辿ることができなかった場合
ENOMEMメモリの確保に失敗した場合
説明
JSON Pointer(RFC6901)によって規定された文字列によりJSONのツリー構造をたどりMpObjectを取得します。 ただし、json_pointerの末端に対応するMpObjectが存在しない場合は新たにMpObjectが作成されます。 戻り値が0かEEXISTの場合は*resultjson_pointerを辿った先のMpObjectへのポインタが設定されます。
以下の点に注意してください。
  • json_pointerの末端の参照トークンによって配列が参照される場合、MpObjectが配列に挿入されること
  • json_pointerの末端以外の参照トークンを辿れなかった場合はENOENTエラーになること。
以下にコード例と実行結果を示します。
const char* json1 = R"({ "a": { "foo": 1 } })";
auto obj = ToMpObject(json1);
e = MpObject::DigByJsonPointer(&node, obj.get(), "/a/b");
SUCCEED_IF(e == 0);
ToJson(to, *obj);
nlib_printf("Dig(%s, '/a/b') --> %s\n", json1, to);
obj = ToMpObject(json1);
e = MpObject::DigByJsonPointer(&node, obj.get(), "/a/foo");
ToJson(to, *obj);
nlib_printf("Dig(%s, '/a/foo') --> %s(err = %s)\n", json1, to, nlib_error_string(e));
const char* json2 = R"([0,1,2])";
obj = ToMpObject(json2);
e = MpObject::DigByJsonPointer(&node, obj.get(), "/-");
SUCCEED_IF(e == 0);
ToJson(to, *obj);
nlib_printf("Dig(%s, '/-') --> %s\n", json2, to);
obj = ToMpObject(json2);
e = MpObject::DigByJsonPointer(&node, obj.get(), "/1");
SUCCEED_IF(e == 0);
ToJson(to, *obj);
nlib_printf("Dig(%s, '/1') --> %s\n", json2, to);
const char* json3 = R"({ "q": { "bar": 2 } })";
obj = ToMpObject(json3);
e = MpObject::DigByJsonPointer(&node, obj.get(), "/a/b");
ToJson(to, *obj);
nlib_printf("Dig(%s, '/a/b') --> %s(err = %s)\n", json3, to, nlib_error_string(e));
/*
Output:
Dig({ "a": { "foo": 1 } }, '/a/b') --> {"a":{"foo":1,"b":null}}
Dig({ "a": { "foo": 1 } }, '/a/foo') --> {"a":{"foo":1}}(err = EEXIST)
Dig([0,1,2], '/-') --> [0,1,2,null]
Dig([0,1,2], '/1') --> [0,null,1,2]
Dig({ "q": { "bar": 2 } }, '/a/b') --> {"q":{"bar":2}}(err = ENOENT)
*/
また、この関数はJSON Patch(RFC6902)のadd演算のうち、値の設定以外の動作を行います。 詳細はRFCをご覧ください。
参照
https://tools.ietf.org/html/rfc6901
https://tools.ietf.org/html/rfc6902
https://triple-underscore.github.io/RFC6901-ja.html
https://triple-underscore.github.io/RFC6902-ja.html

◆ GetArrayItem() [1/2]

MpObject * nn::nlib::msgpack::MpObject::GetArrayItem ( size_t  n)
inlinenoexcept

インデックスを指定して配列内のオブジェクトを取得します。

引数
[in]n配列のインデックス
戻り値
インデックスに対応するオブジェクト(MpObject)へのポインタ
説明
取得に失敗した場合はNULLを返します。

MpObject.h521 行目に定義があります。

◆ GetArrayItem() [2/2]

nn::nlib::msgpack::MpObject::GetArrayItem ( size_t  n,
MpObject **  obj 
)
noexcept

インデックスを指定して配列内のオブジェクトを取得します。

引数
[in]n配列のインデックス
[out]objオブジェクトのポインタ(MpObject)が格納されるポインタ
戻り値
0ならば成功。それ以外はエラー。

◆ GetBinary()

std::tuple< errno_t, const nlib_byte_t *, uint32_t > nn::nlib::msgpack::MpObject::GetBinary ( ) const
inlinenoexcept

バイナリデータを取り出します。バイナリ型ではない場合、エラー値にEACCESが設定されます。

戻り値
エラー値、MpObjectが保持するバイナリへのポインタ及びサイズのタプル

MpObject.h755 行目に定義があります。

◆ GetExt() [1/2]

void * nn::nlib::msgpack::MpObject::GetExt ( int8_t *  tp,
uint32_t *  n 
)
inlinenoexcept

オブジェクトから拡張データ型を取得します。

引数
[out]tpデータ型を示す整数
[out]nバイナリのサイズ
戻り値
拡張データ型のバイナリへのポインタ

MpObject.h783 行目に定義があります。

◆ GetExt() [2/2]

std::tuple< errno_t, int8_t, const nlib_byte_t *, uint32_t > nn::nlib::msgpack::MpObject::GetExt ( ) const
inlinenoexcept

拡張データを取り出します。拡張データ型ではない場合、エラー値にEACCESが設定されます。

戻り値
エラー値、拡張データのデータ型、MpObjectが保持するバイナリへのポインタ及びサイズのタプル

MpObject.h792 行目に定義があります。

◆ GetMapItem() [1/4]

nn::nlib::msgpack::MpObject::GetMapItem ( const nlib_utf8_t str)
noexcept

文字列を指定して連想配列内のオブジェクトを取得します。

引数
[in]str連想配列のキー文字列
戻り値
対応するオブジェクト(MpObject)へのポインタ
説明
連想配列で文字列のキーに対応する値オブジェクトを取得します。 探索は線形に行われ、取得に失敗した場合はNULLを返します。

◆ GetMapItem() [2/4]

template<class STDSTRING >
nn::nlib::msgpack::MpObject::GetMapItem ( const STDSTRING &  str)
inlinenoexcept

文字列を指定して連想配列内のオブジェクトを取得します。

テンプレート引数
STDSTRINGstd::stringと互換性のある型
引数
[in]str連想配列のキー文字列
戻り値
対応するオブジェクト(MpObject)へのポインタ
説明
連想配列で文字列のキーに対応する値オブジェクトを取得します。 文字列以外がキーとなっている場合には、GetMapItem(size_t n, MpObjectKv** obj)を利用する必要があります。 また、探索は線形に行われます。取得に失敗した場合はNULLを返します。

MpObject.h160 行目に定義があります。

◆ GetMapItem() [3/4]

nn::nlib::msgpack::MpObject::GetMapItem ( size_t  n,
MpObjectKv **  obj 
)
noexcept

インデックスを指定して連想配列内のオブジェクトを取得します。

引数
[in]n連想配列のインデックス
[out]obj連想配列のキーと値のペア(MpObjectKv*)が格納されるポインタ
戻り値
0ならば成功。それ以外はエラー。

◆ GetMapItem() [4/4]

nn::nlib::msgpack::MpObject::GetMapItem ( const nlib_utf8_t str,
size_t  n,
MpObjectKv **  obj 
)
inlinenoexcept

キーとなる非ヌル終端の文字列を指定して連想配列のキーと値のペアを取得します。

引数
[in]str連想配列のキー文字列
[in]n文字列の長さ
[out]obj連想配列のキーと値のペア(MpObjectKv*)が格納されるポインタ
戻り値
0成功した場合
EINVALstr又はobjNULLだった場合
EACCESこのオブジェクトが連想配列でなかった場合
ENOENT与えられたキー文字列に対応する値が見つからなかった場合

MpObject.h205 行目に定義があります。

◆ GetSize()

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

配列や連想配列や文字列やバイナリの場合にそのサイズを返します。

戻り値
配列や連想配列のサイズ
説明
オブジェクトが配列や連想配列や文字列やバイナリでない場合は、戻り値は不定です。 文字列の場合は、原則的にはstrlenの値と一致しますが、文字列の途中にヌル文字が存在する場合は一致しません。

MpObject.h354 行目に定義があります。

◆ GetTimestamp()

nn::nlib::msgpack::MpObject::GetTimestamp ( ) const
noexcept

オブジェクトからタイムスタンプを取得します。

戻り値
エラー値とタイムスタンプのペア。エラー値が0ならば成功。
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-timestamp

◆ GetType()

nn::nlib::msgpack::MpObject::GetType ( ) const
inlinenoexcept

オブジェクトの型を返します。

戻り値
オブジェクトの型

MpObject.h353 行目に定義があります。

◆ InitArray()

nn::nlib::msgpack::MpObject::InitArray ( uint32_t  n)
noexcept

オブジェクトをn 個の要素を持つ配列として初期化します。

引数
[in]n初期化する配列のサイズ
戻り値
0ならば成功。それ以外はエラー

◆ InitBinary() [1/2]

nn::nlib::msgpack::MpObject::InitBinary ( uint32_t  n)
noexcept

オブジェクトをバイナリとして初期化します。

引数
[in]nバイナリのサイズ
戻り値
0ならば成功。それ以外はエラー

◆ InitBinary() [2/2]

nn::nlib::msgpack::MpObject::InitBinary ( const void *  p,
uint32_t  n 
)
noexcept

オブジェクトをバイナリとして初期化します。

引数
[in]pバイナリへのポインタ
[in]nバイナリのサイズ
戻り値
0ならば成功。それ以外はエラー

◆ InitExt() [1/2]

nn::nlib::msgpack::MpObject::InitExt ( int8_t  tp,
uint32_t  n 
)
noexcept

オブジェクトを拡張データ型として初期化します。

引数
[in]tpデータ型を示す整数
[in]nバイナリのサイズ
戻り値
0ならば成功。それ以外はエラー

◆ InitExt() [2/2]

nn::nlib::msgpack::MpObject::InitExt ( int8_t  tp,
const void *  p,
uint32_t  n 
)
noexcept

オブジェクトを拡張データ型として初期化します。

引数
[in]tpデータ型を示す整数
[in]pバイナリへのポインタ
[in]nバイナリのサイズ
戻り値
0ならば成功。それ以外はエラー

◆ InitMap()

nn::nlib::msgpack::MpObject::InitMap ( uint32_t  n)
noexcept

オブジェクトをn個の要素を持つ連想配列として初期化します。

引数
[in]n初期化する連想配列のサイズ
戻り値
0ならば成功。それ以外はエラー

◆ InitString() [1/3]

nn::nlib::msgpack::MpObject::InitString ( uint32_t  n)
noexcept

オブジェクトを文字列として初期化します。

引数
[in]n初期化する文字列の(終端文字を含まない)長さ
戻り値
0ならば成功。それ以外はエラー

◆ InitString() [2/3]

nn::nlib::msgpack::MpObject::InitString ( const nlib_utf8_t str,
uint32_t  n 
)
noexcept

オブジェクトを文字列として初期化します。

引数
[in]str文字列
[in]n初期化する文字列の(終端文字を含まない)長さ
戻り値
0ならば成功。それ以外はエラー

◆ InitString() [3/3]

nn::nlib::msgpack::MpObject::InitString ( const nlib_utf8_t str)
inlinenoexcept

オブジェクトを文字列として初期化します。

引数
[in]str文字列
戻り値
0ならば成功。それ以外はエラー

MpObject.h267 行目に定義があります。

◆ InitTimestamp()

nn::nlib::msgpack::MpObject::InitTimestamp ( nlib_time  t)
noexcept

オブジェクトを拡張データ型のタイムスタンプとして初期化します。

引数
[in]t時刻
戻り値
0ならば成功。それ以外はエラー
参照
https://github.com/msgpack/msgpack/blob/master/spec.md#formats-timestamp

◆ InsertArrayItem()

nn::nlib::msgpack::MpObject::InsertArrayItem ( size_t  n)
noexcept

オブジェクトが配列を格納している場合、要素を指定されたインデックスの場所に挿入します。

引数
[in]n配列のインデックス
戻り値
成功した場合は挿入された要素へのポインタ。失敗した場合はNULL

◆ IsJsonPointer()

nn::nlib::msgpack::MpObject::IsJsonPointer ( const nlib_utf8_t first,
const nlib_utf8_t last 
)
staticnoexcept

文字列を指定してJSON Pointerであるかどうかを判定します。

引数
[in]first検査する文字列の先頭
[in]last検査する文字列の末尾
戻り値
trueなら文字列はJSON Pointer
説明
JSON Pointerの構文は単純ですが、空文字列や'/'で終わる文字列など注意すべき点もあります。 コーナーケースについて以下のコードにまとめてあります。
const char* valid[] = {
"", // the whole document
"/foo",
"/foo/0",
"/foo/", // keys = ["foo", ""]
"/", // key=""
"/a~1b", // key="a/b"
"/ ", // key=" "
"/m~0n" // key="m~n"
};
for (auto& str : valid) {
SUCCEED_IF(MpObject::IsJsonPointer(str));
}
const char* invalid[] = {
"foo", // no relative path
"/m~2n" // only ~0 and ~1
"/m~xn" // use "/m~0xn"
};
for (auto& str : invalid) {
SUCCEED_IF(!MpObject::IsJsonPointer(str));
}

◆ operator=()

template<class T >
nn::nlib::msgpack::MpObject::operator= ( const T &  x)
inline

値をMpObjectに代入します。

テンプレート引数
T代入するオブジェクトの型
引数
[in]x代入する値
戻り値
*thisの参照を返します。
説明
代入できる型は、ボックス化の際にエラーが発生することのない型(値型)に限られています。 それ以外の型の場合はボックス化,又はスワップを利用する必要があります。
obj = 1; // same as obj.Box(1)
obj = 1.2f; // same as obj.Box(1.2f)
// obj = "abc"; // error
obj.Box("abc"); // ok

MpObject.h328 行目に定義があります。

◆ operator[]()

nn::nlib::msgpack::MpObject::operator[] ( size_t  n)
inline

配列である場合に配列の要素への参照を返します。

引数
[in]n配列のインデックス
戻り値
配列の要素となるMpObjectへの参照
説明
配列でない場合やインデックスが配列の範囲外である場合の動作は不定です。

MpObject.h135 行目に定義があります。

◆ RemoveArrayItem()

nn::nlib::msgpack::MpObject::RemoveArrayItem ( size_t  n,
MpObject obj 
)
noexcept

インデックスを指定して配列内のオブジェクトを削除します。

引数
[in]n配列のインデックス
[in,out]objNULLでない場合は削除されたオブジェクトが格納されます。
戻り値
0ならば成功。それ以外はエラー。

◆ RemoveByJsonPointer()

nn::nlib::msgpack::MpObject::RemoveByJsonPointer ( MpObjectKv removed,
MpObject root,
const nlib_utf8_t json_pointer 
)
staticnoexcept

json_pointerによって参照されるMpObjectを削除してremovedに格納します。

引数
[in,out]removedjson_pointerによって参照されたキーと値のペア
[in]rootjson_pointerによる参照の起点となる根元のオブジェクト
[in]json_pointerJSON Pointerの文字列
戻り値
0成功した場合
ECHILDjson_pointerが空文字列なので、rootが削除された場合
EINVALremoved, root, 又はjson_pointerNULLの場合
EILSEQjson_pointerの文法が間違っていた場合
ENOENTjson_pointerによって参照されるオブジェクトが存在しない場合
説明
JSON Pointer(RFC6901)によって規定された文字列によりJSONのツリー構造をたどりMpObjectを削除します。 削除されたキーと値のペアはremovedに格納されます。 配列の要素が削除される場合には、removed->firstにインデックスがボックス化された状態で格納され、指定されたインデックスより先の要素は1つずつ先頭へずらされることに注意してください。
以下にコード例と実行結果を示します。
const char* json1 = R"({ "a": { "foo": 1 } })";
auto obj = ToMpObject(json1);
e = MpObject::RemoveByJsonPointer(&kv, obj.get(), "/a/foo");
SUCCEED_IF(e == 0);
ToJson(to, *obj);
ToJson(key, kv.first);
ToJson(value, kv.second);
nlib_printf("Remove(%s, '/a/foo') --> %s, key=%s, value=%s\n", json1, to, key, value);
obj = ToMpObject(json1);
e = MpObject::RemoveByJsonPointer(&kv, obj.get(), "/a");
SUCCEED_IF(e == 0);
ToJson(to, *obj);
ToJson(key, kv.first);
ToJson(value, kv.second);
nlib_printf("Remove(%s, '/a') --> %s, key=%s, value=%s\n", json1, to, key, value);
const char* json2 = R"([0, 1, 2])";
obj = ToMpObject(json2);
e = MpObject::RemoveByJsonPointer(&kv, obj.get(), "/1");
SUCCEED_IF(e == 0);
ToJson(to, *obj);
ToJson(key, kv.first);
ToJson(value, kv.second);
nlib_printf("Remove(%s, '/1') --> %s, key=%s, value=%s\n", json1, to, key, value);
/*
Output:
Remove({ "a": { "foo": 1 } }, '/a/foo') --> {"a":{}}, key="foo", value=1
Remove({ "a": { "foo": 1 } }, '/a') --> {}, key="a", value={"foo":1}
Remove({ "a": { "foo": 1 } }, '/1') --> [0,2], key=1, value=1
*/
この関数はJSON Patch(RFC6902)のremove演算を行います。 詳細はRFCを御覧ください。
参照
https://tools.ietf.org/html/rfc6901
https://tools.ietf.org/html/rfc6902
https://triple-underscore.github.io/RFC6901-ja.html
https://triple-underscore.github.io/RFC6902-ja.html

◆ RemoveMapItem() [1/3]

nn::nlib::msgpack::MpObject::RemoveMapItem ( size_t  n,
MpObjectKv kv 
)
noexcept

インデックスを指定して連想配列内のキーとオブジェクトを削除します。

引数
[in]n連想配列のインデックス
[in,out]kvNULLでない場合は削除されたキーと値のペアが格納されます。
戻り値
0ならば成功。それ以外はエラー。

◆ RemoveMapItem() [2/3]

nn::nlib::msgpack::MpObject::RemoveMapItem ( const nlib_utf8_t key,
MpObjectKv kv 
)
noexcept

キーを指定して連想配列内のキーとオブジェクトを削除します。

引数
[in]key連想配列のキー文字列
[in,out]kvNULLでない場合は削除されたキーと値のペアが格納されます。
戻り値
0ならば成功。それ以外はエラー。

◆ RemoveMapItem() [3/3]

template<class STDSTRING >
nn::nlib::msgpack::MpObject::RemoveMapItem ( const STDSTRING &  key,
MpObjectKv kv 
)
inlinenoexcept

キーを指定して連想配列内のキーとオブジェクトを削除します。

テンプレート引数
STDSTRINGstd::stringと互換性のある型
引数
[in]key連想配列のキー文字列
[in,out]kvNULLでない場合は削除されたキーと値のペアが格納されます。
戻り値
0ならば成功。それ以外はエラー。

MpObject.h223 行目に定義があります。

◆ Resize()

nn::nlib::msgpack::MpObject::Resize ( uint32_t  n)

配列や連想配列のリサイズをします。

引数
[in]nリサイズ後のサイズ
戻り値
0ならば成功。0以外の場合はエラー
説明
以下がコード例です。
// array
SUCCEED_IF(obj.InitArray(10) == 0);
auto ar = obj.AsArray();
nlib_printf("array size: %" PRIuS "\n", ar.GetSize());
SUCCEED_IF(ar.Resize(100) == 0);
nlib_printf("array size: %" PRIuS "\n", ar.GetSize());
ar[99] = 1;
// map
SUCCEED_IF(obj.InitMap(10) == 0);
nlib_printf("map size: %u\n", obj.GetSize());
SUCCEED_IF(obj.Resize(100) == 0);
nlib_printf("map size: %u\n", obj.GetSize());
auto& kv = obj.AsMap()[99];
SUCCEED_IF(kv.first.Box("key") == 0);
SUCCEED_IF(kv.second.Box("value") == 0);
// string
SUCCEED_IF(obj.InitString("mystring") == 0);
e = obj.Resize(100);
nlib_printf("cannot resize string: err=%s\n", nlib_error_string(e));
// binary
SUCCEED_IF(obj.InitBinary("test", 4) == 0);
e = obj.Resize(100);
nlib_printf("cannot resize binary: err=%s\n", nlib_error_string(e));
/*
Output:
array size: 10
array size: 100
map size: 10
map size: 100
cannot resize string: err=EACCES
cannot resize binary: err=EACCES
*/

◆ ResolveJsonPointer()

nn::nlib::msgpack::MpObject::ResolveJsonPointer ( MpObject **  result,
MpObject root,
const nlib_utf8_t json_pointer 
)
staticnoexcept

json_pointerによって参照されるMpObject*resultに格納します。

引数
[in,out]resultjson_pointerによって参照されたオブジェクト
[in]rootjson_pointerによる参照の起点となる根元のオブジェクト
[in]json_pointerJSON Pointerの文字列
戻り値
0成功した場合
EINVALresult, root, 又はjson_pointerNULLの場合
EILSEQjson_pointerの文法が間違っていた場合
ENOENTjson_pointerによって参照されるオブジェクトが存在しない場合
説明
JSON Pointer(RFC6901)によって規定された文字列によりJSONのツリー構造をたどりMpObjectを取得します。 '/'で区切られた文字列は参照トークンと呼ばれ、ファイルパスのような文字列により、JSON内の場所を指定するようになっています。
JSONからJSON Pointerを利用して部分的なJSON文字列を表示するプログラムを以下に示します。
const char* json = R"({
"foo": ["bar", "baz"],
"": 0,
"a/b": 1,
"c%d": 2,
"e^f": 3,
"g|h": 4,
"i\\j": 5,
"k\"l": 6,
" ": 7,
"m~n": 8
})";
auto obj = ToMpObject(json);
const char* json_pointers[] = {
"", "/foo", "/foo/0", "/", "/a~1b", "/c%d", "/e^f", "/g|h", "/i\\j", "/k\"l", "/ ", "/m~0n"
};
for (auto& str : json_pointers) {
SUCCEED_IF(MpObject::ResolveJsonPointer(&target, obj.get(), str) == 0);
ToJson(buf, *target);
nlib_printf("Resolve('%s') --> %s\n", str, buf);
}
/*
Output:
Resolve('') --> {"foo":["bar","baz"],"":0,"a\/b":1,"c%d":2,"e^f":3,"g|h":4,"i\\j":5,"k\"l":6," ":7,"m~n":8}
Resolve('/foo') --> ["bar","baz"]
Resolve('/foo/0') --> "bar"
Resolve('/') --> 0
Resolve('/a~1b') --> 1
Resolve('/c%d') --> 2
Resolve('/e^f') --> 3
Resolve('/g|h') --> 4
Resolve('/i\j') --> 5
Resolve('/k"l') --> 6
Resolve('/ ') --> 7
Resolve('/m~0n') --> 8
*/
詳細はRFCを御覧ください。
参照
https://tools.ietf.org/html/rfc6901
https://triple-underscore.github.io/RFC6901-ja.html

◆ Unbox() [1/3]

template<class T , size_t n>
nn::nlib::msgpack::MpObject::Unbox ( T(&)  a[n]) const
inline

オブジェクトの値をアンボックス化します。

引数
[out]aアンボックスされたデータが格納される配列
テンプレート引数
Tアンボックス後のオブジェクトの型
n配列の要素数
戻り値
0ならば成功。
説明
Tの型により、アンボックス化の動作が異なります。以下の表に動作の違いを示します。
Tの型 説明
nlib_utf8_t MpObject::kString型のオブジェクトが文字列にアンボックス化される。末尾のヌル文字を格納する容量が必要です。
それ以外 配列としてMpObject::kArray型にボックス化される。
以下がコード例になります。
// バイトデータ列のアンボックス化
unsigned char data[N];
MpObject mpobj;
....
mpobj.Unbox(&data[0], N);

MpObject.h297 行目に定義があります。

◆ Unbox() [2/3]

template<class T>
errno_t nn::nlib::msgpack::MpObject::Unbox ( T *  a,
size_t  n 
) const

配列データをアンボックス化します。

テンプレート引数
Tアンボックスされた配列データを書きこむオブジェクト(へのポインタ)の型
引数
[out]aアンボックスされたデータを書きこむオブジェクト(へのポインタ)
[in]n要素数
戻り値
0ならば成功。型が違ったりオーバーフローが発生した場合はそれ以外。
説明
Tの型 説明
void バイト列データとしてアンボックス化します。
nlib_utf8_t 文字列データとしてアンボックス化します。ヌル文字が追加されるのでヌル終端するだけの容量が必要です。
その他 オブジェクトの配列としてアンボックス化します。

MpObject.h1295 行目に定義があります。

◆ Unbox() [3/3]

template<class T >
nn::nlib::msgpack::MpObject::Unbox ( v) const
inline

オブジェクトをアンボックス化します。

テンプレート引数
Tアンボックスされたデータを書きこむオブジェクト(へのポインタ)の型
引数
[out]vアンボックスされたデータを書きこむオブジェクト(へのポインタ)
戻り値
0ならば成功。それ以外はエラー。
説明
動的型オブジェクトをアンボックス化して静的型オブジェクトに変換します。 アンボックス化に失敗した場合は0以外の値を返します。
Tの型により動作は異なります。下記の表に動作の違いを示します。
Tの型 説明
bool* MpObject::kBoolean型ならばbool値が格納されます。
整数型へのポインタ MpObject::kInt64又はMpObject::kUint64型ならば整数値が格納されます。オーバーフローはチェックされません。
float*, double* MpObject::kFloat又はMpObject::kDouble型ならばfloat値が格納されます。オーバーフローはチェックされません。
std::string* MpObject::kString型ならばstringオブジェクトが設定されます。文字列のassign()時に例外が発生した場合はENOMEMを返します。
std::vector* MpObject::kArray型ならばvectorオブジェクトが設定されます。ベクタのresize()時に例外が発生した場合はENOMEMを返します。
Nlist* MpObject::kArray型ならば Nlistオブジェクトが設定されます。メモリが足りない場合はENOMEMを返します。
std::pair* サイズが2のMpObject::kArray型ならばpairオブジェクトが設定されます。
std::map* MpObject::kMap型ならばmapオブジェクトが設定されます。mapの要素の追加時に例外が発生した場合は、ENOMEMを返します。
std::array* MpObject::kArray型ならばarrayオブジェクトが設定されます。
std::tuple* MpObject::kArray型ならばtupleオブジェクトが設定されます。
std::unordered_map* MpObject::kMap型ならば unordered_mapオブジェクトが設定されます。unordered_mapの要素の追加時に例外が発生した場合は、ENOMEMを返します。
いずれも型に変換不能な場合は、EACCESSを返します。 また、配列等のアンボックス化に失敗した場合、途中までの変換結果が格納されています。 ユーザー定義型へのアンボックス化については、その型のアンボックス関数の仕様に従います。
配列にアンボックス化する場合、通常は配列型のデータをアンボックス化しますが、nlib_utf8_t型の配列のみは文字列としてアンボックス化されます。
以下がコード例です。
int intval;
MpObject intobj = 1;
intobj.Unbox(&intval);
NLIB_ASSERT(intval == 1);
std::vector<int> vec;
auto x = JsonStreamParser::Parse("[1, 2, 3, 4, 5]");
SUCCEED_IF(x.first == 0);
x.second->Unbox(&vec);
NLIB_ASSERT(vec.size() == 5);

MpObject.h316 行目に定義があります。


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