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 }
stdfeature (default) はallocを自動的に有効化します。allocなしの場合はArrayStorageなど固定長ストレージのみを利用できます。
付属ストレージ実装
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;
バイトの長さは常に SIZE と等しいことはこの外側で保証されているため、境界チェックは不要です。
もし、 Slicer を使わずに直接呼び出す場合は、呼び出し側で長さを検証してください。
使用例
use ;
制限と設計上の割り切り
- 動的サイズ型は
ByteReprを実装できません。 - 参照やポインタを扱う場合はアドレスそのもの (
usize) をどのように解釈するかをアプリケーション側で規定してください。 speedfeature を有効化すると、bool/charの検証をスキップするため未定義値が発生し得ます。