interleave の処理の設計ノート
20050805 -MT-
2005080503 -KM-
20050824 -MT-
【interleave 用のデータと操作】
+ データ
- interleaveArray[]
-> brunch() を行う位置を格納する配列。
-> interleave の子要素の最後に、0 を格納する。
+ 操作
- brunchInterleave()
-> 未だ通過していないルートのみに、brunch() を行う。
- finishInterleave()
-> interleaveArray[] の値が、全て 0 以外であれば、interleave の処理
を終えると判定する。(この場合、全て負の値が格納されている)
-> interleaveArray[] の値に、1つでも 0 が格納されていれば、remove()
する。
- livingInterleave()
-> interleaveArray[] の値に、一つでも 0 以外の値があれば、0 を返す。
-> 0 を返すと、remove() される。
【decode】
+ UMS
INTERLEAVE_A1
INTERLEAVE_A2
INTERLEAVE_B
INTERLEAVE_C
+ 処理方針
[interleave template]
- interleave 配列に、interleave の子要素の case 番号を代入する。
- brunchInterleave() をコールし、interleave の子要素への brunch を行う。
- interleave の子要素について、それぞれ case 番号を貼り付ける。
- interleave の子要素の最後で、interleave 配列に 0 を代入する。
interleave の最後に Jump させる。
- finishInterleave() の呼び出しを記述する。
[byte、bit、line template]
- 処理の最初で livingInterleave (すべてのカウンタが 0 でないこと)
をチェックする。否ならば、remove する。
- 処理の最後で、interleave 配列の値を、自分の case -番号に更新する。
- brunchInterleave() をコールする。
+ 生成ソースイメージ
//
case 20:
interleaveArray[0] = 32;
interleaveArray[1] = 122;
interleaveArray[2] = 162;
brunchInterleave( 0, 3 );
//
case 32:
//
if ( ! livingInterleave( 3 ) ) {
remove();
break;
}
//
//INTERLEAVE_A1
//
//
interleaveArray[0] = -42;
ums__num_alive = brunchInterleave( 0, 3 );
case -42:
//
//
if ( ! livingInterleave( 3 ) ) {
remove();
break;
}
//
//INTERLEAVE_A2
//
//
interleaveArray[0] = -82;
ums__num_alive = brunchInterleave( 0, 3 );
case -82:
//
interleaveArray[0] = 0;
cpos = -20;
continue;
//
//
case 122:
if ( ! livingInterleave( 3 ) ) {
remove();
break;
}
//
//INTERLEAVE_B
//
//
interleaveArray[1] = -122;
ums__num_alive = brunchInterleave( 0, 3 );
case -122:
//
interleaveArray[1] = 0;
cpos = -20;
continue;
//
case 162:
//
if ( ! livingInterleave( 3 ) ) {
remove();
break;
}
//
//INTERLEAVE_C
//
//
interleaveArray[2] = -172;
ums__num_alive = brunchInterleave( 0, 3 );
case -172:
//
interleaveArray[2] = 0;
//
case -20:
cpos = finishInterleave( 0, 3, interleaveArray );
if ( cpos == 0 ) {
remove();
} else if ( cpos != 1 ) {
continue;
}
//
【encode】
+ UMS
INTERLEAVE_A1
INTERLEAVE_A2
INTERLEAVE_B
INTERLEAVE_C
+ 処理方針
[interleave template]
- decode 側と同じ。
[byte、bit、line template]
- decode 側と同じ。
+ 生成ソースイメージ
- decode 側と同じ。
--------------------------------------
2005080503 改定のためのケーススタディ
interleave カウンタの振る舞いのシミュレート例
case 22:
case -30: [A1]
case -40: [A2]
case 52:
case -60: [B]
case 72:
case -80: [C]
case -10:
[ 22,52,72
[[A1] -30,52,72
[[A1][A2] -40,52,72
[[A1][A2][B] -40,-60,72
[[A1][A2][B][C] -40,-60,-80
元 finishInterleave の処理は
ひとつが 0 の時点で他が 0 に
なっていないことを理由に remove しようと
してしまうので動作しない。
すべてが 0 になるまで interleave の動作を
続ける必要があるのだが、終わり方にもいろいろ
あるので
[[A1][A2][B][C]] 0,-60,-80
[[A1][A2][B][C]] 0,0,-80
[[A1][A2][B][C]] 0,0,0 (case 1)
[[A1][A2][B][C]] 0,-60,0 => NG
[[A1][A2][B][C]] 0,0,0 (case 2) NG
[[A1][A2][B][C]] -40,0,-80 => NG
[[A1][A2][B][C]] 0,0,-80 NG
[[A1][A2][B][C]] 0,0,0 (case 3) NG
[[A1][A2][B][C]] -40,0,0 NG
[[A1][A2][B][C]] 0,0,0 (case 4) NG
[[A1][A2][B][C]] -40,-60,0 => NG
[[A1][A2][B][C]] 0,-60,0 NG
[[A1][A2][B][C]] 0,0,0 (case 5) NG
[[A1][A2][B][C]] -40,0,0 NG
[[A1][A2][B][C]] 0,0,0 (case 6) NG
と状態が増えてしまう。先頭のカウンタから順に
0 になるような場合のみを許せばよい。
でも、それだけじゃだめ。一つでも 0 が
発生したらそれ以降はコンテナ処理をしてはいけない。
コンテナの処理の先頭でカウンタが 0 になっているものが
ひとつもないことを確認すればよい。
<=(*)
と書く場合 (*) の処理が interleave 的にみて不完全になり
multiple possibility exception を起こす。# case 2 の
一つ上の NG を発生する直前に callFunction がおきる。
まずは、この記述が何を意味するのかまず定義を明確化する
必要がある。安直には禁止してしまうことである。
multiple possibility exception を起こしてしまうことは
ツールの制約であって mappingSchema 自身の制約ではない。
【参照】
- デザインノート 2005061503 : 制御構造の取り扱い
以上