116 lines
2.4 KiB
Rust
116 lines
2.4 KiB
Rust
// This file is part of ICU4X. For terms of use, please see the file
|
|
// called LICENSE at the top level of the ICU4X source tree
|
|
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
|
|
|
|
use std::fmt::Debug;
|
|
use zerovec::*;
|
|
|
|
#[make_ule(StructULE)]
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
|
struct Struct {
|
|
a: u8,
|
|
b: u32,
|
|
c: Option<char>,
|
|
}
|
|
|
|
#[make_ule(HashedStructULE)]
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
|
#[zerovec::derive(Debug, Hash)]
|
|
struct HashedStruct {
|
|
a: u64,
|
|
b: i16,
|
|
c: Option<char>,
|
|
}
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
|
#[make_ule(TupleStructULE)]
|
|
struct TupleStruct(u8, char);
|
|
|
|
#[make_ule(EnumULE)]
|
|
#[repr(u8)]
|
|
#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)]
|
|
#[zerovec::derive(Debug, Hash)]
|
|
enum Enum {
|
|
A = 0,
|
|
B = 1,
|
|
D = 2,
|
|
E = 3,
|
|
FooBar = 4,
|
|
F = 5,
|
|
}
|
|
|
|
#[make_ule(OutOfOrderEnumULE)]
|
|
#[repr(u8)]
|
|
#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Debug)]
|
|
#[allow(unused)]
|
|
enum OutOfOrderEnum {
|
|
A = 0,
|
|
B = 1,
|
|
E = 3,
|
|
FooBar = 4,
|
|
D = 2,
|
|
F = 5,
|
|
}
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Ord, PartialOrd)]
|
|
#[make_ule(NoKVULE)]
|
|
#[zerovec::skip_derive(ZeroMapKV)]
|
|
struct NoKV(u8, char);
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
|
#[make_ule(NoOrdULE)]
|
|
#[zerovec::skip_derive(ZeroMapKV, Ord)]
|
|
struct NoOrd(u8, char);
|
|
|
|
fn test_zerovec<T: ule::AsULE + Debug + PartialEq>(slice: &[T]) {
|
|
let zerovec: ZeroVec<T> = slice.iter().copied().collect();
|
|
|
|
assert_eq!(zerovec, slice);
|
|
|
|
let bytes = zerovec.as_bytes();
|
|
let name = std::any::type_name::<T>();
|
|
let reparsed: ZeroVec<T> = ZeroVec::parse_byte_slice(bytes)
|
|
.unwrap_or_else(|_| panic!("Parsing {name} should succeed"));
|
|
|
|
assert_eq!(reparsed, slice);
|
|
}
|
|
|
|
fn main() {
|
|
test_zerovec(TEST_SLICE_STRUCT);
|
|
test_zerovec(TEST_SLICE_TUPLESTRUCT);
|
|
test_zerovec(TEST_SLICE_ENUM);
|
|
}
|
|
|
|
const TEST_SLICE_STRUCT: &[Struct] = &[
|
|
Struct {
|
|
a: 101,
|
|
b: 924,
|
|
c: Some('⸘'),
|
|
},
|
|
Struct {
|
|
a: 217,
|
|
b: 4228,
|
|
c: Some('ə'),
|
|
},
|
|
Struct {
|
|
a: 117,
|
|
b: 9090,
|
|
c: Some('ø'),
|
|
},
|
|
];
|
|
|
|
const TEST_SLICE_TUPLESTRUCT: &[TupleStruct] = &[
|
|
TupleStruct(101, 'ř'),
|
|
TupleStruct(76, '°'),
|
|
TupleStruct(15, 'a'),
|
|
];
|
|
|
|
const TEST_SLICE_ENUM: &[Enum] = &[
|
|
Enum::A,
|
|
Enum::FooBar,
|
|
Enum::F,
|
|
Enum::D,
|
|
Enum::B,
|
|
Enum::FooBar,
|
|
Enum::E,
|
|
];
|