RTVals のC++アプリからの利用¶
この節では RTVal を CAPI インタフェースを使いC++で書かれた Fabric Engine クライアントアプリからどのように扱うかについて説明します。
RTVal は参照によるコピー(Copy-by-Reference)¶
RTVal は C++中、 RTVal クラスのインタフェースとして表現されます。RTValはC++中では参照によるコピー(Copy-by-Reference)です。つまり、あるRTValを他のRTVal型の変数へ代入する場合、結果として2は同じRTValを指すことになります。RTValを<値によるコピー>するには、 RTVal::Construct() を呼びます。
一般的タスク¶
RTVal のコンストラクト¶
RTVal は以下のうちどれかにより作成します:
- RTVal を
RTValクラスのConstruct...メソッドを呼び、コンストラクトRTValクラスのメソッドを、既存のRTVal ――例えば構造体、オブジェクト、配列、辞書などの型―― メンバ(もしくは要素)の値を得るために呼ぶ。大抵の場合、戻りRTVal はメンバ(もしくは要素)データのコピーになります。- DGノード (もしくは他のDGContainer)のメンバの値を、
DGContainer::getMemberSliceValue()を呼び出し、得ます。
RTValのコピーをコンストラクトするには、 RTVal::Construct() メソッドを使用します。既存の RTVal を唯一の引数としてわたします。
注釈
これらの方法による RTVal のコンストラクトは、KLでのコピーコンストラクションと同じです。つまり 参照渡し(pass-by-reference)では、可変長配列や辞書型は、RTValがそれらをコピーしようと、同じ通底するデータを参照したままとなります。データをコピーするのであれば、RTVal::callMethod() を呼び出し、 clone メソッドを呼びます。C++ で 単純なRTValデータの同等物を得る¶
C++ での単純なRTValのデータに相当するものを取得するには、 RTVal クラスの get... メソッドを使います。 is.... メソッドによりその型があるか先にチェックするようにしましょう。さもないと例外が発生するかもしれません。
RTVal の文字列表現¶
デバッグのため、ある RTVal を人間可読な状態で得ることができると大変便利です。そのような場合 RTVal::getDesc() メソッドを使いましょう。
RTVal のメソッド呼び出し¶
RTVal::callMethod() 関数をつかい RTValのメソッドを呼びます。
配列との併用¶
ある RTVal型 が配列型であれば、配列メソッドを適用できます:
RTVal::isArray()RTVal::isVariableArray()RTVal::getArraySize()RTVal::getArrayElement()RTVal::setArrayElement()
辞書との併用¶
ある RTVal型 が辞書型であれば、辞書メソッドを適用できます:
RTVal::isDict()RTVal::getDictSize()RTVal::getDictElement()RTVal::setDictElement()
構造体,オブジェクトとの併用¶
ある RTval型 が構造体(あるいはオブジェクト)であれば、それらのメンバを使用できます:
RTVal::isStruct()RTVal::isObject()RTVal::maybeGetMember()RTVal::maybeGetMemberRef()
オブジェクトの場合、 RTVal::isNullObject() をオブジェクトの参照が nullとなっていないかチェックできます。
Opaque データとの併用¶
Data 型のRTval であれば、opaque データポイントとして Core 外に渡すことができます。エクステンションに渡すなどに利用できます。
RTVal::isData()RTVal::getData()RTVal::setData()
Working with KL RTVal¶
RTVal to pass generic data in and out of the application.RTVal, there is no one to one correspondance.RTVal into a cpp RTVal://Access the KL :kl-ref:`RTVal` containing the KL data we want.
RTVal klRTVal = getRTVal(....);
//Now, get the type of the KL data wrapped in the KL :kl-ref:`RTVal`.
const char * valType = klRTVal.callMethod("String", "type", 0, 0).getStringCString();
//Then, construct a new cpp RTVal containing the KL data.
RTVal cppRTVal = RTVal::Construct(client, valType, 1, &klRTVal);
API レファレンス¶
-
class
RTVal¶ RTVal は C++ では
RTValクラスのインスタンスとして表します。-
RTVal()¶ あたらしい RTVal を作成。RTVal は C++では 「参照によるコピー(copy-by-reference)」です。そのため RTVal を後で代入するため先に変数を初期化することがよくあります。
-
RTVal(RTVal const &that)¶ RTVal のコピーコンストラクタ。RTVal は C++では 「参照によるコピー(copy-by-reference)」です。そのためこのコピーコンストラクタは、同じ RTVal
thatへの参照を作成します。
-
RTVal &
operator=(RTVal const &that)¶ RTVal 代入演算子。RTVal は C++では 「参照によるコピー(copy-by-reference)」です。そのためこの代入演算子は、
thatと同じRTVal への参照を作成します。他の RTVal からのこのRTva への参照が切れるとこのRTVal は開放されます。
-
static RTVal
Construct(Context const &context, char const *typeNameCString, uint32_t argCount, RTVal const *argRTVals)¶ -
static RTVal
Construct(Client const &client, char const *typeNameCString, uint32_t argCount, RTVal const *argRTVals)¶ KLのコピーコンストラクタシンタックスを使用し、あたらしい RTValをコンストラクトします。ターゲットの型と、0個以上の他の RTValのリストを取り、とったRTValのコピーコンストラクションを呼びだそうとします。
注意点として、オブジェクトの型 <
typeNameCString>を特定してのこのコンストラクトメソッドの呼び出しは、nullオブジェクト参照をつくります。かわりにCreateメソッドと使い、あたらしいオブジェクトインスタンスを作成します。内部的に、これは以下の KLコードにより RTVal を作成しています。
<TypeName> resultRTVal(arg1RTVal, arg2RTVal, ...);
-
static RTVal
ConstructBoolean(Context const &context, bool value)¶ -
static RTVal
ConstructBoolean(Client const &client, bool value)¶ Boolean型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructSInt8(Context const &context, int8_t value)¶ -
static RTVal
ConstructSInt8(Client const &client, int8_t value)¶ SInt8型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructSInt16(Context const &context, int16_t value)¶ -
static RTVal
ConstructSInt16(Client const &client, int16_t value)¶ SInt16型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructSInt32(Context const &context, int32_t value)¶ -
static RTVal
ConstructSInt32(Client const &client, int32_t value)¶ SInt32型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructSInt64(Context const &context, int64_t value)¶ -
static RTVal
ConstructSInt64(Client const &client, int64_t value)¶ SInt64型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructUInt8(Context const &context, uint8_t value)¶ -
static RTVal
ConstructUInt8(Client const &client, uint8_t value)¶ UInt8型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructUInt16(Context const &context, uint16_t value)¶ -
static RTVal
ConstructUInt16(Client const &client, uint16_t value)¶ UInt16型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructUInt32(Context const &context, uint32_t value)¶ -
static RTVal
ConstructUInt32(Client const &client, uint32_t value)¶ UInt32型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructUInt64(Context const &context, uint64_t value)¶ -
static RTVal
ConstructUInt64(Client const &client, uint64_t value)¶ UInt64型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructFloat32(Context const &context, float value)¶ -
static RTVal
ConstructFloat32(Client const &client, float value)¶ Float32型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructFloat64(Context const &context, double value)¶ -
static RTVal
ConstructFloat64(Client const &client, double value)¶ Float64型の新しい RTVal を コンストラクトします。初期値はvalueパラメータの値で設定します。
-
static RTVal
ConstructString(Context const &context, char const *data, uint32_t length)¶ -
static RTVal
ConstructString(Client const &client, char const *data, uint32_t length)¶ String型の新しい RTVal を コンストラクトします。初期値はdataとlengthによって与えられた文字バイト列より設定。nullバイトが含まれる可能性に注意。
-
static RTVal
ConstructString(Context const &context, char const *cString)¶ -
static RTVal
ConstructString(Client const &client, char const *cString)¶ String型の新しい RTVal を コンストラクトします。初期値はcStringに与えられた null終端文字列バイト(C-style)によって設定。
-
static RTVal
ConstructData(Context const &context, void *data)¶ -
static RTVal
ConstructData(Client const &client, void *data)¶ Data型の新しい RTVal を コンストラクトします。初期値はdataに渡すポインタによって設定。Fabric core からエクステンションに opaque データをポインタを渡すことで受け渡す一番簡単な方法です。
-
static RTVal
ConstructFixedArray(Context const &context, char const *elementTypeCString, uint32_t size)¶ -
static RTVal
ConstructFixedArray(Client const &client, char const *elementTypeCString, uint32_t size)¶ 決められた要素の型とサイズな固定長配列の新しい RTVal を コンストラクトします。配列要素の初期値は与えられた型のディフォルト値です。
-
static RTVal
ConstructVariableArray(Context const &context, char const *elementTypeCString)¶ -
static RTVal
ConstructVariableArray(Client const &client, char const *elementTypeCString)¶ 与えられた要素の型の可変長配列の新しい RTVal を コンストラクトします。初期長さは 0。(つまり空)
-
static RTVal
ConstructExternalArray(Context const &context, char const *elementTypeCString, uint32_t size, void *data)¶ -
static RTVal
ConstructExternalArray(Client const &client, char const *elementTypeCString, uint32_t size, void *data)¶ 与えられた型のデータを参照する外挿配列の新しい RTVal を コンストラクトします。
sizeanddataパラメータにこの配列が参照する配列のデータをただしくポイントします。
-
static RTVal
ConstructDict(Context const &context, char const *keyTypeCString, char const *valueTypeCString)¶ -
static RTVal
ConstructDict(Client const &client, char const *keyTypeCString, char const *valueTypeCString)¶ 与えられた keyの型 と値の型から辞書型の新しい RTVal を コンストラクトします。初期値は空です。
-
static RTVal
Create(Context const &context, char const *typeNameCString, uint32_t argCount, RTVal const *argRTVals)¶ -
static RTVal
Create(Client const &client, char const *typeNameCString, uint32_t argCount, RTVal const *argRTVals)¶ 与えられた型の新しい KLオブジェクトを作成し、結果を新しい RTVal へ代入。
typeNameCStringがオブジェクトや型でない場合、例外を投げますオブジェクト型
typeNameCStringを特定してのConstructメソッドの呼び出しは、nullオブジェクト参照を作成します。新しいオブジェクトインスタンスを作成するのであればこちらのメソッドを使用しましょう。内部的に、これは以下の KLコードにより RTVal を作成しています。
<TypeName> resultRTVal = TypeName(arg1RTVal, arg2RTVal, ...);
-
bool
getBoolean()¶ Boolean型の RTVal の値を返す. RTVal がBoolean型でない場合例外が発生.
-
uint8_t
getUInt8()¶ UInt8型の RTVal の値を返す. RTVal がUInt8型でない場合例外が発生.
-
uint16_t
getUInt16()¶ UInt16型の RTVal の値を返す. RTVal がUInt16型でない場合例外が発生.
-
uint32_t
getUInt32()¶ UInt32型の RTVal の値を返す. RTVal がUInt32型でない場合例外が発生.
-
uint64_t
getUInt64()¶ UInt64型の RTVal の値を返す. RTVal がUInt64型でない場合例外が発生.
-
int8_t
getSInt8()¶ SInt8型の RTVal の値を返す. RTVal がSInt8型でない場合例外が発生.
-
int16_t
getSInt16()¶ SInt16型の RTVal の値を返す. RTVal がSInt16型でない場合例外が発生.
-
int32_t
getSInt32()¶ SInt32型の RTVal の値を返す. RTVal がSInt32型でない場合例外が発生.
-
int64_t
getSInt64()¶ SInt64型の RTVal の値を返す. RTVal がSInt64型でない場合例外が発生.
-
float
getFloat32()¶ Float32型の RTVal の値を返す. RTVal がFloat32型でない場合例外が発生.
-
void
setFloat32(float value)¶ Float32型の RTVal の値をvalueに設定. RTValがFloat32型でない場合例外が発生
-
double
getFloat64()¶ Float64型の RTVal の値を返す. RTVal がFloat64型でない場合例外が発生.
-
char const *
getStringCString()¶ String型の RTVal の値を C-string として返す. RTVal がString型でない場合例外が発生.
-
uint32_t
getStringLength()¶ String型の RTVal の値の文字列の長さを返す. RTVal がString型でない場合例外が発生.
-
void *
getData()¶ Return the value of the RTVal that is of type
Dataas a void pointer. If the RTVal is not of typeDataan exception will be thrown.
-
void
setData(void *data)¶ Data型の RTVal の値を voidポインタの値 Data (struct) に設定. RTValがData型でない場合例外が発生
-
bool
isNullObject() const¶ あるオブジェクトの型のRTVal の値が null かどうかを返す. RTVal が オブジェクトの型でない場合例外が発生.
-
bool
isArray() const¶ Return whether the RTVal that is of a type that is a fixed, variable or external array of some other type. Used to check if it’s safe to perform array length and indexing calls.
-
bool
isVariableArray() const¶ Return whether the RTVal is a variable array of some other type. Used to check if it’s safe to perform array resizing calls.
-
bool
isDict() const¶ RTVal が 辞書型 かどうかを返す.
-
bool
isStruct() const¶ RTVal が 構造体型 かどうかを返す.
-
bool
isObject() const¶ RTVal が オブジェクト型 かどうかを返す.
-
bool
isData() const¶ RTVal が
Data型 かどうかを返す.
-
bool
isInterface() const¶ RTVal が インタフェース型 かどうかを返す.
-
uint32_t
getArraySize() const¶ 配列型な RTVal の 長さ を返す. RTVal が 配列型でない場合例外が発生.
-
void
setArraySize(uint32_t newSize)¶ 可変長配列な型の RTVal をリサイズする. RTVal が可変長配列型でない場合例外が発生.
-
RTVal
getArrayElement(uint32_t index) const¶ 配列型の要素のコピーである 新しい RTVal を返す. RTVal が配列型でない, あるいはインデックスが配列境界外である場合例外が発生.
-
void
setArrayElement(uint32_t index, RTVal const &value)¶ 配列型の RTVal のインデックスで指定した要素を設定する.
valueパラメータは配列要素の型へとキャスト可能な RTVal でなければならない. RTVal が配列型でない, あるいはインデックスが配列境界外である場合例外が発生.
-
uint32_t
getDictSize() const¶ 辞書型である RTVal のサイズ( <キーと値> のペアの数)を取得. RTVal が辞書型でない場合例外が発生.
-
RTVal
getDictElement(RTVal const &key) const¶ 辞書型の RTVal に含まれる与えられたキーに対応する値のコピーである 新規 RTVal を返す.
keyは辞書型のキーの型にキャスト可能な RTVal でなければならない. RTVal が辞書型でない,あるいはキーに対応した要素が存在しない場合例外が発生.
-
void
setDictElement(RTVal const &key, RTVal const &value)¶ 辞書型の RTVal の与えられたキーに対応する値を設定する.
keyは辞書のキーの型にキャスト可能な RTVal でなければならない. RTVal が辞書型でない場合例外が発生.
-
RTVal
maybeGetMember(char const *memberNameCString) const¶ 構造体,あるいはオブジェクト型 の RTVal に含まれる名前付きメンバのコピーである RTVal を新規に返す. RTVal が構造体やオブジェクト型でない場合例外が発生.
memberNameCString名のメンバが存在しない場合, null RTVal を返す.
-
RTVal
maybeGetMemberRef(char const *memberNameCString) const¶ 構造体,あるいはオブジェクト型の RTVal に含まれる名前付きメンバの参照である RTVal を返す. RTVal が構造体あるいはオブジェクト型でない場合, あるいは
memberNameCStringメンバが存在しない場合例外が発生.注釈
参照するものが構造体の生存と合わなくなることにより起こることに対しての責任は呼び出し側にあります。
-
void
setMember(char const *memberNameCString, RTVal const &value)¶ 構造体あるいはオブジェクト型の RTVal に含まれる名前付きメンバを設定.
valueは メンバの型へとキャスト可能な RTVal でなければならない. RTVal が構造体あるいはオブジェクトでない場合, あるいはmemberNameCStringメンバが存在しない場合, 例外が発生.
-
RTVal
callMethod(char const *resultTypeCString, char const *methodNameCString, uint32_t argCount, RTVal *argRTVals)¶ RTVal のメソッドを呼ぶ.
resultTypeCStringはメソッド呼び出しの結果の型でなければならない;methodNameCStringは呼び出すメソッドの名前でなければならない;argCountandargRTValsは呼び出しの引数を指定する.メソッドが値を返さないのであれば,
resultTypeCStringには空文字列を指定; この場合 null RTVal が返る. それ以外は メソッド呼び出しの戻り値である 新規の RTVal が返る.与えられた名前, 引数の型, 戻り値の型 へとキャスト可能な型 に対応したメソッドが存在しない場合, 例外が発生.
-
-
class
DGContainer¶ DGContainerクラスのメソッドのうち RTVal に対して機能するものがある. これらのメソッドは DGNodes の値のメンバのコピーである RTVal を得る. 以下例:-
RTVal
getMemberSliceValue(char const *memberCString, uint32_t index)¶ 与えられた slice のメンバデータのコピーを RTVal として返す.
-
void
setMemberSliceValue(char const *memberCString, uint32_t index, RTVal const &rtVal)¶ 与えられた slice のメンバデータを RTVal で設定する. RTVal がメンバの型へとキャスト不可能な場合, 例外が発生.
-
void
setJSONStringValue(RTVal const &stringRTVal)¶ DGContainer::getJSONStringValue()により取得する事のできる、JSON形式の RTVal 文字列 によって コンテナのコンテンツを設定.
-
RTVal