ヘルパー・クラスの生成
汎用オペレーターを開発する際、特定の型リストのメンバー変数が含まれるクラスを生成することがしばしば必要になります。 このような目的のために、 SPL コード生成フレームワークには emitClass 関数が SPL::CodeGen モジュール内に用意されています。
例えば、ウィンドウ構成オペレーターの partitionBy 式を保持するためのクラスを生成したり、式値リストからハッシュ・キーを作成するクラスを生成したりします。
emitClass 関数は、3 つのパラメーターを受け取ります。1 つ目は、オペレーター・インスタンス・モデルです。2 つ目はクラスの名前であり、3 つ目はメンバー変数の型のリストです。 この関数からの戻りは、生成されたクラスの名前で、これは 2 つ目のパラメーターから計算された固有の名前です。つまり、名前および型リストが指定されると、emitClass 関数は、その指定された型のメンバー変数が入った C++ クラスを生成します。 これらのメンバー変数は public で、field<index>_ という名前が付けられます。このインデックス付けは、受け渡された型の順序に従います。重要な点は、 生成されたクラスはハッシュ可能であり、そのため、SPL マップ、SPL セット、または任意の std::tr1 ハッシュ・ベース・コンテナーに保管できるという点です。このクラスには、空コンストラクター、コピー・コンストラクター、メンバー・イニシャライザー・コンストラクター、および代入演算子、等価比較演算子、非等価比較演算子が含まれます。 emitClass 関数は、 _h.cgt ファイル内で headerPrologue の前に使用しなければなりません。以下に 使用例を示します。
// This is an <opname>_h.cgt file
<%
my $partitionByParam = $model->getParameterByName("partitionBy");
my @partitionByTypes = SPL::CodeGen::getParameterCppTypes($partitionByParam);
my $partitionCppType = SPL::CodeGen::emitClass($model, "PartitionBy", @partitionByTypes);
...
SPL::CodeGen::headerPrologue($model);
%>
class MY_OPERATOR : public MY_BASE_OPERATOR {
public:
typedef <%=$partitionCppType%> PartitionByType;
...
}