agave_event_system/
queue_cell.rs1use wincode_dynamic::SerializedSize;
2
3pub trait ByteArray: sealed::Sealed + Copy + Send + Sync + AsMut<[u8]> + 'static {}
25
26impl<const N: usize> ByteArray for [u8; N] {}
27
28mod sealed {
30 pub trait Sealed {}
31
32 impl<const N: usize> Sealed for [u8; N] {}
33}
34
35#[doc(hidden)]
37pub const fn event_queue_cell_size(
38 size: SerializedSize,
39 max_serialized_size: Option<usize>,
40) -> usize {
41 match size {
42 SerializedSize::Static(size) => size,
43 SerializedSize::Dynamic(lower_bound) => match max_serialized_size {
44 Some(max_serialized_size) if max_serialized_size > lower_bound => max_serialized_size,
45 Some(_) => {
46 panic!(
47 "`max_serialized_size` must be greater than wincode's dynamic serialized-size \
48 lower bound"
49 )
50 }
51 None => {
52 panic!(
53 "event has a dynamic serialized size; specify `max_serialized_size` in the \
54 `#[event(...)]` attribute"
55 )
56 }
57 },
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use {super::event_queue_cell_size, wincode_dynamic::SerializedSize};
64
65 #[test]
66 fn static_size_uses_wincode_upper_bound() {
67 assert_eq!(event_queue_cell_size(SerializedSize::Static(8), None), 8);
68 assert_eq!(
69 event_queue_cell_size(SerializedSize::Static(8), Some(16)),
70 8
71 );
72 }
73
74 #[test]
75 fn dynamic_size_uses_explicit_upper_bound() {
76 assert_eq!(
77 event_queue_cell_size(SerializedSize::Dynamic(8), Some(16)),
78 16
79 );
80 }
81
82 #[test]
83 #[should_panic(expected = "event has a dynamic serialized size")]
84 fn dynamic_size_requires_explicit_upper_bound() {
85 event_queue_cell_size(SerializedSize::Dynamic(8), None);
86 }
87
88 #[test]
89 #[should_panic(expected = "must be greater than")]
90 fn dynamic_size_rejects_bound_equal_to_lower_bound() {
91 event_queue_cell_size(SerializedSize::Dynamic(8), Some(8));
92 }
93
94 #[test]
95 #[should_panic(expected = "must be greater than")]
96 fn dynamic_size_rejects_bound_below_lower_bound() {
97 event_queue_cell_size(SerializedSize::Dynamic(8), Some(7));
98 }
99}