[aquaskk-changes 383] CVS update: AquaSKK/src/statemachine

アーカイブの一覧に戻る

t-suw****@users***** t-suw****@users*****
2007年 9月 23日 (日) 23:48:09 JST


Index: AquaSKK/src/statemachine/GenericStateMachine.h
diff -u AquaSKK/src/statemachine/GenericStateMachine.h:1.1.2.2 AquaSKK/src/statemachine/GenericStateMachine.h:1.1.2.3
--- AquaSKK/src/statemachine/GenericStateMachine.h:1.1.2.2	Sun Sep 16 09:21:45 2007
+++ AquaSKK/src/statemachine/GenericStateMachine.h	Sun Sep 23 23:48:08 2007
@@ -74,8 +74,8 @@
         const ParamType& Param() const		{ return param_; }
         void SetParam(const ParamType& arg)	{ param_ = arg; }
 
-	bool IsSystem() const { return signal_ < USER_EVENT; }
-	bool IsUser() const { return !IsSystem(); }
+	bool IsSystem() const	{ return signal_ < USER_EVENT; }
+	bool IsUser() const	{ return !IsSystem(); }
 
         static GenericEvent& Probe()	{ static GenericEvent evt(PROBE);	return evt; }
         static GenericEvent& Entry()    { static GenericEvent evt(ENTRY_EVENT); return evt; }
@@ -229,13 +229,13 @@
     // ======================================================================
     // state machine
     // ======================================================================
-    template <class StateContainer, template <typename Handler, typename Event> class Inspector = EmptyInspector>
+    template <typename StateContainer, template <typename Handler, typename Event> class Inspector = EmptyInspector>
     class GenericStateMachine {
     public:
-        typedef typename StateContainer::Handler Handler;
-        typedef typename StateContainer::Event Event;
-        typedef typename StateContainer::State State;
-        typedef typename StateContainer::Output Output;
+	typedef typename StateContainer::State State;
+	typedef typename StateContainer::Event Event;
+	typedef typename StateContainer::Handler Handler;
+	typedef typename StateContainer::Output Output;
 
     private:
         StateContainer container_;
@@ -410,6 +410,8 @@
         GenericStateMachine(const StateContainer& src) : container_(src), top_(&StateContainer::TopState), active_(0) {}
 
         ~GenericStateMachine() {
+	    if(!container_.ExitOnDestruct()) return;
+
             for(Handler tmp = active_; tmp != 0; tmp = getSuperState(tmp)) {
                 exitAction(tmp);
             }
@@ -464,6 +466,30 @@
     };
 
     // ======================================================================
+    // base state container
+    // ======================================================================
+    template <typename StateContainer, typename ParamType = int, typename ResultType = int>
+    struct BaseStateContainer {
+	typedef GenericState<StateContainer> State;
+	typedef GenericEvent<ParamType> Event;
+	typedef State (StateContainer::*Handler)(const Event&);
+	typedef ResultType Output;
+
+	// derived class must define this method
+	virtual const Handler InitialState() const = 0;
+
+	virtual bool ExitOnDestruct() const { return true; }
+
+	virtual State TopState(const Event& event) {
+	    switch(event) {
+	    case INIT_EVENT:
+		return State::Initial(InitialState());
+	    }
+	    return 0;
+	}
+    };
+
+    // ======================================================================
     // state container traits
     // ======================================================================
     template <typename T>
@@ -475,27 +501,4 @@
     };
 }
 
-// ======================================================================
-// helper macro
-// ======================================================================
-
-#define DECLARE_ImportantTypes(container, param, result)	\
-    typedef GenericState<container> State;			\
-    typedef GenericEvent<param> Event;				\
-    typedef State (container::*Handler)(const Event&);		\
-    typedef result Output;
-
-#define DECLARE_TopState(container, initial)		\
-    State TopState(const Event& event) {		\
-        switch(event) {					\
-        case INIT_EVENT:				\
-            return State::Initial(&container::initial); \
-        }						\
-        return 0;					\
-    }
-
-#define DECLARE_StateContainer(container, param, result, initial)	\
-    DECLARE_ImportantTypes(container, param, result)			\
-    DECLARE_TopState(container, initial)
-
 #endif	// INC__GenericStateMachine__
