ステートチャート・コードのインライン化

このタスクについて

以下のステートチャートを見てみましょう。

ステートチャート

フラット・スキームを使用してこのステートチャートを実装する場合、以下のメソッドがクラスに追加され、rootState_dispatchEvent() からの一連の新規関数呼び出しによって呼び出されるようにしたいと考えます。

int MyClass::s2TakeNull() {
    int res = eventNotConsumed;
    s2_exit();
    //#[ transition 2
    f2();
    f2();
    //#]
    s3_entDef();
    res = eventConsumed;
    return res;
};
int MyClass::s1TakeNull() {
    int res = eventNotConsumed;
    s1_exit();
    //#[ transition 1
    f1();
    f1();
    //#]
    s2_entDef();
    res = eventConsumed;
    return res;
};

実際には、以下のように、遷移コード (大括弧 //#[//#] の間) が rootState_dispatchEvent() の中にインラインに埋め込まれます。

int MyClass::rootState_dispatchEvent(short id) {
    int res = eventNotConsumed;
    switch(rootState_active) {
        case s1:
        {
            if(id == Null_id)
                {
                    popNullConfig();
                    //#[ transition 1
                    f1();
                    f1();
                    //#]
                    pushNullConfig();
                    rootState_subState = s2;
                    rootState_active = s2;
                    res = eventConsumed;
                }
            break;
        };
        case s2:
        {
            if(id == Null_id)
                {
                    popNullConfig();
                    //#[ transition 2
                    f2();
                    f2();
                    //#]
                    rootState_subState = s3;
                    rootState_active = s3;
                    res = eventConsumed;
                }
            break;
        };
    };
    return res;
}; 

このコードでは、コードのインライン化によって関数呼び出しをいくつか省略しているため、効率がよくなります。インライン化を使用可能にするには、クラスの CG::Class::ComplexityForInlining プロパティーを使用します。このプロパティーの値は、デフォルトで 3 に設定されています。これは、ユーザー・コード (遷移のアクション部分) が 3 行より少ない場合は、関数呼び出しの際に関数を呼び出す代わりに、コードがインライン化されることを意味します。インライン化せずに関数呼び出しを行わせたい場合は、このプロパティーを 0 に設定します。


フィードバック