1#[cfg(feature = "with-serde")]
20use serde::de::{self, Deserialize, Deserializer, SeqAccess, Visitor};
21#[cfg(feature = "with-serde")]
22use serde::{ser::SerializeTuple, Serialize, Serializer};
23use std::fmt;
24use std::fmt::{Debug, Formatter};
25#[cfg(feature = "with-serde")]
26use std::marker::PhantomData;
27use std::mem::{self, size_of};
28
29#[derive(Clone, Debug, PartialEq, Eq)]
31pub enum Error {
32 SizeLimitExceeded,
34}
35
36impl std::error::Error for Error {}
37
38impl fmt::Display for Error {
39 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
40 match self {
41 Self::SizeLimitExceeded => write!(f, "The max size has been exceeded"),
42 }
43 }
44}
45
46#[allow(clippy::len_without_is_empty)]
127pub unsafe trait FamStruct {
128 type Entry: Copy;
130
131 fn len(&self) -> usize;
136
137 unsafe fn set_len(&mut self, len: usize);
147
148 fn max_len() -> usize;
153
154 fn as_slice(&self) -> &[Self::Entry];
156
157 fn as_mut_slice(&mut self) -> &mut [Self::Entry];
159}
160
161pub struct FamStructWrapper<T: Default + FamStruct> {
165 mem_allocator: Vec<T>,
172}
173
174impl<T> Debug for FamStructWrapper<T>
175where
176 T: Default + FamStruct + Debug,
177 T::Entry: Debug,
178{
179 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
180 f.debug_struct("FamStructWrapper")
181 .field("fam_struct", &self.as_fam_struct_ref())
182 .field("entries", &self.as_fam_struct_ref().as_slice())
183 .finish()
184 }
185}
186
187impl<T: Default + FamStruct> FamStructWrapper<T> {
188 fn mem_allocator_len(fam_len: usize) -> Option<usize> {
194 let wrapper_size_in_bytes =
195 size_of::<T>().checked_add(fam_len.checked_mul(size_of::<T::Entry>())?)?;
196
197 wrapper_size_in_bytes
198 .checked_add(size_of::<T>().checked_sub(1)?)?
199 .checked_div(size_of::<T>())
200 }
201
202 fn fam_len(mem_allocator_len: usize) -> usize {
208 if mem_allocator_len == 0 {
209 return 0;
210 }
211
212 let array_size_in_bytes = (mem_allocator_len - 1) * size_of::<T>();
213 array_size_in_bytes / size_of::<T::Entry>()
214 }
215
216 pub fn new(num_elements: usize) -> Result<FamStructWrapper<T>, Error> {
230 if num_elements > T::max_len() {
231 return Err(Error::SizeLimitExceeded);
232 }
233 let required_mem_allocator_capacity =
234 FamStructWrapper::<T>::mem_allocator_len(num_elements)
235 .ok_or(Error::SizeLimitExceeded)?;
236
237 let mut mem_allocator = Vec::with_capacity(required_mem_allocator_capacity);
238 mem_allocator.push(T::default());
239 for _ in 1..required_mem_allocator_capacity {
240 mem_allocator.push(unsafe { mem::zeroed() })
242 }
243 unsafe {
246 mem_allocator[0].set_len(num_elements);
247 }
248
249 Ok(FamStructWrapper { mem_allocator })
250 }
251
252 pub fn from_header(header: T) -> Result<FamStructWrapper<T>, Error> {
259 if header.len() != 0 {
260 return Err(Error::SizeLimitExceeded);
261 }
262
263 unsafe { Ok(Self::from_raw(vec![header])) }
267 }
268
269 pub fn from_entries(entries: &[T::Entry]) -> Result<FamStructWrapper<T>, Error> {
281 let mut adapter = FamStructWrapper::<T>::new(entries.len())?;
282
283 {
284 let wrapper_entries = unsafe { adapter.as_mut_fam_struct().as_mut_slice() };
286 wrapper_entries.copy_from_slice(entries);
287 }
288
289 Ok(adapter)
290 }
291
292 pub unsafe fn from_raw(content: Vec<T>) -> Self {
306 debug_assert_ne!(content.len(), 0);
307 debug_assert!(content[0].len() <= Self::fam_len(content.len()));
308
309 FamStructWrapper {
310 mem_allocator: content,
311 }
312 }
313
314 pub fn into_raw(self) -> Vec<T> {
316 self.mem_allocator
317 }
318
319 pub fn as_fam_struct_ref(&self) -> &T {
321 &self.mem_allocator[0]
322 }
323
324 pub unsafe fn as_mut_fam_struct(&mut self) -> &mut T {
331 &mut self.mem_allocator[0]
332 }
333
334 pub fn as_fam_struct_ptr(&self) -> *const T {
342 self.as_fam_struct_ref()
343 }
344
345 pub fn as_mut_fam_struct_ptr(&mut self) -> *mut T {
353 unsafe { self.as_mut_fam_struct() }
355 }
356
357 pub fn as_slice(&self) -> &[T::Entry] {
359 self.as_fam_struct_ref().as_slice()
360 }
361
362 pub fn as_mut_slice(&mut self) -> &mut [T::Entry] {
364 unsafe { self.as_mut_fam_struct() }.as_mut_slice()
366 }
367
368 fn len(&self) -> usize {
370 self.as_fam_struct_ref().len()
371 }
372
373 fn capacity(&self) -> usize {
377 FamStructWrapper::<T>::fam_len(self.mem_allocator.capacity())
378 }
379
380 fn reserve(&mut self, additional: usize) -> Result<(), Error> {
388 let desired_capacity = self.len() + additional;
389 if desired_capacity <= self.capacity() {
390 return Ok(());
391 }
392
393 let current_mem_allocator_len = self.mem_allocator.len();
394 let required_mem_allocator_len = FamStructWrapper::<T>::mem_allocator_len(desired_capacity)
395 .ok_or(Error::SizeLimitExceeded)?;
396 let additional_mem_allocator_len = required_mem_allocator_len - current_mem_allocator_len;
397
398 self.mem_allocator.reserve(additional_mem_allocator_len);
399
400 Ok(())
401 }
402
403 fn set_len(&mut self, len: usize) -> Result<(), Error> {
416 let additional_elements = isize::try_from(len)
417 .and_then(|len| isize::try_from(self.len()).map(|self_len| len - self_len))
418 .map_err(|_| Error::SizeLimitExceeded)?;
419
420 if additional_elements == 0 {
422 return Ok(());
423 }
424
425 if additional_elements > 0 {
427 if len > T::max_len() {
429 return Err(Error::SizeLimitExceeded);
430 }
431 self.reserve(additional_elements as usize)?;
433 }
434
435 let current_mem_allocator_len = self.mem_allocator.len();
436 let required_mem_allocator_len =
437 FamStructWrapper::<T>::mem_allocator_len(len).ok_or(Error::SizeLimitExceeded)?;
438 unsafe {
441 self.mem_allocator.set_len(required_mem_allocator_len);
442 }
443 for i in current_mem_allocator_len..required_mem_allocator_len {
445 self.mem_allocator[i] = unsafe { mem::zeroed() }
448 }
449 unsafe {
453 self.as_mut_fam_struct().set_len(len);
454 }
455
456 if additional_elements < 0 {
458 self.mem_allocator.shrink_to_fit();
459 }
460
461 Ok(())
462 }
463
464 pub fn push(&mut self, entry: T::Entry) -> Result<(), Error> {
474 let new_len = self.len() + 1;
475 self.set_len(new_len)?;
476 self.as_mut_slice()[new_len - 1] = entry;
477
478 Ok(())
479 }
480
481 pub fn retain<P>(&mut self, mut f: P)
488 where
489 P: FnMut(&T::Entry) -> bool,
490 {
491 let mut num_kept_entries = 0;
492 {
493 let entries = self.as_mut_slice();
494 for entry_idx in 0..entries.len() {
495 let keep = f(&entries[entry_idx]);
496 if keep {
497 entries[num_kept_entries] = entries[entry_idx];
498 num_kept_entries += 1;
499 }
500 }
501 }
502
503 self.set_len(num_kept_entries).expect("invalid length");
505 }
506}
507
508impl<T: Default + FamStruct + PartialEq> PartialEq for FamStructWrapper<T>
509where
510 T::Entry: PartialEq,
511{
512 fn eq(&self, other: &FamStructWrapper<T>) -> bool {
513 self.as_fam_struct_ref() == other.as_fam_struct_ref() && self.as_slice() == other.as_slice()
514 }
515}
516
517impl<T: Default + FamStruct> Clone for FamStructWrapper<T> {
518 fn clone(&self) -> Self {
519 let required_mem_allocator_capacity =
522 FamStructWrapper::<T>::mem_allocator_len(self.as_slice().len()).unwrap();
523
524 let mut mem_allocator = Vec::with_capacity(required_mem_allocator_capacity);
525
526 unsafe {
532 let fam_struct: T = std::ptr::read(self.as_fam_struct_ref());
533 mem_allocator.push(fam_struct);
534 }
535 for _ in 1..required_mem_allocator_capacity {
536 mem_allocator.push(
537 unsafe { mem::zeroed() },
539 )
540 }
541
542 let mut adapter = FamStructWrapper { mem_allocator };
543 {
544 let wrapper_entries = adapter.as_mut_slice();
545 wrapper_entries.copy_from_slice(self.as_slice());
546 }
547 adapter
548 }
549}
550
551#[cfg(feature = "with-serde")]
552impl<T: Default + FamStruct + Serialize> Serialize for FamStructWrapper<T>
553where
554 <T as FamStruct>::Entry: serde::Serialize,
555{
556 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
557 where
558 S: Serializer,
559 {
560 let mut s = serializer.serialize_tuple(2)?;
561 s.serialize_element(self.as_fam_struct_ref())?;
562 s.serialize_element(self.as_slice())?;
563 s.end()
564 }
565}
566
567#[cfg(feature = "with-serde")]
568impl<'de, T: Default + FamStruct + Deserialize<'de>> Deserialize<'de> for FamStructWrapper<T>
569where
570 <T as FamStruct>::Entry: std::marker::Copy + serde::Deserialize<'de>,
571{
572 fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
573 where
574 D: Deserializer<'de>,
575 {
576 struct FamStructWrapperVisitor<X> {
577 dummy: PhantomData<X>,
578 }
579
580 impl<'de, X: Default + FamStruct + Deserialize<'de>> Visitor<'de> for FamStructWrapperVisitor<X>
581 where
582 <X as FamStruct>::Entry: std::marker::Copy + serde::Deserialize<'de>,
583 {
584 type Value = FamStructWrapper<X>;
585
586 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
587 formatter.write_str("FamStructWrapper")
588 }
589
590 fn visit_seq<V>(self, mut seq: V) -> Result<FamStructWrapper<X>, V::Error>
591 where
592 V: SeqAccess<'de>,
593 {
594 use serde::de::Error;
595
596 let header: X = seq
597 .next_element()?
598 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
599 let entries: Vec<X::Entry> = seq
600 .next_element()?
601 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
602
603 if header.len() != entries.len() {
604 let msg = format!(
605 "Mismatch between length of FAM specified in FamStruct header ({}) \
606 and actual size of FAM ({})",
607 header.len(),
608 entries.len()
609 );
610 return Err(V::Error::custom(msg));
611 }
612
613 let mut result: Self::Value = FamStructWrapper::from_entries(entries.as_slice())
614 .map_err(|e| V::Error::custom(format!("{:?}", e)))?;
615 result.mem_allocator[0] = header;
616 Ok(result)
617 }
618 }
619
620 deserializer.deserialize_tuple(2, FamStructWrapperVisitor { dummy: PhantomData })
621 }
622}
623
624#[macro_export]
626macro_rules! generate_fam_struct_impl {
627 ($struct_type: ty, $entry_type: ty, $entries_name: ident,
628 $field_type: ty, $field_name: ident, $max: expr) => {
629 unsafe impl FamStruct for $struct_type {
630 type Entry = $entry_type;
631
632 fn len(&self) -> usize {
633 self.$field_name as usize
634 }
635
636 unsafe fn set_len(&mut self, len: usize) {
637 self.$field_name = len as $field_type;
638 }
639
640 fn max_len() -> usize {
641 $max
642 }
643
644 fn as_slice(&self) -> &[<Self as FamStruct>::Entry] {
645 let len = self.len();
646 unsafe { self.$entries_name.as_slice(len) }
647 }
648
649 fn as_mut_slice(&mut self) -> &mut [<Self as FamStruct>::Entry] {
650 let len = self.len();
651 unsafe { self.$entries_name.as_mut_slice(len) }
652 }
653 }
654 };
655}
656
657#[cfg(test)]
658mod tests {
659 #![allow(clippy::undocumented_unsafe_blocks)]
660
661 #[cfg(feature = "with-serde")]
662 use serde_derive::{Deserialize, Serialize};
663
664 use super::*;
665
666 const MAX_LEN: usize = 100;
667
668 #[repr(C)]
669 #[derive(Default, Debug, PartialEq, Eq)]
670 pub struct __IncompleteArrayField<T>(::std::marker::PhantomData<T>, [T; 0]);
671 impl<T> __IncompleteArrayField<T> {
672 #[inline]
673 pub fn new() -> Self {
674 __IncompleteArrayField(::std::marker::PhantomData, [])
675 }
676 #[inline]
677 pub unsafe fn as_ptr(&self) -> *const T {
678 self as *const __IncompleteArrayField<T> as *const T
679 }
680 #[inline]
681 pub unsafe fn as_mut_ptr(&mut self) -> *mut T {
682 self as *mut __IncompleteArrayField<T> as *mut T
683 }
684 #[inline]
685 pub unsafe fn as_slice(&self, len: usize) -> &[T] {
686 ::std::slice::from_raw_parts(self.as_ptr(), len)
687 }
688 #[inline]
689 pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] {
690 ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len)
691 }
692 }
693
694 #[cfg(feature = "with-serde")]
695 impl<T> Serialize for __IncompleteArrayField<T> {
696 fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
697 where
698 S: Serializer,
699 {
700 [0u8; 0].serialize(serializer)
701 }
702 }
703
704 #[cfg(feature = "with-serde")]
705 impl<'de, T> Deserialize<'de> for __IncompleteArrayField<T> {
706 fn deserialize<D>(_: D) -> std::result::Result<Self, D::Error>
707 where
708 D: Deserializer<'de>,
709 {
710 Ok(__IncompleteArrayField::new())
711 }
712 }
713
714 #[repr(C)]
715 #[derive(Default, PartialEq)]
716 struct MockFamStruct {
717 pub len: u32,
718 pub padding: u32,
719 pub entries: __IncompleteArrayField<u32>,
720 }
721
722 generate_fam_struct_impl!(MockFamStruct, u32, entries, u32, len, 100);
723
724 type MockFamStructWrapper = FamStructWrapper<MockFamStruct>;
725
726 const ENTRIES_OFFSET: usize = 2;
727
728 const FAM_LEN_TO_MEM_ALLOCATOR_LEN: &[(usize, usize)] = &[
729 (0, 1),
730 (1, 2),
731 (2, 2),
732 (3, 3),
733 (4, 3),
734 (5, 4),
735 (10, 6),
736 (50, 26),
737 (100, 51),
738 ];
739
740 const MEM_ALLOCATOR_LEN_TO_FAM_LEN: &[(usize, usize)] = &[
741 (0, 0),
742 (1, 0),
743 (2, 2),
744 (3, 4),
745 (4, 6),
746 (5, 8),
747 (10, 18),
748 (50, 98),
749 (100, 198),
750 ];
751
752 #[test]
753 fn test_mem_allocator_len() {
754 for pair in FAM_LEN_TO_MEM_ALLOCATOR_LEN {
755 let fam_len = pair.0;
756 let mem_allocator_len = pair.1;
757 assert_eq!(
758 Some(mem_allocator_len),
759 MockFamStructWrapper::mem_allocator_len(fam_len)
760 );
761 }
762 }
763
764 #[repr(C)]
765 #[derive(Default, PartialEq)]
766 struct MockFamStructU8 {
767 pub len: u32,
768 pub padding: u32,
769 pub entries: __IncompleteArrayField<u8>,
770 }
771 generate_fam_struct_impl!(MockFamStructU8, u8, entries, u32, len, 100);
772 type MockFamStructWrapperU8 = FamStructWrapper<MockFamStructU8>;
773 #[test]
774 fn test_invalid_type_conversion() {
775 let mut adapter = MockFamStructWrapperU8::new(10).unwrap();
776 assert!(matches!(
777 adapter.set_len(0xffff_ffff_ffff_ff00),
778 Err(Error::SizeLimitExceeded)
779 ));
780 }
781
782 #[test]
783 fn test_wrapper_len() {
784 for pair in MEM_ALLOCATOR_LEN_TO_FAM_LEN {
785 let mem_allocator_len = pair.0;
786 let fam_len = pair.1;
787 assert_eq!(fam_len, MockFamStructWrapper::fam_len(mem_allocator_len));
788 }
789 }
790
791 #[test]
792 fn test_new() {
793 let num_entries = 10;
794
795 let adapter = MockFamStructWrapper::new(num_entries).unwrap();
796 assert_eq!(num_entries, adapter.capacity());
797
798 let u32_slice = unsafe {
799 std::slice::from_raw_parts(
800 adapter.as_fam_struct_ptr() as *const u32,
801 num_entries + ENTRIES_OFFSET,
802 )
803 };
804 assert_eq!(num_entries, u32_slice[0] as usize);
805 for entry in u32_slice[1..].iter() {
806 assert_eq!(*entry, 0);
807 }
808
809 let adapter = MockFamStructWrapper::new(MockFamStruct::max_len()).unwrap();
811 assert_eq!(MockFamStruct::max_len(), adapter.capacity());
812
813 assert!(matches!(
814 MockFamStructWrapper::new(MockFamStruct::max_len() + 1),
815 Err(Error::SizeLimitExceeded)
816 ));
817 }
818
819 #[test]
820 fn test_from_entries() {
821 let num_entries: usize = 10;
822
823 let mut entries = Vec::new();
824 for i in 0..num_entries {
825 entries.push(i as u32);
826 }
827
828 let adapter = MockFamStructWrapper::from_entries(entries.as_slice()).unwrap();
829 let u32_slice = unsafe {
830 std::slice::from_raw_parts(
831 adapter.as_fam_struct_ptr() as *const u32,
832 num_entries + ENTRIES_OFFSET,
833 )
834 };
835 assert_eq!(num_entries, u32_slice[0] as usize);
836 for (i, &value) in entries.iter().enumerate().take(num_entries) {
837 assert_eq!(adapter.as_slice()[i], value);
838 }
839
840 let mut entries = Vec::new();
841 for i in 0..MockFamStruct::max_len() + 1 {
842 entries.push(i as u32);
843 }
844
845 assert!(matches!(
847 MockFamStructWrapper::from_entries(entries.as_slice()),
848 Err(Error::SizeLimitExceeded)
849 ));
850 }
851
852 #[test]
853 fn test_entries_slice() {
854 let num_entries = 10;
855 let mut adapter = MockFamStructWrapper::new(num_entries).unwrap();
856
857 let expected_slice = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
858
859 {
860 let mut_entries_slice = adapter.as_mut_slice();
861 mut_entries_slice.copy_from_slice(expected_slice);
862 }
863
864 let u32_slice = unsafe {
865 std::slice::from_raw_parts(
866 adapter.as_fam_struct_ptr() as *const u32,
867 num_entries + ENTRIES_OFFSET,
868 )
869 };
870 assert_eq!(expected_slice, &u32_slice[ENTRIES_OFFSET..]);
871 assert_eq!(expected_slice, adapter.as_slice());
872 }
873
874 #[test]
875 fn test_reserve() {
876 let mut adapter = MockFamStructWrapper::new(0).unwrap();
877
878 for pair in FAM_LEN_TO_MEM_ALLOCATOR_LEN {
880 let num_elements = pair.0;
881 let required_mem_allocator_len = pair.1;
882
883 adapter.reserve(num_elements).unwrap();
884
885 assert!(adapter.mem_allocator.capacity() >= required_mem_allocator_len);
886 assert_eq!(0, adapter.len());
887 assert!(adapter.capacity() >= num_elements);
888 }
889
890 let current_capacity = adapter.capacity();
892 adapter.reserve(current_capacity - 1).unwrap();
893 assert_eq!(current_capacity, adapter.capacity());
894 }
895
896 #[test]
897 fn test_set_len() {
898 let mut desired_len = 0;
899 let mut adapter = MockFamStructWrapper::new(desired_len).unwrap();
900
901 assert!(adapter.set_len(desired_len).is_ok());
903 assert_eq!(adapter.len(), desired_len);
904
905 desired_len = 10;
907 assert!(adapter.set_len(desired_len).is_ok());
908 assert_eq!(adapter.len(), desired_len);
910 for element in adapter.as_slice() {
911 assert_eq!(*element, 0_u32);
912 }
913
914 desired_len = 5;
916 assert!(adapter.set_len(desired_len).is_ok());
917 assert_eq!(adapter.len(), desired_len);
918 }
919
920 #[test]
921 fn test_push() {
922 let mut adapter = MockFamStructWrapper::new(0).unwrap();
923
924 for i in 0..MAX_LEN {
925 assert!(adapter.push(i as u32).is_ok());
926 assert_eq!(adapter.as_slice()[i], i as u32);
927 assert_eq!(adapter.len(), i + 1);
928 assert!(
929 adapter.mem_allocator.capacity()
930 >= MockFamStructWrapper::mem_allocator_len(i + 1).unwrap()
931 );
932 }
933
934 assert!(adapter.push(0).is_err());
935 }
936
937 #[test]
938 fn test_retain() {
939 let mut adapter = MockFamStructWrapper::new(0).unwrap();
940
941 let mut num_retained_entries = 0;
942 for i in 0..MAX_LEN {
943 assert!(adapter.push(i as u32).is_ok());
944 if i % 2 == 0 {
945 num_retained_entries += 1;
946 }
947 }
948
949 adapter.retain(|entry| entry % 2 == 0);
950
951 for entry in adapter.as_slice().iter() {
952 assert_eq!(0, entry % 2);
953 }
954 assert_eq!(adapter.len(), num_retained_entries);
955 assert!(
956 adapter.mem_allocator.capacity()
957 >= MockFamStructWrapper::mem_allocator_len(num_retained_entries).unwrap()
958 );
959 }
960
961 #[test]
962 fn test_partial_eq() {
963 let mut wrapper_1 = MockFamStructWrapper::new(0).unwrap();
964 let mut wrapper_2 = MockFamStructWrapper::new(0).unwrap();
965 let mut wrapper_3 = MockFamStructWrapper::new(0).unwrap();
966
967 for i in 0..MAX_LEN {
968 assert!(wrapper_1.push(i as u32).is_ok());
969 assert!(wrapper_2.push(i as u32).is_ok());
970 assert!(wrapper_3.push(0).is_ok());
971 }
972
973 assert!(wrapper_1 == wrapper_2);
974 assert!(wrapper_1 != wrapper_3);
975 }
976
977 #[test]
978 fn test_clone() {
979 let mut adapter = MockFamStructWrapper::new(0).unwrap();
980
981 for i in 0..MAX_LEN {
982 assert!(adapter.push(i as u32).is_ok());
983 }
984
985 assert!(adapter == adapter.clone());
986 }
987
988 #[test]
989 fn test_from_header() {
990 let header = MockFamStruct::default();
991 let wrapper = MockFamStructWrapper::from_header(header).unwrap();
992 assert_eq!(wrapper.len(), 0);
993 assert_eq!(wrapper.as_fam_struct_ref().len, 0);
994
995 let header = MockFamStruct {
996 len: 100,
997 ..Default::default()
998 };
999 let error = MockFamStructWrapper::from_header(header);
1000 assert!(matches!(error, Err(Error::SizeLimitExceeded)));
1001 }
1002
1003 #[test]
1004 fn test_raw_content() {
1005 let data = vec![
1006 MockFamStruct {
1007 len: 2,
1008 padding: 5,
1009 entries: __IncompleteArrayField::new(),
1010 },
1011 MockFamStruct {
1012 len: 0xA5,
1013 padding: 0x1e,
1014 entries: __IncompleteArrayField::new(),
1015 },
1016 ];
1017
1018 let mut wrapper = unsafe { MockFamStructWrapper::from_raw(data) };
1019 {
1020 let payload = wrapper.as_slice();
1021 assert_eq!(payload[0], 0xA5);
1022 assert_eq!(payload[1], 0x1e);
1023 }
1024 assert_eq!(unsafe { wrapper.as_mut_fam_struct() }.padding, 5);
1025 let data = wrapper.into_raw();
1026 assert_eq!(data[0].len, 2);
1027 assert_eq!(data[0].padding, 5);
1028 }
1029
1030 #[cfg(feature = "with-serde")]
1031 #[test]
1032 fn test_ser_deser() {
1033 #[repr(C)]
1034 #[derive(Default, PartialEq)]
1035 #[cfg_attr(feature = "with-serde", derive(Deserialize, Serialize))]
1036 struct Message {
1037 pub len: u32,
1038 pub padding: u32,
1039 pub value: u32,
1040 #[cfg_attr(feature = "with-serde", serde(skip))]
1041 pub entries: __IncompleteArrayField<u32>,
1042 }
1043
1044 generate_fam_struct_impl!(Message, u32, entries, u32, len, 100);
1045
1046 type MessageFamStructWrapper = FamStructWrapper<Message>;
1047
1048 let data = vec![
1049 Message {
1050 len: 2,
1051 padding: 0,
1052 value: 42,
1053 entries: __IncompleteArrayField::new(),
1054 },
1055 Message {
1056 len: 0xA5,
1057 padding: 0x1e,
1058 value: 0,
1059 entries: __IncompleteArrayField::new(),
1060 },
1061 ];
1062
1063 let wrapper = unsafe { MessageFamStructWrapper::from_raw(data) };
1064 let data_ser = serde_json::to_string(&wrapper).unwrap();
1065 assert_eq!(
1066 data_ser,
1067 "[{\"len\":2,\"padding\":0,\"value\":42},[165,30]]"
1068 );
1069 let data_deser =
1070 serde_json::from_str::<MessageFamStructWrapper>(data_ser.as_str()).unwrap();
1071 assert!(wrapper.eq(&data_deser));
1072
1073 let bad_data_ser = r#"{"foo": "bar"}"#;
1074 assert!(serde_json::from_str::<MessageFamStructWrapper>(bad_data_ser).is_err());
1075
1076 #[repr(C)]
1077 #[derive(Default)]
1078 #[cfg_attr(feature = "with-serde", derive(Deserialize, Serialize))]
1079 struct Message2 {
1080 pub len: u32,
1081 pub padding: u32,
1082 pub value: u32,
1083 #[cfg_attr(feature = "with-serde", serde(skip))]
1084 pub entries: __IncompleteArrayField<u32>,
1085 }
1086
1087 generate_fam_struct_impl!(Message2, u32, entries, u32, len, 1);
1089
1090 type Message2FamStructWrapper = FamStructWrapper<Message2>;
1091 assert!(serde_json::from_str::<Message2FamStructWrapper>(data_ser.as_str()).is_err());
1092 }
1093
1094 #[test]
1095 fn test_clone_multiple_fields() {
1096 #[derive(Default, PartialEq)]
1097 #[repr(C)]
1098 struct Foo {
1099 index: u32,
1100 length: u16,
1101 flags: u32,
1102 entries: __IncompleteArrayField<u32>,
1103 }
1104
1105 generate_fam_struct_impl!(Foo, u32, entries, u16, length, 100);
1106
1107 type FooFamStructWrapper = FamStructWrapper<Foo>;
1108
1109 let mut wrapper = FooFamStructWrapper::new(0).unwrap();
1110 unsafe {
1112 wrapper.as_mut_fam_struct().index = 1;
1113 wrapper.as_mut_fam_struct().flags = 2;
1114 wrapper.as_mut_fam_struct().length = 3;
1115 wrapper.push(3).unwrap();
1116 wrapper.push(14).unwrap();
1117 assert_eq!(wrapper.as_slice().len(), 3 + 2);
1118 assert_eq!(wrapper.as_slice()[3], 3);
1119 assert_eq!(wrapper.as_slice()[3 + 1], 14);
1120
1121 let mut wrapper2 = wrapper.clone();
1122 assert_eq!(
1123 wrapper.as_mut_fam_struct().index,
1124 wrapper2.as_mut_fam_struct().index
1125 );
1126 assert_eq!(
1127 wrapper.as_mut_fam_struct().length,
1128 wrapper2.as_mut_fam_struct().length
1129 );
1130 assert_eq!(
1131 wrapper.as_mut_fam_struct().flags,
1132 wrapper2.as_mut_fam_struct().flags
1133 );
1134 assert_eq!(wrapper.as_slice(), wrapper2.as_slice());
1135 assert_eq!(
1136 wrapper2.as_slice().len(),
1137 wrapper2.as_mut_fam_struct().length as usize
1138 );
1139 assert!(wrapper == wrapper2);
1140
1141 wrapper.as_mut_fam_struct().index = 3;
1142 assert!(wrapper != wrapper2);
1143
1144 wrapper.as_mut_fam_struct().length = 7;
1145 assert!(wrapper != wrapper2);
1146
1147 wrapper.push(1).unwrap();
1148 assert_eq!(wrapper.as_mut_fam_struct().length, 8);
1149 assert!(wrapper != wrapper2);
1150
1151 let mut wrapper2 = wrapper.clone();
1152 assert!(wrapper == wrapper2);
1153
1154 drop(wrapper);
1156 assert_eq!(wrapper2.as_mut_fam_struct().index, 3);
1157 assert_eq!(wrapper2.as_mut_fam_struct().length, 8);
1158 assert_eq!(wrapper2.as_mut_fam_struct().flags, 2);
1159 assert_eq!(wrapper2.as_slice(), [0, 0, 0, 3, 14, 0, 0, 1]);
1160 }
1161 }
1162
1163 #[cfg(feature = "with-serde")]
1164 #[test]
1165 fn test_bad_deserialize() {
1166 #[repr(C)]
1167 #[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
1168 struct Foo {
1169 pub len: u32,
1170 pub padding: u32,
1171 pub entries: __IncompleteArrayField<u32>,
1172 }
1173
1174 generate_fam_struct_impl!(Foo, u32, entries, u32, len, 100);
1175
1176 let state = FamStructWrapper::<Foo>::new(0).unwrap();
1177 let mut bytes = bincode::serialize(&state).unwrap();
1178
1179 bytes[0] = 255;
1182
1183 assert!(
1184 matches!(bincode::deserialize::<FamStructWrapper<Foo>>(&bytes).map_err(|boxed| *boxed), Err(bincode::ErrorKind::Custom(s)) if s == *"Mismatch between length of FAM specified in FamStruct header (255) and actual size of FAM (0)")
1185 );
1186 }
1187}