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 : 制御構造の取り扱い 以上