Bulk Arrays
For repeating groups with fixed-size entries (no var-data, no nested
groups), generated encoders offer a bulk_add(&[Entry]) path that validates
the destination region once and writes every entry.
Car fuelFigures has var-data (usageDescription), so it is not eligible.
The nested acceleration group is — each row is mph + seconds only:
#![allow(unused)]
fn main() {
pub fn demo_bulk_add() -> Result<Vec<u8>, Box<dyn std::error::Error>> {
let mut extras = OptionalExtras::default();
extras.cruise_control(true);
let rows = [
CarPerformanceFiguresAccelerationEntry {
mph: 30,
seconds: 4.0,
},
CarPerformanceFiguresAccelerationEntry {
mph: 60,
seconds: 7.5,
},
];
let complete_len = CarEncoder::compute_length()
.fuel_figures_ragged(0, |_| Ok(()))?
.performance_figures_ragged(1, |pf| {
pf.add()?.acceleration(|acc| {
acc.uniform(2)?;
Ok(())
})?;
Ok(())
})?
.manufacturer(5)?
.model(5)?
.activation_code(3)?
.encoded_length_with_header();
const PAD: usize = 256;
assert!(
complete_len <= PAD,
"bulk-add car length {complete_len} exceeds pad {PAD}"
);
let mut storage = [0u8; PAD];
let buf = &mut storage[..complete_len];
let len = CarEncoder::try_wrap_and_apply_header(buf, 0)?
.fixed(&CarFixedFields {
serial_number: 1234,
model_year: 2013,
available: true.into(),
code: Model::A,
some_numbers: [10, 20, 30, 40],
vehicle_code: *b"ABCDEF",
extras,
engine: Engine::new(
2000,
4,
*b"123",
0i8,
false.into(),
Booster::new(BoostType::TURBO, 210),
),
})
.fuel_figures(0, |_| Ok(()))?
.performance_figures(1, |g| {
g.add(|mut e| {
e.octane_rating(95);
e.acceleration(2, |a| {
a.bulk_add(&rows)?;
Ok(())
})
})?;
Ok(())
})?
.manufacturer_as_str("Honda")?
.model_as_str("Civic")?
.activation_code_as_str("abc")?
.encoded_length_with_header();
assert_eq!(len, complete_len);
Ok(buf[..len].to_vec())
}
}
(From samples/sbe-feature-tour — compiled and run in that crate’s tests.)
bids / asks on the l3-book schema have a nested orders group, so those
outer groups are not eligible either. Only a leaf group whose entries are
a pure fixed block gets bulk_add.
Constants and MetaAttribute expose schema metadata on every generated type
(HeartbeatDecoder::sequence_meta_attribute(MetaAttribute::Presence) and
friends). See the generated module after cargo build of the feature-tour
sample.