Revision control

Copy as Markdown

Other Tools

// 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
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,
];