Index: AquaSKK/src/statemachine/SKKEngine.h
diff -u AquaSKK/src/statemachine/SKKEngine.h:1.1.2.1 AquaSKK/src/statemachine/SKKEngine.h:1.1.2.2
--- AquaSKK/src/statemachine/SKKEngine.h:1.1.2.1	Sun Sep  2 12:36:25 2007
+++ AquaSKK/src/statemachine/SKKEngine.h	Sun Sep 23 23:48:08 2007
@@ -1,5 +1,5 @@
 /* -*- C++ -*-
-   $Id: SKKEngine.h,v 1.1.2.1 2007/09/02 03:36:25 t-suwa Exp $
+   $Id: SKKEngine.h,v 1.1.2.2 2007/09/23 14:48:08 t-suwa Exp $
 
    MacOS X implementation of the SKK input method.
 
@@ -42,9 +42,10 @@
 	    DEFINE_State(LatinInput),
 	    DEFINE_State(Ascii),
 	    DEFINE_State(Jisx0208Latin),
-	    DEFINE_State(PreConversion),
+	    DEFINE_State(Compose),
 	    DEFINE_State(EntryInput),
 	    DEFINE_State(Japanese),
+	    DEFINE_State(Okuri),
 	    DEFINE_State(Abbreviation),
 	    DEFINE_State(EntryCompletion),
 	    DEFINE_State(SelectCandidate),
Index: AquaSKK/src/statemachine/SKKEnvironment.cpp
diff -u AquaSKK/src/statemachine/SKKEnvironment.cpp:1.1.2.1 AquaSKK/src/statemachine/SKKEnvironment.cpp:1.1.2.2
--- AquaSKK/src/statemachine/SKKEnvironment.cpp:1.1.2.1	Sun Sep  2 12:36:25 2007
+++ AquaSKK/src/statemachine/SKKEnvironment.cpp	Sun Sep 23 23:48:08 2007
@@ -33,10 +33,6 @@
     delete controller_;
 }
 
-const Output& SKKEnvironment::Result() const {
-    return controller_->Result();
-}
-
 // ======================================================================
 // level 1:かな入力
 // ======================================================================
@@ -229,9 +225,9 @@
 }
 
 // ======================================================================
-// level 1:変換前
+// level 1:見出し語構築
 // ======================================================================
-State SKKEnvironment::PreConversion(const Event& event) {
+State SKKEnvironment::Compose(const Event& event) {
     switch(event) {
     case SKK_ENTER:
 	return controller_->HandleEnter();
@@ -268,7 +264,7 @@
 }
 
 // ======================================================================
-// level 2 (sub of PreConversion):見出し語入力
+// level 2 (sub of Compose):見出し語入力
 // ======================================================================
 State SKKEnvironment::EntryInput(const Event& event) {
     const SKKEventParam& param = event.Param();
@@ -284,7 +280,7 @@
 	return controller_->HandleInput(param);
     }
 
-    return &SKKEnvironment::PreConversion;
+    return &SKKEnvironment::Compose;
 }
 
 // ======================================================================
@@ -301,6 +297,19 @@
 }
 
 // ======================================================================
+// level 3 (sub of EntryInput):送り
+// ======================================================================
+State SKKEnvironment::Okuri(const Event& event) {
+    switch(event) {
+    case ENTRY_EVENT:
+	controller_->ChangeState(SKK::OkuriInput);
+	return 0;
+    }
+
+    return &SKKEnvironment::EntryInput;
+}
+
+// ======================================================================
 // level 3 (sub of EntryInput):省略表記
 // ======================================================================
 State SKKEnvironment::Abbreviation(const Event& event) {
@@ -315,7 +324,7 @@
 }
 
 // ======================================================================
-// level 2 (sub of PreConversion):見出し語補完
+// level 2 (sub of Compose):見出し語補完
 // ======================================================================
 State SKKEnvironment::EntryCompletion(const Event& event) {
     const SKKEventParam& param = event.Param();
@@ -332,7 +341,7 @@
        (event == SKK_CHAR && (param.IsNextCandidate() ||
 			      param.IsNextCompletion() ||
 			      param.IsPrevCompletion()))) {
-	return &SKKEnvironment::PreConversion;
+	return &SKKEnvironment::Compose;
     }
 
     // 補完キー以外なら履歴に転送する
Index: AquaSKK/src/statemachine/SKKEnvironment.h
diff -u AquaSKK/src/statemachine/SKKEnvironment.h:1.1.2.1 AquaSKK/src/statemachine/SKKEnvironment.h:1.1.2.2
--- AquaSKK/src/statemachine/SKKEnvironment.h:1.1.2.1	Sun Sep  2 12:36:25 2007
+++ AquaSKK/src/statemachine/SKKEnvironment.h	Sun Sep 23 23:48:08 2007
@@ -23,23 +23,20 @@
 
 #include "GenericStateMachine.h"
 #include "SKKEventParam.h"
-#include "SKKEventResult.h"
 
 using namespace statemachinecxx_sourceforge_jp;
 
 class SKKController;
 
 // 実行環境
-class SKKEnvironment {
+class SKKEnvironment : public BaseStateContainer<SKKEnvironment, SKKEventParam> {
     SKKController* controller_;
 
 public:
-    DECLARE_StateContainer(SKKEnvironment, SKKEventParam, SKKEventResult, KanaInput);
-
     SKKEnvironment();
     ~SKKEnvironment();
 
-    const Output& Result() const;
+    const Handler InitialState() const { return &SKKEnvironment::KanaInput; }
 
     // level 1 (initial state)
     State KanaInput(const Event& event);
@@ -57,16 +54,17 @@
     	State Jisx0208Latin(const Event& event);
 
     // level 1
-    State PreConversion(const Event& event);
+    State Compose(const Event& event);
 
-    	// level 2 (sub of PreConversion)
+    	// level 2 (sub of Compose)
     	State EntryInput(const Event& event);
 
     	    // lelvel 3 (sub of EntryInput)
     	    State Japanese(const Event& event);
+    	    State Okuri(const Event& event);
     	    State Abbreviation(const Event& event);
 
-    	// level 2 (sub of PreConversion)
+    	// level 2 (sub of Compose)
     	State EntryCompletion(const Event& event);
 
     // level 1
Index: AquaSKK/src/statemachine/SKKEventResult.cpp
diff -u AquaSKK/src/statemachine/SKKEventResult.cpp:1.1.2.1 AquaSKK/src/statemachine/SKKEventResult.cpp:removed
--- AquaSKK/src/statemachine/SKKEventResult.cpp:1.1.2.1	Sun Sep  2 12:36:25 2007
+++ AquaSKK/src/statemachine/SKKEventResult.cpp	Sun Sep 23 23:48:09 2007
@@ -1,35 +0,0 @@
-/* -*- C++ -*-
-   MacOS X implementation of the SKK input method.
-
-   Copyright (C) 2007 Tomotaka SUWA <t.suw****@mac*****>
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#include "SKKEventResult.h"
-
-SKKEventResult::SKKEventResult() : impl_(new SKKEventResultImpl()) {}
-
-SKKEventResult::SKKEventResult(const SKKEventResult&) : impl_(new SKKEventResultImpl()) {}
-
-void SKKEventResult::Update() {
-    impl_->Update();
-}
-
-bool SKKEventResult::EventIsHandled() const {
-    // const メソッドなので、ポインタ経由で内部実装の状態を更新
-    return impl_->TestAndReset();
-    // この実装はいやらしいので、代替案を検討すること
-}
Index: AquaSKK/src/statemachine/SKKEventResult.h
diff -u AquaSKK/src/statemachine/SKKEventResult.h:1.1.2.1 AquaSKK/src/statemachine/SKKEventResult.h:removed
--- AquaSKK/src/statemachine/SKKEventResult.h:1.1.2.1	Sun Sep  2 12:36:25 2007
+++ AquaSKK/src/statemachine/SKKEventResult.h	Sun Sep 23 23:48:09 2007
@@ -1,64 +0,0 @@
-/* -*- C++ -*-
-   MacOS X implementation of the SKK input method.
-
-   Copyright (C) 2007 Tomotaka SUWA <t.suw****@mac*****>
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-*/
-
-#ifndef INC__SKKEventResult__
-#define INC__SKKEventResult__
-
-#include <memory>
-
-// 内部実装
-class SKKEventResultImpl {
-    bool handled_;
-    bool backup_;
-
-public:
-    SKKEventResultImpl() : handled_(false), backup_(false) {}
-    ~SKKEventResultImpl() {}
-
-    void Update() {
-	handled_ = !backup_;
-    }
-
-    // separate query from modifier の原則をやぶる
-    bool TestAndReset() {
-	bool ret = handled_ == backup_;
-
-	backup_ = handled_;
-
-	return ret;
-    }
-};
-
-// 処理結果
-class SKKEventResult {
-    std::auto_ptr<SKKEventResultImpl> impl_;
-
-public:
-    SKKEventResult();
-    SKKEventResult(const SKKEventResult& src);
-
-    // イベントを処理した場合は呼び出す
-    void Update();
-
-    // イベントは処理されたか?
-    bool EventIsHandled() const;
-};
-
-#endif


aquaskk-changes メーリングリストの案内
アーカイブの一覧に戻る