ser_raw/serializer_traits/
pos_tracking.rs1use std::slice;
2
3use crate::{pos::PosMapping, storage::Storage, Serialize, Serializer};
4
5pub trait PosTracking: Serializer {
10 fn pos_mapping(&self) -> &PosMapping;
15
16 fn set_pos_mapping(&mut self, pos_mapping: PosMapping) -> ();
18
19 #[inline]
21 fn pos_for<T>(&self, value: &T) -> usize {
22 self.pos_mapping().pos_for(value)
23 }
24
25 fn do_serialize_value<T: Serialize<Self>>(&mut self, value: &T) {
26 self.storage_mut().align_for::<T>();
28
29 self.set_pos_mapping(PosMapping::new(value as *const T as usize, self.pos()));
31
32 let slice = slice::from_ref(value);
36 unsafe { self.storage_mut().push_slice_unaligned(slice) };
37 self.storage_mut().align_after::<T>();
38
39 value.serialize_data(self);
41 }
42
43 #[inline]
45 fn do_push_slice<T>(&mut self, slice: &[T], _ptr_addr: Self::Addr) {
46 self.push_raw_slice(slice);
47 }
48
49 #[inline]
50 fn do_push_and_process_slice<T, P: FnOnce(&mut Self)>(
51 &mut self,
52 slice: &[T],
53 _ptr_addr: Self::Addr,
54 process: P,
55 ) {
56 let pos_mapping_before = *self.pos_mapping();
58
59 self.storage_mut().align_for::<T>();
61
62 self.set_pos_mapping(PosMapping::new(slice.as_ptr() as usize, self.pos()));
64
65 unsafe { self.storage_mut().push_slice_unaligned(slice) };
69 self.storage_mut().align_after::<T>();
70
71 process(self);
73
74 self.set_pos_mapping(pos_mapping_before);
76 }
77}