Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

プリミティブ型のビットレイアウト

将棋エンジンおよび棋譜処理ライブラリの性能は、最下層のプリミティブ型がいかにコンパクトかつ CPU 命令に親和性の高い表現を持つかに左右される。 rsshogi では、座標、駒、持ち駒、指し手、評価値などの基本型をすべて 1〜4 バイトの整数を包む Newtype(#[repr(transparent)])または固定幅列挙型として定義している。


プリミティブ型のサイズと内部表現一覧

主要プリミティブ型のメモリサイズ、内部表現、および有効値の範囲を以下に示す。

型名サイズ内部表現有効値の範囲とセンチネル主な用途
Color1 Byteu80..=1(BLACK = 0、WHITE = 1)手番と陣営の識別。
File1 Bytei80..=8(1 筋〜9 筋)筋の表現とインデックス変換。
Rank1 Bytei80..=8(一〜九段)段の表現と成段判定。
Square1 Bytei80..=80、センチネル SQ_NONE = 81盤面 81 マスの一次元座標。
PieceType1 Bytei80..=15(NONE = 0、実駒 1..=14、GOLD_LIKE = 15)先後を区別しない駒種。
Piece1 Bytei80..=31(先手 1..=15、後手 17..=31、16 は無効)先後と成り状態を含む盤上の駒。
HandPiece1 Bytei80..=6(歩、香、桂、銀、角、飛、金)持ち駒テーブルの 7 種インデックス。
Hand4 Bytesu32各駒種の枚数ビットとボロービットをパックした 32 ビット値片方の陣営の全持ち駒枚数。
Move2 Bytesu16移動先 7b、移動元/打駒 7b、打フラグ 1b、成フラグ 1bUSI / YaneuraOu 互換の 16 ビット指し手。
Move324 Bytesu32下位 16b Move + ビット 16..=20 に移動後の Piece盤面更新高速化およびオーダリング用の 32 ビット指し手。
AperyMove2 Bytesu16移動先 7b、移動元/打駒(81..=87)7b、成フラグ 1bApery(WCSC26)互換の 16 ビット指し手。
AperyMove324 Bytesu32下位 16b AperyMove + 移動前 PieceType 4b + 捕獲 PieceType 4bApery 互換の 32 ビット指し手。
Ki2Notation4 Bytesu32手番 1b、同フラグ 1b、移動先 7b、駒種 4b、相対位置 4b、成不成 2bKI2 形式の指し手表記情報。
MoveLabel2 Bytesu160..=2186(class * 81 + to_sq)DL 将棋用の 2187 クラス方策ラベル(policy-labels feature)。
CompactMoveLabel2 Bytesu160..=1495構造的不可能手を除外した 1496 クラス圧縮ラベル(policy-labels feature)。
Eval4 Bytesenum(i16 ペイロード)Cp(-32000..=32000) または Special(i16)評価値と詰みスコアの表現。
GameResult1 Byte#[repr(u8)]0..=2(BlackWin = 0、WhiteWin = 1、Draw = 2)対局結果の表現。
RepetitionState1 ByteenumNone、Win、Lose、Draw、Superior、Inferior千日手、連続王手の千日手、優等局面と劣等局面の判定結果。
EnteringKingRule1 Byte#[repr(u8)]NoEnteringKing、Cs24Point、Cs27Point、Cs27PointHandicap、TryRule入玉宣言勝ちのルール種別。

型安全とゼロコスト抽象化の境界

rsshogi のプリミティブ型は、公開 API における型安全性と内部ホットパスにおける配列アクセス速度を両立するため、以下の 3 層で不変条件(Invariant)を管理している。

  1. 安全コンストラクタ(from_raw / new):外部入力やシリアライズデータから型を構築する際は、有効範囲を検査して Option<T> または Result<T, E> を返す。
  2. 信頼済み境界(from_raw_unchecked):pub(crate) または unsafe 関数として提供され、呼び出し側が有効範囲内であることを保証する内部ループでのみ使用される。debug_assert! によってデバッグビルド時に不変条件違反を即座に検出する。
  3. 型付きテーブル(SquareTable<T, N> など):Square や PieceType を直接インデックスとして受け取るラッパー型を用意し、to_index() による境界チェックの重複を省きつつ、生整数(usize)の取り違えをコンパイル時に防止している。

各サブセクションの内容