バイナリ互換インターフェースの使用によるC/C++ OMLライブラリの記述
このインターフェースを使用する利点は、オブジェクトのサイズが変化しないことにあります。つまり、このインターフェース(2017.2以降)に対応していれば、Composeのどのバージョンでも、コンパイルしたコードを使用できます。ヘッダーファイルに記述されたバージョンに限定されることがありません。また、Composeの実行可能ファイルで使用したツールとは異なるツールでもコンパイルが可能です。
このインターフェースを使用するどのようなライブラリも、次の2つの部分で構成されています:
- Composeで呼び出す初期化関数。この関数は、ライブラリの関数がComposeにどのように登録されるかを定義します。
- その関数自体。
初期化セクションには必ず次の署名があります。
int InitToolbox(OMLInterface* eval)
この関数は、その名前がコンパイラーでマングルされないように、extern "C"として宣言する必要があります。また、DLLからエクスポートするものであることも必要です。
次の項で、OMLインターフェースクラスの各種メソッドについて説明しています。
この関数の本体は次の形式で記述します。
int InitToolbox(OMLInterface* eval)
{
eval->RegisterFunction(“myfunc”, myfunc);
// myfunc needs to be forward declared
eval->RegisterFunction(“myfunc2”, myfunc2);
// …
return 0;
}
ライブラリの各関数には次の署名が必要です。
bool myfunc(OMLInterface* eval, const OMLCurrencyList* inputs, OMLCurrencyList* outputs)
OMLは型のない言語なので、コード作成者が入力ごとの適切なC++の型を判断し、それに従った処理を記述する必要があります。
OMLCurrencyListクラスとそのすべての従属クラスについても、以降に説明があります。
2つのスカラーを追加する簡単な例を次に示します。この関数に不適切な入力(誤った数値や誤った型)を指定すると、エラーがスローされて実行が停止します。
bool myfunc(OMLInterface* eval, const OMLCurrencyList* inputs, OMLCurrencyList* outputs)
{
// check proper number of inputs
if (inputs->Size() != 2)
eval->ThrowError(“Incorrect number of inputs”);
OMLCurrency* input1 = inputs->Get(0);
OMLCurrency* input2 = inputs->Get(1);
// check proper input types
if (input1->IsScalar() && input2->IsScalar())
{
double d1 = input1->GetScalar();
double d2 = input2->GetScalar();
outputs->AddScalar(d1+d2);
}
else
{
eval->ThrowError(“Invalid input type”);
}
return true;
}