TypeSlicer
TypeSlicer は任意のバイト列ストレージを「型付きメモリアクセス層」に昇格させる Rust 2024 Edition 向けクレートです。
repr::ByteRepr で型のバイト表現を定義し、storage::BytesStorage でストレージの読み書き方法を与えることで、Slicer<T> の load / store だけで安全に値を交換できます。
コアコンポーネント
repr::ByteRepr
const SIZE: usize/into_bytes(self, buf: &mut [u8])/from_bytes(bytes: &[u8]) -> Result<Self, ReprError>を持つトレイト。SIZEはコンパイル時計算できます。ReprError::InvalidByteValueを返すことでスカラー値の検証(例:boolが 0/1 のみ)を実装。
storage::BytesStorage
get(address, size)/get_mut(address, size)でバイトスライスを貸し出す責務だけを負います。- 先読み・遅延書き込み、mmap バッファ等のバックエンドはトレイト実装で差し替え可能です。
Slicer<T>
BytesStorageを実装した任意の型に対し、T: ByteReprについて blanket impl を提供。load(address)はBytesStorage::get→ByteRepr::from_bytesを連結し、store(address, value)はget_mut→into_bytesを呼び出します。
インストール
[]
= { = "0.1" }
no_std で使う
[]
= { = "0.1", = false, = ["primitive"] }
stdfeature (default) はallocを transitively 有効化します。allocなしの場合はArrayStorageなど固定長ストレージのみを利用できます。
Feature 一覧
| 種別 | feature | 内容 |
|---|---|---|
| ストレージ | std |
alloc + 標準ライブラリを利用。VecStorage や std ベースのテストを有効化 |
alloc |
VecStorage や alloc::vec を使うコードを有効化 |
|
| ByteRepr | bool, char, uint8, uint16, uint32, uint64, uint128, usize, int8, int16, int32, int64, int128, isize, f32, f64, unit |
各プリミティブの ByteRepr 実装を個別に制御 |
| ByteRepr | array |
任意 [T; N] の ByteRepr 実装 (T: ByteRepr) |
| ByteRepr | tuple |
1〜12 要素のタプル ByteRepr 実装 |
| まとめ | primitive |
すべてのプリミティブ + array + tuple を一括有効化 (default) |
| まとめ | speed |
bool/char 変換で検証をスキップし、定数時間判定に振り切る |
| まとめ | all |
default と同義。将来的な互換確保向け |
必要な feature だけを選ぶことで、最小限の表現だけをバイナリへリンクさせられます。
ただし、使わなかった型の ByteRepr 実装は大抵の場合コンパイル時に除去されます。
付属ストレージ実装
ArrayStorage<const N: usize>:no_stdでも利用できる固定長ストレージ。new()/Defaultは 0 埋めで初期化します。VecStorage(alloc必須): 任意長で確保し、resize(new_len)で後からサイズ変更できます。
どちらも BytesStorage を実装しているため、そのまま Slicer<T> として利用できます。独自ストレージを追加したい場合は get / get_mut を実装するだけで load / store が自動で解放されます。
ByteRepr を自作する
repr::ByteRepr は公開トレイトなので、ユーザ定義型をタプルや配列に委譲して簡単に実装できます。
use ByteRepr;
buf / bytes の長さは常に SIZE と等しいことはこの外側で保証されているため、境界チェックは不要です。
もし、 Slicer を使わずに直接呼び出す場合は、呼び出し側で長さを検証してください。
使用例
use ;
制限と設計上の割り切り
- 動的サイズ型(
Vec<T>, スライス, trait object)はByteReprを実装できません。 - 参照やポインタを扱う場合はアドレスそのもの (
usize) をどのように解釈するかをアプリケーション側で規定してください。 speedfeature を有効化すると、bool/charの検証をスキップするため未定義値が発生し得ます。