| 1 |
<?xml version="1.0" encoding="euc-jp"?> |
| 2 |
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" |
| 3 |
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
| 4 |
<html xmlns="http://www.w3.org/1999/xhtml"> |
| 5 |
|
| 6 |
<head> |
| 7 |
<meta http-equiv="content-script-type" content="text/javascript" /> |
| 8 |
<meta http-equiv="content-type" content="text/html; charset=EUC-JP" /> |
| 9 |
<link rel="stylesheet" href="./statemachinecxx.css" media="all" type="text/css" /> |
| 10 |
<script type="text/javascript" src="./util.js"></script> |
| 11 |
<title>Generic State Machine Library for C++ :: チュートリアル</title> |
| 12 |
</head> |
| 13 |
|
| 14 |
<body> |
| 15 |
|
| 16 |
<h1><a href="./index.html">Generic State Machine Library for C++</a> :: チュートリアル</h1> |
| 17 |
|
| 18 |
<div class="main"> |
| 19 |
|
| 20 |
<div class="popup" id="tooltip"></div> |
| 21 |
|
| 22 |
<!-- |
| 23 |
<p id="id">ToolTip の文字列</p> |
| 24 |
<span onMouseOut="hidetip();" onMouseOver="showtip('id', event);">tip のテスト</span> |
| 25 |
<span onMouseOut="hidetip();" onMouseOver="showtip('a1', event);">tip のテスト</span> |
| 26 |
--> |
| 27 |
|
| 28 |
<h2>目次</h2> |
| 29 |
|
| 30 |
<ul> |
| 31 |
<li><a href="#1">Hello World!</a></li> |
| 32 |
<li><a href="#2">ストップウオッチ</a></li> |
| 33 |
</ul> |
| 34 |
|
| 35 |
<h2><a name="1">Hello World!</a></h2> |
| 36 |
|
| 37 |
<p>状態が一つだけの単純なモデルです。</p> |
| 38 |
|
| 39 |
<h4>状態遷移図</h4> |
| 40 |
|
| 41 |
<img src="./images/helloworld.png" /> |
| 42 |
|
| 43 |
<h4>コード</h4> |
| 44 |
|
| 45 |
<!-- Generator: GNU source-highlight 2.1.2 |
| 46 |
by Lorenzo Bettini |
| 47 |
http://www.lorenzobettini.it |
| 48 |
http://www.gnu.org/software/src-highlite --> |
| 49 |
<pre><tt><span onMouseOut="hidetip();" onMouseOver="showtip('1-1', event);"><span class="linenum">01:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string"><iostream></span> |
| 50 |
<span class="linenum">02:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string">"GenericStateMachine.h"</span></span> |
| 51 |
<span class="linenum">03:</span> |
| 52 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-4', event);"><span class="linenum">04:</span> <span class="keyword">using</span><span class="normal"> </span><span class="keyword">namespace</span><span class="normal"> statemachinecxx_sourceforge_jp</span><span class="symbol">;</span></span> |
| 53 |
<span class="linenum">05:</span> |
| 54 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-6', event);"><span class="linenum">06:</span> <span class="keyword">struct</span><span class="normal"> param </span><span class="cbracket">{</span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> イベントパラメータ</span> |
| 55 |
<span class="linenum">07:</span> <span class="keyword">struct</span><span class="normal"> result </span><span class="cbracket">{</span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理結果</span></span> |
| 56 |
<span class="linenum">08:</span> |
| 57 |
<span class="linenum">09:</span> <span class="comment">//</span><span class="comment"> 状態コンテナクラス</span> |
| 58 |
<span class="linenum">10:</span> <span class="keyword">struct</span><span class="normal"> Greeting </span><span class="cbracket">{</span> |
| 59 |
<span class="linenum">11:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> ヘルパーマクロ(おっとっと! 看板に偽りあり、ですね ;-)</span> |
| 60 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-12', event);"><span class="linenum">12:</span> <span class="normal"> </span><span class="function">DECLARE_StateContainer</span><span class="symbol">(</span><span class="normal">Greeting</span><span class="symbol">,</span><span class="normal"> param</span><span class="symbol">,</span><span class="normal"> result</span><span class="symbol">,</span><span class="normal"> entryPoint</span><span class="symbol">)</span><span class="symbol">;</span> |
| 61 |
<span class="linenum">13:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数1:状態コンテナクラス名</span> |
| 62 |
<span class="linenum">14:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数2:イベントパラメータ型名</span> |
| 63 |
<span class="linenum">15:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数3:処理結果型名</span> |
| 64 |
<span class="linenum">16:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 引数4:初期状態関数</span></span> |
| 65 |
<span class="linenum">17:</span> |
| 66 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-18', event);"><span class="linenum">18:</span> <span class="normal"> </span><span class="function">Greeting</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 67 |
<span class="linenum">19:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"construct Greeting"</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 68 |
<span class="linenum">20:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 69 |
<span class="linenum">21:</span> |
| 70 |
<span class="linenum">22:</span> <span class="normal"> </span><span class="symbol">~</span><span class="function">Greeting</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 71 |
<span class="linenum">23:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"destruct Greeting"</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 72 |
<span class="linenum">24:</span> <span class="normal"> </span><span class="cbracket">}</span></span> |
| 73 |
<span class="linenum">25:</span> |
| 74 |
<span class="linenum">26:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態関数 -- イベントを引数に取り、状態を返す</span> |
| 75 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-27', event);"><span class="linenum">27:</span> <span class="normal"> State </span><span class="function">entryPoint</span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> Event</span><span class="symbol">&</span><span class="normal"> event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span></span> |
| 76 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-28', event);"><span class="linenum">28:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span></span> |
| 77 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-29', event);"><span class="linenum">29:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> ENTRY_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 入場時アクション</span> |
| 78 |
<span class="linenum">30:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"Hello World!"</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 79 |
<span class="linenum">31:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span> |
| 80 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-32', event);"><span class="linenum">32:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> EXIT_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 退場時アクション</span> |
| 81 |
<span class="linenum">33:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"Bye Bye World!"</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 82 |
<span class="linenum">34:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span> |
| 83 |
<span class="linenum">35:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 84 |
<span class="linenum">36:</span> |
| 85 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-37', event);"><span class="linenum">37:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理しなかったイベントは上位状態(super state)で</span> |
| 86 |
<span class="linenum">38:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> ハンドリングさせる</span> |
| 87 |
<span class="linenum">39:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Super</span><span class="symbol">(</span><span class="symbol">&</span><span class="normal">Greeting</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">TopState</span><span class="symbol">)</span><span class="symbol">;</span> |
| 88 |
<span class="linenum">40:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> TopState は DECLARE_StateContainer が定義している</span></span> |
| 89 |
<span class="linenum">41:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 90 |
<span class="linenum">42:</span> <span class="cbracket">}</span><span class="symbol">;</span> |
| 91 |
<span class="linenum">43:</span> |
| 92 |
<span class="linenum">44:</span> <span class="type">int</span><span class="normal"> </span><span class="function">main</span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span><span class="normal"> </span><span class="type">char</span><span class="symbol">*</span><span class="symbol">*</span><span class="normal"> argv</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 93 |
<span class="linenum">45:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="number">1</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 94 |
<span class="linenum">46:</span> |
| 95 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-47', event);"><span class="linenum">47:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態機械を実体化する</span> |
| 96 |
<span class="linenum">48:</span> <span class="normal"> GenericStateMachine</span><span class="symbol"><</span><span class="normal">Greeting</span><span class="symbol">></span><span class="normal"> greeting</span><span class="symbol">;</span></span> |
| 97 |
<span class="linenum">49:</span> |
| 98 |
<span class="linenum">50:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="number">2</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 99 |
<span class="linenum">51:</span> |
| 100 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-52', event);"><span class="linenum">52:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 起動</span> |
| 101 |
<span class="linenum">53:</span> <span class="normal"> greeting</span><span class="symbol">.</span><span class="function">Start</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">;</span></span> |
| 102 |
<span class="linenum">54:</span> |
| 103 |
<span class="linenum">55:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="number">3</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 104 |
<span class="linenum">56:</span> |
| 105 |
<span onMouseOut="hidetip();" onMouseOver="showtip('1-57', event);"><span class="linenum">57:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span> |
| 106 |
<span class="linenum">58:</span> <span class="cbracket">}</span></span> |
| 107 |
</tt></pre> |
| 108 |
|
| 109 |
<h4>実行結果</h4> |
| 110 |
<pre>1 |
| 111 |
construct Greeting |
| 112 |
2 |
| 113 |
Hello World! |
| 114 |
3 |
| 115 |
Bye Bye World! |
| 116 |
destruct Greeting</pre> |
| 117 |
|
| 118 |
<h4>解説</h4> |
| 119 |
|
| 120 |
<table> |
| 121 |
<tr> |
| 122 |
<th>行番号</th><th>説明</th> |
| 123 |
</tr> |
| 124 |
<tr> |
| 125 |
<td>1-2</td> |
| 126 |
<td id='1-1'>ライブラリが提供するのは、"GenericStateMachine.h" だけです。</td> |
| 127 |
</tr> |
| 128 |
<tr> |
| 129 |
<td>4</td> |
| 130 |
<td id='1-4'>ライブラリの名前空間です。</td> |
| 131 |
</tr> |
| 132 |
<tr> |
| 133 |
<td>6-7</td> |
| 134 |
<td id='1-6'>イベントのパラメータと、処理結果をカスタマイズできます。<br /> |
| 135 |
このサンプルでは使わないので、空の構造体にしておきます。</td> |
| 136 |
</tr> |
| 137 |
<tr> |
| 138 |
<td>12</td> |
| 139 |
<td id='1-12'>状態コンテナクラスに必要な型や関数を定義するヘルパーマクロです。以下の型を定義します。<br /> |
| 140 |
<pre>typedef GenericState<<em>状態コンテナクラス名</em>> <strong>State</strong>; |
| 141 |
typedef GenericEvent<<em>イベントパラメータ型名</em>> <strong>Event</strong>; |
| 142 |
typedef State (<em>状態コンテナクラス名</em>::*<strong>Handler</strong>)(const Event&); |
| 143 |
typedef <em>処理結果型名</em> <strong>Output</strong>;</pre> |
| 144 |
また、最上位の状態関数も定義します。 |
| 145 |
<pre><strong>State TopState(const Event& event)</strong> { |
| 146 |
switch(event) { |
| 147 |
case INIT_EVENT: |
| 148 |
return State::Initial(&<em>状態コンテナクラス名</em>::<em>初期状態関数</em>); |
| 149 |
} |
| 150 |
return 0; |
| 151 |
}</pre>ヘルパーマクロの展開結果は、public である必要があります。</td> |
| 152 |
</tr> |
| 153 |
<tr> |
| 154 |
<td>18-24</td> |
| 155 |
<td id='1-18'>コンストラクタとデストラクタです。</td> |
| 156 |
</tr> |
| 157 |
<tr> |
| 158 |
<td>27</td> |
| 159 |
<td id='1-27'>状態関数です。状態関数のアドレスは、ヘルパーマクロの定義した Handler 型変数に格納できます。</td> |
| 160 |
</tr> |
| 161 |
<tr> |
| 162 |
<td>28</td> |
| 163 |
<td id='1-28'>Event クラスの <strong>int operator()</strong> を使ってイベントを判別します。</td> |
| 164 |
</tr> |
| 165 |
<tr> |
| 166 |
<td>29-31</td> |
| 167 |
<td id='1-29'>状態に入る時に発生するイベントです。<strong>イベントを処理をした場合は必ず 0</strong> を返します。 |
| 168 |
<br />状態関数のお約束です。</td> |
| 169 |
</tr> |
| 170 |
<tr> |
| 171 |
<td>32-34</td> |
| 172 |
<td id='1-32'>状態から抜ける時に発生するイベントです。<strong>イベントを処理をした場合は必ず 0</strong> を返します。 |
| 173 |
<br />状態関数のお約束です。</td> |
| 174 |
</tr> |
| 175 |
<tr> |
| 176 |
<td>37-40</td> |
| 177 |
<td id='1-37'>処理しなかったイベントに対しては、必ず <strong>State::Super(上位の状態関数のアドレス)</strong> |
| 178 |
を返します。<br />状態関数のお約束です。</td> |
| 179 |
</tr> |
| 180 |
|
| 181 |
<tr> |
| 182 |
<td>47-48</td> |
| 183 |
<td id='1-47'>状態機械を Greeting で実体化します。Greeting のコンストラクタが実行されます。</td> |
| 184 |
</tr> |
| 185 |
<tr> |
| 186 |
<td>52-53</td> |
| 187 |
<td id='1-52'><strong>Start()</strong> で初期遷移を実行します。TopState から entryPoint へと状態遷移が行なわれます。 |
| 188 |
<br />entryPoint に対して ENTRY イベントが転送されます。</td> |
| 189 |
</tr> |
| 190 |
<tr> |
| 191 |
<td>57-58</td> |
| 192 |
<td id='1-57'>entryPoint に対して EXIT イベントが転送されます。 |
| 193 |
<br />最後に、Greeting のデストラクタが呼び出されます。</td> |
| 194 |
</tr> |
| 195 |
</table> |
| 196 |
|
| 197 |
<h2><a name="2">ストップウォッチ</a></h2> |
| 198 |
|
| 199 |
<p>STARTSTOP と RESET ボタンを備えたストップウオッチのモデルです。</p> |
| 200 |
|
| 201 |
<h4>状態遷移図</h4> |
| 202 |
|
| 203 |
<img src="./images/stopwatch.png" /> |
| 204 |
|
| 205 |
<h4>コード</h4> |
| 206 |
|
| 207 |
<!-- Generator: GNU source-highlight 2.1.2 |
| 208 |
by Lorenzo Bettini |
| 209 |
http://www.lorenzobettini.it |
| 210 |
http://www.gnu.org/software/src-highlite --> |
| 211 |
<pre><tt><span class="linenum">01:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string"><iostream></span> |
| 212 |
<span class="linenum">02:</span> <span class="preproc">#include</span><span class="normal"> </span><span class="string">"GenericStateMachine.h"</span> |
| 213 |
<span class="linenum">03:</span> |
| 214 |
<span class="linenum">04:</span> <span class="keyword">using</span><span class="normal"> </span><span class="keyword">namespace</span><span class="normal"> statemachinecxx_sourceforge_jp</span><span class="symbol">;</span> |
| 215 |
<span class="linenum">05:</span> |
| 216 |
<span class="linenum">06:</span> <span class="keyword">struct</span><span class="normal"> param </span><span class="cbracket">{</span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> イベントパラメータは使わない</span> |
| 217 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-7', event);"><span class="linenum">07:</span> <span class="keyword">struct</span><span class="normal"> result </span><span class="cbracket">{</span><span class="normal"> </span><span class="type">int</span><span class="normal"> elapsed</span><span class="symbol">;</span><span class="normal"> </span><span class="cbracket">}</span><span class="symbol">;</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理結果</span></span> |
| 218 |
<span class="linenum">08:</span> |
| 219 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-9', event);"><span class="linenum">09:</span> <span class="comment">//</span><span class="comment"> ユーザー定義イベント</span> |
| 220 |
<span class="linenum">10:</span> <span class="keyword">enum</span><span class="normal"> </span><span class="cbracket">{</span> |
| 221 |
<span class="linenum">11:</span> <span class="normal"> STARTSTOP </span><span class="symbol">=</span><span class="normal"> USER_EVENT</span><span class="symbol">,</span> |
| 222 |
<span class="linenum">12:</span> <span class="normal"> RESET</span><span class="symbol">,</span> |
| 223 |
<span class="linenum">13:</span> <span class="cbracket">}</span><span class="symbol">;</span></span> |
| 224 |
<span class="linenum">14:</span> |
| 225 |
<span class="linenum">15:</span> <span class="keyword">struct</span><span class="normal"> StopWatch </span><span class="cbracket">{</span> |
| 226 |
<span class="linenum">16:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> ヘルパーマクロ</span> |
| 227 |
<span class="linenum">17:</span> <span class="normal"> </span><span class="function">DECLARE_StateContainer</span><span class="symbol">(</span><span class="normal">StopWatch</span><span class="symbol">,</span><span class="normal"> param</span><span class="symbol">,</span><span class="normal"> result</span><span class="symbol">,</span><span class="normal"> Stopped</span><span class="symbol">)</span><span class="symbol">;</span> |
| 228 |
<span class="linenum">18:</span> |
| 229 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-19', event);"><span class="linenum">19:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 結果を初期化</span> |
| 230 |
<span class="linenum">20:</span> <span class="normal"> </span><span class="function">StopWatch</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span><span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span><span class="normal"> </span><span class="cbracket">}</span></span> |
| 231 |
<span class="linenum">21:</span> |
| 232 |
<span class="linenum">22:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 停止状態</span> |
| 233 |
<span class="linenum">23:</span> <span class="normal"> State </span><span class="function">Stopped</span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> Event</span><span class="symbol">&</span><span class="normal"> event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 234 |
<span class="linenum">24:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 235 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-25', event);"><span class="linenum">25:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> STARTSTOP</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態遷移</span> |
| 236 |
<span class="linenum">26:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"*** start ***"</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 237 |
<span class="linenum">27:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Transition</span><span class="symbol">(</span><span class="symbol">&</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">Running</span><span class="symbol">)</span><span class="symbol">;</span></span> |
| 238 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-28', event);"><span class="linenum">28:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> RESET</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 内部遷移(リセット)</span> |
| 239 |
<span class="linenum">29:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"*** reset ***"</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 240 |
<span class="linenum">30:</span> <span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">=</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span> |
| 241 |
<span class="linenum">31:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span> |
| 242 |
<span class="linenum">32:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 243 |
<span class="linenum">33:</span> |
| 244 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-34', event);"><span class="linenum">34:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Super</span><span class="symbol">(</span><span class="symbol">&</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">TopState</span><span class="symbol">)</span><span class="symbol">;</span></span> |
| 245 |
<span class="linenum">35:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 246 |
<span class="linenum">36:</span> |
| 247 |
<span class="linenum">37:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 計測状態</span> |
| 248 |
<span class="linenum">38:</span> <span class="normal"> State </span><span class="function">Running</span><span class="symbol">(</span><span class="keyword">const</span><span class="normal"> Event</span><span class="symbol">&</span><span class="normal"> event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 249 |
<span class="linenum">39:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">event</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 250 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-40', event);"><span class="linenum">40:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> ENTRY_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 計測を開始</span> |
| 251 |
<span class="linenum">41:</span> <span class="normal"> start_ </span><span class="symbol">=</span><span class="normal"> </span><span class="function">time</span><span class="symbol">(</span><span class="number">0</span><span class="symbol">)</span><span class="symbol">;</span> |
| 252 |
<span class="linenum">42:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span> |
| 253 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-43', event);"><span class="linenum">43:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> EXIT_EVENT</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 計測を終了</span> |
| 254 |
<span class="linenum">44:</span> <span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol">+</span><span class="symbol">=</span><span class="normal"> </span><span class="function">time</span><span class="symbol">(</span><span class="number">0</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">-</span><span class="normal"> start_</span><span class="symbol">;</span> |
| 255 |
<span class="linenum">45:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"RESULT: "</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 256 |
<span class="linenum">46:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span> |
| 257 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-47', event);"><span class="linenum">47:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> STARTSTOP</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 状態遷移</span> |
| 258 |
<span class="linenum">48:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Transition</span><span class="symbol">(</span><span class="symbol">&</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">Stopped</span><span class="symbol">)</span><span class="symbol">;</span></span> |
| 259 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-49', event);"><span class="linenum">49:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> RESET</span><span class="symbol">:</span><span class="normal"> </span><span class="comment">//</span><span class="comment"> 内部遷移(LAP 計測)</span> |
| 260 |
<span class="linenum">50:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"LAP: "</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="function">time</span><span class="symbol">(</span><span class="number">0</span><span class="symbol">)</span><span class="normal"> </span><span class="symbol">-</span><span class="normal"> start_ </span><span class="symbol">+</span><span class="normal"> result_</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span> |
| 261 |
<span class="linenum">51:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span></span> |
| 262 |
<span class="linenum">52:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 263 |
<span class="linenum">53:</span> |
| 264 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-54', event);"><span class="linenum">54:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> State</span><span class="symbol">:</span><span class="symbol">:</span><span class="function">Super</span><span class="symbol">(</span><span class="symbol">&</span><span class="normal">StopWatch</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">TopState</span><span class="symbol">)</span><span class="symbol">;</span></span> |
| 265 |
<span class="linenum">55:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 266 |
<span class="linenum">56:</span> |
| 267 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-57', event);"><span class="linenum">57:</span> <span class="normal"> </span><span class="comment">//</span><span class="comment"> 処理結果</span> |
| 268 |
<span class="linenum">58:</span> <span class="normal"> </span><span class="keyword">const</span><span class="normal"> Output</span><span class="symbol">&</span><span class="normal"> </span><span class="function">Result</span><span class="symbol">(</span><span class="symbol">)</span><span class="normal"> </span><span class="keyword">const</span><span class="normal"> </span><span class="cbracket">{</span> |
| 269 |
<span class="linenum">59:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> result_</span><span class="symbol">;</span> |
| 270 |
<span class="linenum">60:</span> <span class="normal"> </span><span class="cbracket">}</span></span> |
| 271 |
<span class="linenum">61:</span> |
| 272 |
<span class="linenum">62:</span> <span class="keyword">private</span><span class="symbol">:</span> |
| 273 |
<span class="linenum">63:</span> <span class="normal"> result result_</span><span class="symbol">;</span> |
| 274 |
<span class="linenum">64:</span> <span class="normal"> time_t start_</span><span class="symbol">;</span> |
| 275 |
<span class="linenum">65:</span> <span class="cbracket">}</span><span class="symbol">;</span> |
| 276 |
<span class="linenum">66:</span> |
| 277 |
<span class="linenum">67:</span> <span class="type">int</span><span class="normal"> </span><span class="function">main</span><span class="symbol">(</span><span class="type">int</span><span class="normal"> argc</span><span class="symbol">,</span><span class="normal"> </span><span class="type">char</span><span class="symbol">*</span><span class="symbol">*</span><span class="normal"> argv</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 278 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-68', event);"><span class="linenum">68:</span> <span class="normal"> GenericStateMachine</span><span class="symbol"><</span><span class="normal">StopWatch</span><span class="symbol">></span><span class="normal"> sw</span><span class="symbol">;</span> |
| 279 |
<span class="linenum">69:</span> |
| 280 |
<span class="linenum">70:</span> <span class="normal"> sw</span><span class="symbol">.</span><span class="function">Start</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">;</span></span> |
| 281 |
<span class="linenum">71:</span> |
| 282 |
<span class="linenum">72:</span> <span class="normal"> </span><span class="keyword">while</span><span class="symbol">(</span><span class="keyword">true</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 283 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-73', event);"><span class="linenum">73:</span> <span class="normal"> </span><span class="type">char</span><span class="normal"> ch</span><span class="symbol">;</span> |
| 284 |
<span class="linenum">74:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"command(s:start/stop, r:reset, q:quit)> "</span><span class="symbol">;</span> |
| 285 |
<span class="linenum">75:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cin </span><span class="symbol">></span><span class="symbol">></span><span class="normal"> ch</span><span class="symbol">;</span> |
| 286 |
<span class="linenum">76:</span> <span class="normal"> </span><span class="keyword">if</span><span class="symbol">(</span><span class="normal">ch </span><span class="symbol">=</span><span class="symbol">=</span><span class="normal"> </span><span class="string">'q'</span><span class="symbol">)</span><span class="normal"> </span><span class="keyword">break</span><span class="symbol">;</span></span> |
| 287 |
<span class="linenum">77:</span> <span class="normal"> </span><span class="keyword">switch</span><span class="symbol">(</span><span class="normal">ch</span><span class="symbol">)</span><span class="normal"> </span><span class="cbracket">{</span> |
| 288 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-78', event);"><span class="linenum">78:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> </span><span class="string">'s'</span><span class="symbol">:</span> |
| 289 |
<span class="linenum">79:</span> <span class="normal"> sw</span><span class="symbol">.</span><span class="function">Dispatch</span><span class="symbol">(</span><span class="normal">STARTSTOP</span><span class="symbol">)</span><span class="symbol">;</span> |
| 290 |
<span class="linenum">80:</span> <span class="normal"> </span><span class="keyword">break</span><span class="symbol">;</span> |
| 291 |
<span class="linenum">81:</span> <span class="normal"> </span><span class="keyword">case</span><span class="normal"> </span><span class="string">'r'</span><span class="symbol">:</span> |
| 292 |
<span class="linenum">82:</span> <span class="normal"> sw</span><span class="symbol">.</span><span class="function">Dispatch</span><span class="symbol">(</span><span class="normal">RESET</span><span class="symbol">)</span><span class="symbol">;</span> |
| 293 |
<span class="linenum">83:</span> <span class="normal"> </span><span class="keyword">break</span><span class="symbol">;</span></span> |
| 294 |
<span class="linenum">84:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 295 |
<span class="linenum">85:</span> <span class="normal"> </span><span class="cbracket">}</span> |
| 296 |
<span class="linenum">86:</span> |
| 297 |
<span onMouseOut="hidetip();" onMouseOver="showtip('2-87', event);"><span class="linenum">87:</span> <span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">cout </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> </span><span class="string">"Elapsed="</span><span class="normal"> </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> sw</span><span class="symbol">.</span><span class="function">Result</span><span class="symbol">(</span><span class="symbol">)</span><span class="symbol">.</span><span class="normal">elapsed </span><span class="symbol"><</span><span class="symbol"><</span><span class="normal"> std</span><span class="symbol">:</span><span class="symbol">:</span><span class="normal">endl</span><span class="symbol">;</span></span> |
| 298 |
<span class="linenum">88:</span> |
| 299 |
<span class="linenum">89:</span> <span class="normal"> </span><span class="keyword">return</span><span class="normal"> </span><span class="number">0</span><span class="symbol">;</span> |
| 300 |
<span class="linenum">90:</span> <span class="cbracket">}</span> |
| 301 |
</tt></pre> |
| 302 |
|
| 303 |
<h4>実行結果</h4> |
| 304 |
|
| 305 |
<pre>$ ./a.out |
| 306 |
command(s:start/stop, r:reset, q:quit)> s |
| 307 |
*** start *** |
| 308 |
command(s:start/stop, r:reset, q:quit)> r |
| 309 |
LAP: 2 |
| 310 |
command(s:start/stop, r:reset, q:quit)> r |
| 311 |
LAP: 4 |
| 312 |
command(s:start/stop, r:reset, q:quit)> s |
| 313 |
RESULT: 5 |
| 314 |
command(s:start/stop, r:reset, q:quit)> s |
| 315 |
*** start *** |
| 316 |
command(s:start/stop, r:reset, q:quit)> s |
| 317 |
RESULT: 7 |
| 318 |
command(s:start/stop, r:reset, q:quit)> r |
| 319 |
*** reset *** |
| 320 |
command(s:start/stop, r:reset, q:quit)> s |
| 321 |
*** start *** |
| 322 |
command(s:start/stop, r:reset, q:quit)> s |
| 323 |
RESULT: 2 |
| 324 |
command(s:start/stop, r:reset, q:quit)> q |
| 325 |
Elapsed=2 |
| 326 |
$</pre> |
| 327 |
|
| 328 |
<h4>解説</h4> |
| 329 |
|
| 330 |
<table> |
| 331 |
<tr> |
| 332 |
<th>行番号</th><th>説明</th> |
| 333 |
</tr> |
| 334 |
<tr> |
| 335 |
<td>7</td> |
| 336 |
<td id='2-7'>処理結果型を定義してます。状態コンテナクラスの Result() メソッドでこの構造体の const 参照を得ることができます。</td> |
| 337 |
</tr> |
| 338 |
<tr> |
| 339 |
<td>9-13</td> |
| 340 |
<td id='2-9'>ユーザーイベント用の識別子として STARTSTOP と RESET を定義しています。 |
| 341 |
<br />USER_EVENT はライブラリが定義しているユーザーイベント用の初期値です。 |
| 342 |
<br />この初期値によって、ENTRY や EXIT など他のライブラリ定数と衝突しないことを保証できます。</td> |
| 343 |
</tr> |
| 344 |
<tr> |
| 345 |
<td>19-20</td> |
| 346 |
<td id='2-19'>処理結果を初期化します。</td> |
| 347 |
</tr> |
| 348 |
<tr> |
| 349 |
<td>25-27</td> |
| 350 |
<td id='2-25'>STARTSTOP イベントをハンドリングしています。状態遷移をする時のお約束は、 |
| 351 |
<br /><strong>State::Transition(状態関数のアドレス)</strong> を返すことです。</td> |
| 352 |
</tr> |
| 353 |
<tr> |
| 354 |
<td>28-31</td> |
| 355 |
<td id='2-28'>RESET イベントで経過時間を 0 にリセットします。</td> |
| 356 |
</tr> |
| 357 |
|
| 358 |
<tr> |
| 359 |
<td>34</td> |
| 360 |
<td id='2-34'>状態関数のお約束です。</td> |
| 361 |
</tr> |
| 362 |
|
| 363 |
<tr> |
| 364 |
<td>40-42</td> |
| 365 |
<td id='2-40'>ENTRY イベントです。計測を開始します。</td> |
| 366 |
</tr> |
| 367 |
<tr> |
| 368 |
<td>43-46</td> |
| 369 |
<td id='2-43'>EXIT イベントです。計測を終了します。</td> |
| 370 |
</tr> |
| 371 |
|
| 372 |
<tr> |
| 373 |
<td>47-48</td> |
| 374 |
<td id='2-47'>Stopped に状態遷移しています。この次に、EXIT イベントが発生します。</td> |
| 375 |
</tr> |
| 376 |
<tr> |
| 377 |
<td>49-51</td> |
| 378 |
<td id='2-49'>RESET イベントで LAP を計測しています。</td> |
| 379 |
</tr> |
| 380 |
|
| 381 |
<tr> |
| 382 |
<td>54</td> |
| 383 |
<td id='2-54'>状態関数のお約束です。</td> |
| 384 |
</tr> |
| 385 |
|
| 386 |
<tr> |
| 387 |
<td>57-60</td> |
| 388 |
<td id='2-57'>処理結果型への const 参照を返します。</td> |
| 389 |
</tr> |
| 390 |
|
| 391 |
<tr> |
| 392 |
<td>68-70</td> |
| 393 |
<td id='2-68'>実体化と初期遷移です。Stopped 状態に遷移します。</td> |
| 394 |
</tr> |
| 395 |
|
| 396 |
<tr> |
| 397 |
<td>73-76</td> |
| 398 |
<td id='2-73'>コマンドを処理しています。</td> |
| 399 |
</tr> |
| 400 |
<tr> |
| 401 |
<td>78-83</td> |
| 402 |
<td id='2-78'><strong>Dispatch()</strong> を呼び出して、イベントを転送しています。</td> |
| 403 |
</tr> |
| 404 |
<tr> |
| 405 |
<td>87</td> |
| 406 |
<td id='2-87'><strong>Reseult()</strong> を呼び出して、処理結果を取得しています。</td> |
| 407 |
</tr> |
| 408 |
|
| 409 |
</table> |
| 410 |
|
| 411 |
</div> |
| 412 |
|
| 413 |
<div class="sidebar"> |
| 414 |
<script type="text/javascript">lastupdate("$Date: 2006/09/17 09:41:04 $");</script> |
| 415 |
<script type="text/javascript" src="./sidebar.js"></script> |
| 416 |
</div> |
| 417 |
|
| 418 |
<div class="footer"> |
| 419 |
<p>Copyright © 2006 Tomotaka SUWA All Rights Reserved.</p> |
| 420 |
</div> |
| 421 |
|
| 422 |
</body> |
| 423 |
</html> |