• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // This file is part of ICU4X. For terms of use, please see the file
2 // called LICENSE at the top level of the ICU4X source tree
3 // (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4 
5 use std::fmt::Debug;
6 use ule::ULE;
7 use zerovec::*;
8 
9 #[make_ule(StructULE)]
10 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
11 struct Struct {
12     a: u8,
13     b: u32,
14     c: Option<char>,
15 }
16 
17 #[make_ule(HashedStructULE)]
18 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
19 #[zerovec::derive(Debug, Hash)]
20 struct HashedStruct {
21     a: u64,
22     b: i16,
23     c: Option<char>,
24 }
25 
26 #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
27 #[make_ule(TupleStructULE)]
28 struct TupleStruct(u8, char);
29 
30 #[make_ule(EnumULE)]
31 #[repr(u8)]
32 #[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)]
33 #[zerovec::derive(Debug, Hash)]
34 enum Enum {
35     A = 0,
36     B = 1,
37     D = 2,
38     E = 3,
39     FooBar = 4,
40     F = 5,
41 }
42 
43 #[make_ule(OutOfOrderMissingZeroEnumULE)]
44 #[repr(u8)]
45 #[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)]
46 #[allow(unused)]
47 enum OutOfOrderMissingZeroEnum {
48     E = 3,
49     B = 1,
50     FooBar = 4,
51     D = 2,
52     F = 5,
53 }
54 
55 #[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)]
56 #[make_ule(NoKVULE)]
57 #[zerovec::skip_derive(ZeroMapKV)]
58 struct NoKV(u8, char);
59 
60 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
61 #[make_ule(NoOrdULE)]
62 #[zerovec::skip_derive(ZeroMapKV, Ord)]
63 struct NoOrd(u8, char);
64 
test_zerovec<T: ule::AsULE + Debug + PartialEq>(slice: &[T])65 fn test_zerovec<T: ule::AsULE + Debug + PartialEq>(slice: &[T]) {
66     let zerovec: ZeroVec<T> = slice.iter().copied().collect();
67 
68     assert_eq!(zerovec, slice);
69 
70     let bytes = zerovec.as_bytes();
71     let name = std::any::type_name::<T>();
72     let reparsed: ZeroVec<T> =
73         ZeroVec::parse_bytes(bytes).unwrap_or_else(|_| panic!("Parsing {name} should succeed"));
74 
75     assert_eq!(reparsed, slice);
76 }
77 
main()78 fn main() {
79     test_zerovec(TEST_SLICE_STRUCT);
80     test_zerovec(TEST_SLICE_TUPLESTRUCT);
81     test_zerovec(TEST_SLICE_ENUM);
82 
83     assert!(EnumULE::parse_bytes_to_slice(&[0]).is_ok());
84     assert!(EnumULE::parse_bytes_to_slice(&[1]).is_ok());
85     assert!(EnumULE::parse_bytes_to_slice(&[5]).is_ok());
86     assert!(EnumULE::parse_bytes_to_slice(&[6]).is_err());
87     assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[0]).is_err());
88     assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[1]).is_ok());
89     assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[5]).is_ok());
90     assert!(OutOfOrderMissingZeroEnumULE::parse_bytes_to_slice(&[6]).is_err());
91 }
92 
93 const TEST_SLICE_STRUCT: &[Struct] = &[
94     Struct {
95         a: 101,
96         b: 924,
97         c: Some('⸘'),
98     },
99     Struct {
100         a: 217,
101         b: 4228,
102         c: Some('ə'),
103     },
104     Struct {
105         a: 117,
106         b: 9090,
107         c: Some('ø'),
108     },
109 ];
110 
111 const TEST_SLICE_TUPLESTRUCT: &[TupleStruct] = &[
112     TupleStruct(101, 'ř'),
113     TupleStruct(76, '°'),
114     TupleStruct(15, 'a'),
115 ];
116 
117 const TEST_SLICE_ENUM: &[Enum] = &[
118     Enum::A,
119     Enum::FooBar,
120     Enum::F,
121     Enum::D,
122     Enum::B,
123     Enum::FooBar,
124     Enum::E,
125 ];
126