Skip to main content

segmented_layout

Macro segmented_layout 

Source
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 segments
  • FIXED_LEN: usize: byte size of the fixed prefix
  • TABLE_OFFSET: usize: byte offset where the segment table starts
  • DATA_START_OFFSET: usize: byte offset where segment data starts
  • MIN_ACCOUNT_SIZE: usize: minimum account size (fixed + table, no data)
  • SEGMENTED_LAYOUT_ID: [u8; 8]: layout hash including segment entries
  • segment_sizes() -> &[u16]: expected element sizes per segment
  • segment_table(data) -> SegmentTable: parse immutable segment table
  • segment_table_mut(data) -> SegmentTableMut: parse mutable segment table
  • validate_segments(data): full segment table validation
  • init_segments(data, counts): write initial segment table
  • compute_account_size(counts) -> usize: total account size for given counts