入力モードを整理する(2)

前回は入力コンテキストを単語登録とみなしてひとまとめにする、というところまで行きました。この考えを推し進めて、インタフェースに落とし込んでみることにします。

class SKKContext;
class SKKEnvironment {
    SKKContext base_;
    std::stack<SKKContext> stack_;

public:
    void AddContext(const std::string& entry) {
        stack_.push(SKKContext(entry));
    }
    void CommitContext(const std::string& candidate) {
        stack_.pop();
        SKKContext& top = TopContext();
        top.AppendCandidate(candidate);
    }
    void RollbackContext() {
        stack_.pop();
    }
    SKKContext& TopContext() {
        if(stack_.empty()) {
            return base_;
        }
        return stack_.top();
    }
};

SKKEnvironment はその名の通り、実行環境です。入力コンテキストは SKKContext クラスで表現します。通常の入力コンテキストは base_ メンバーで特別扱いし、単語登録が発生すると SKKContext がスタックに積まれていく仕組みというわけです。AddContext では SKKContext のコンストラクタが引数付きで呼ばれるところがポイントです。


再帰的な単語登録の結末は、『確定』か『取り消し』のどちらかになります。どちらも現在の入力コンテキストを取り除くという点では同じですが、CommitContext の場合には、現在の SKKContext で確定された候補を直下の SKKContext に渡してあげる点が異なります。AppendCandidate() というメソッド名がイマイチですが、とりあえずは良しとしましょう。


現在の入力コンテキストは TopContext() で取得できます。大枠はこんな感じで良さそうですね。次は SKKContext の中身を... と行きたいところですが、その前に確定モードと変換モードを整理します。