| Crates.io | type_slicer |
| lib.rs | type_slicer |
| version | 0.3.0 |
| created_at | 2025-12-06 10:19:49.857722+00 |
| updated_at | 2026-01-06 13:30:26.032126+00 |
| description | 型付きメモリスライサー |
| homepage | |
| repository | |
| max_upload_size | |
| id | 1969942 |
| size | 46,366 |
TypeSlicer は任意のバイト列ストレージを「型付きメモリアクセス層」に昇格させる Rust 2024 Edition 向けクレートです。
repr::ByteRepr で型のバイト表現を定義し、storage::BytesStorage でストレージの読み書き方法を与えることで、Slicer<T> の load / store だけで安全に値を交換できます。
repr::ByteReprconst SIZE: usize / into_bytes(self, buf: &mut [u8]) / from_bytes(bytes: &[u8]) -> Result<Self, ReprError> を持つトレイト。SIZE はコンパイル時計算できます。ReprError::InvalidByteValue を返すことでスカラー値の検証(例: bool が 0/1 のみ)を実装。storage::BytesStorageget(address, size) / get_mut(address, size) でバイトスライスを貸し出す責務だけを負います。Slicer<T>BytesStorage を実装した任意の型に対し、T: ByteRepr について blanket impl を提供。load(address) は BytesStorage::get → ByteRepr::from_bytes を連結し、store(address, value) は get_mut → into_bytes を呼び出します。[dependencies]
type_slicer = { version = "0.1" }
no_std で使う[dependencies]
type_slicer = { version = "0.1", default-features = false }
std feature (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 type_slicer::ByteRepr;
#[derive(Clone, Copy, Debug, PartialEq, ByteRepr)]
struct Header {
kind: u8,
has_payload: bool,
payload_len: u16,
}
バイトの長さは常に SIZE と等しいことはこの外側で保証されているため、境界チェックは不要です。
もし、 Slicer を使わずに直接呼び出す場合は、呼び出し側で長さを検証してください。
use type_slicer::{Slicer, VecStorage, ByteRepr};
#[derive(Clone, Copy, Debug, PartialEq, ByteRepr)]
struct Packet {
opcode: u8,
has_body: bool,
length: u16,
}
fn main() -> Result<(), type_slicer::slicer::SlicerError> {
let mut storage = VecStorage::new(32);
storage.store(0, 0xDEAD_BEEFu32)?;
storage.store(4, [1u16, 2, 3, 4])?;
storage.store(12, Packet { opcode: 7, has_body: true, length: 16 })?;
let header: u32 = storage.load(0)?;
let payload: [u16; 4] = storage.load(4)?;
let packet: Packet = storage.load(12)?;
assert_eq!(header, 0xDEAD_BEEF);
assert_eq!(payload, [1, 2, 3, 4]);
assert_eq!(packet.length, 16);
Ok(())
}
ByteRepr を実装できません。usize) をどのように解釈するかをアプリケーション側で規定してください。speed feature を有効化すると、bool / char の検証をスキップするため未定義値が発生し得ます。