1#[macro_export]
2macro_rules! create_typed_array {
3 ($name: ident, $t: ty, $len: expr) => {
4 #[repr(C)]
5 #[derive(Default, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
6 pub struct $name ([$t; $len]);
7
8 impl<'a> From<&'a [$t]> for $name {
9 fn from(slice: &'a [$t]) -> Self {
10 assert_eq!(slice.len(), $len, "Tried to create instance with slice of wrong length");
11 let mut a = [0 as $t; $len];
12 a.clone_from_slice(&slice[0..$len]);
13 $name(a)
14 }
15 }
16
17 impl ::beserial::Deserialize for $name {
18 fn deserialize<R: ::beserial::ReadBytesExt>(reader: &mut R) -> Result<Self, ::beserial::SerializingError> {
19 let mut a = [0 as $t; $len];
20 reader.read_exact(&mut a[..])?;
21 Ok($name(a))
22 }
23 }
24
25 impl ::beserial::Serialize for $name {
26 fn serialize<W: ::beserial::WriteBytesExt>(&self, writer: &mut W) -> Result<usize, ::beserial::SerializingError> {
27 writer.write_all(&self.0)?;
28 Ok($len)
29 }
30
31 fn serialized_size(&self) -> usize {
32 $len
33 }
34 }
35
36 impl From<[$t; $len]> for $name {
37 fn from(arr: [$t; $len]) -> Self {
38 $name(arr)
39 }
40 }
41
42 impl From<$name> for [$t; $len] {
43 fn from(i: $name) -> [$t; $len] {
44 i.0
45 }
46 }
47
48 impl ::std::fmt::Debug for $name {
49 fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
50 f.write_str(&::hex::encode(&self.0))
51 }
52 }
53
54 impl $name {
55 pub const SIZE: usize = $len;
56 #[inline]
57 pub fn len() -> usize { $len }
58 pub fn as_bytes(&self) -> &[$t] { &self.0 }
59 }
60 };
61}
62
63#[macro_export]
64macro_rules! add_hex_io_fns_typed_arr {
65 ($name: ident, $len: expr) => {
66 impl ::std::fmt::Display for $name {
67 fn fmt(&self, f: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
68 f.write_str(&::hex::encode(&self.0))
69 }
70 }
71
72 impl $name {
73 pub fn to_hex(&self) -> String { ::hex::encode(&self.0) }
74 }
75
76 impl ::std::str::FromStr for $name {
77 type Err = ::hex::FromHexError;
78
79 fn from_str(s: &str) -> Result<Self, Self::Err> {
80 let vec = Vec::from_hex(s)?;
81 if vec.len() == $len {
82 Ok($name::from(&vec[..]))
83 } else {
84 Err(::hex::FromHexError::InvalidStringLength)
85 }
86 }
87 }
88
89 impl From<&'static str> for $name {
90 fn from(s: &'static str) -> Self {
91 s.parse().unwrap()
92 }
93 }
94 };
95}
96
97#[macro_export]
98macro_rules! upgrade_weak {
99 ($weak_ref: expr) => {
100 if let Some(arc) = $weak_ref.upgrade() {
101 arc
102 } else {
103 return;
104 }
105 }
106}