macro_rules! segmented_layout {
(
$(#[$meta:meta])*
$vis:vis struct $name:ident, discriminator = $disc:literal, version = $ver:literal {
$( $(#[$fmeta:meta])* $field:ident : $fty:ident = $fsize:expr ),+ $(,)?
} segments {
$( $seg_name:ident : $seg_ty:ident = $seg_elem_size:expr ),+ $(,)?
}
) => { ... };
}Expand description
Declare a segmented zero-copy account layout.
Combines a fixed prefix (same as zero_copy_layout!) with one or
more variable-length segments. The segment table sits right after
the fixed fields, and the macro generates typed accessors per
segment.
ⓘ
use jiminy_core::segmented_layout;
use jiminy_core::account::{AccountHeader, Pod, FixedLayout};
use pinocchio::Address;
// A simple element type.
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub struct Order {
pub price: [u8; 8],
pub qty: [u8; 8],
}
unsafe impl Pod for Order {}
impl FixedLayout for Order { const SIZE: usize = 16; }
segmented_layout! {
pub struct OrderBook, discriminator = 5, version = 1 {
header: AccountHeader = 16,
market: Address = 32,
} segments {
bids: Order = 16,
asks: Order = 16,
}
}
// Wire layout (example with 3 bids, 2 asks, Order = 16):
// Offset 0–15: header, 16–47: market,
// 48–55: bids descriptor, 56–63: asks descriptor,
// 64+: bids data, then asks data.
// Access:
let table = OrderBook::segment_table(&data)?;
let bids = SegmentSlice::<Order>::from_descriptor(&data, &table.descriptor(0)?)?;
let first_bid: Order = bids.read(0)?;§Generated API
In addition to the standard zero_copy_layout! API on the fixed
prefix struct:
SEGMENT_COUNT: usize: number of declared segmentsFIXED_LEN: usize: byte size of the fixed prefixTABLE_OFFSET: usize: byte offset where the segment table startsDATA_START_OFFSET: usize: byte offset where segment data startsMIN_ACCOUNT_SIZE: usize: minimum account size (fixed + table, no data)SEGMENTED_LAYOUT_ID: [u8; 8]: layout hash including segment entriessegment_sizes() -> &[u16]: expected element sizes per segmentsegment_table(data) -> SegmentTable: parse immutable segment tablesegment_table_mut(data) -> SegmentTableMut: parse mutable segment tablevalidate_segments(data): full segment table validationinit_segments(data, counts): write initial segment tablecompute_account_size(counts) -> usize: total account size for given counts