From af1c3fb3697b5a339dca0b0e8f1c602718c28861 Mon Sep 17 00:00:00 2001 From: Jan-Paul Bultmann <74891396+somethingelseentirely@users.noreply.github.com> Date: Tue, 19 Aug 2025 19:37:29 +0200 Subject: [PATCH] derive zerocopy traits for SectionHandle --- CHANGELOG.md | 1 + src/area.rs | 5 +++++ tests/area.rs | 26 ++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6c486a6..e692857 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Changelog ## Unreleased +- derived zerocopy traits for `SectionHandle` to allow storing handles in `ByteArea` sections - added example demonstrating `ByteArea` with multiple typed sections, concurrent mutations, and freezing or persisting the area - added example combining Python bindings with winnow parsing - added Python example demonstrating structured parsing with winnow's `view` diff --git a/src/area.rs b/src/area.rs index 853145b..9156e6e 100644 --- a/src/area.rs +++ b/src/area.rs @@ -241,6 +241,11 @@ where /// Handle referencing a [`Section`] within a frozen [`ByteArea`]. #[derive(Clone, Copy, Debug)] +#[repr(C)] +#[cfg_attr( + feature = "zerocopy", + derive(zerocopy::FromBytes, zerocopy::KnownLayout, zerocopy::Immutable,) +)] pub struct SectionHandle { /// Absolute byte offset from the start of the area. pub offset: usize, diff --git a/tests/area.rs b/tests/area.rs index 7177788..cd4afa7 100644 --- a/tests/area.rs +++ b/tests/area.rs @@ -97,3 +97,29 @@ fn handles_reconstruct_sections() { assert_eq!(handle_a.view(&all).unwrap().as_ref(), &[1]); assert_eq!(handle_b.view(&all).unwrap().as_ref(), &[2]); } + +#[test] +fn handles_can_be_stored_in_sections() { + use anybytes::area::SectionHandle; + + let mut area = ByteArea::new().expect("area"); + let mut sections = area.sections(); + + let mut value = sections.reserve::(1).expect("reserve value"); + value.as_mut_slice()[0] = 3; + let handle_value = value.handle(); + value.freeze().expect("freeze value"); + + let mut handles = sections + .reserve::>(1) + .expect("reserve handles"); + handles.as_mut_slice()[0] = handle_value; + let handle_handles = handles.handle(); + handles.freeze().expect("freeze handles"); + + drop(sections); + let all = area.freeze().expect("freeze area"); + + let stored_handle = handle_handles.view(&all).expect("view handles").as_ref()[0]; + assert_eq!(stored_handle.view(&all).unwrap().as_ref(), &[3]); +}