1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ComputeAllocationError {
#[error("Must be a percent between 0 and 100.")]
MustBeAPercentage(),
}
#[derive(Copy, Clone, Debug)]
pub struct ComputeAllocation(u8);
impl std::convert::From<ComputeAllocation> for u8 {
fn from(compute_allocation: ComputeAllocation) -> Self {
compute_allocation.0
}
}
macro_rules! try_from_compute_alloc_decl {
( $t: ty ) => {
impl std::convert::TryFrom<$t> for ComputeAllocation {
type Error = ComputeAllocationError;
fn try_from(value: $t) -> Result<Self, Self::Error> {
if (value as i64) < 0 || (value as i64) > 100 {
Err(ComputeAllocationError::MustBeAPercentage())
} else {
Ok(Self(value as u8))
}
}
}
};
}
try_from_compute_alloc_decl!(u8);
try_from_compute_alloc_decl!(u16);
try_from_compute_alloc_decl!(u32);
try_from_compute_alloc_decl!(u64);
try_from_compute_alloc_decl!(i8);
try_from_compute_alloc_decl!(i16);
try_from_compute_alloc_decl!(i32);
try_from_compute_alloc_decl!(i64);
#[derive(Error, Debug)]
pub enum MemoryAllocationError {
#[error("Memory allocation must be between 0 and 2^48 (i.e 256TB), inclusively. Got {0}.")]
InvalidMemorySize(u64),
}
#[derive(Copy, Clone, Debug)]
pub struct MemoryAllocation(u64);
impl std::convert::From<MemoryAllocation> for u64 {
fn from(memory_allocation: MemoryAllocation) -> Self {
memory_allocation.0
}
}
macro_rules! try_from_memory_alloc_decl {
( $t: ty ) => {
impl std::convert::TryFrom<$t> for MemoryAllocation {
type Error = MemoryAllocationError;
fn try_from(value: $t) -> Result<Self, Self::Error> {
if (value as i64) < 0 || (value as i64) > (1i64 << 48) {
Err(MemoryAllocationError::InvalidMemorySize(value as u64))
} else {
Ok(Self(value as u64))
}
}
}
};
}
try_from_memory_alloc_decl!(u8);
try_from_memory_alloc_decl!(u16);
try_from_memory_alloc_decl!(u32);
try_from_memory_alloc_decl!(u64);
try_from_memory_alloc_decl!(i8);
try_from_memory_alloc_decl!(i16);
try_from_memory_alloc_decl!(i32);
try_from_memory_alloc_decl!(i64);
#[test]
#[allow(clippy::useless_conversion)]
fn can_convert_compute_allocation() {
use std::convert::{TryFrom, TryInto};
let _ca_u8: ComputeAllocation = 1u8.try_into().unwrap();
let _ca_u16: ComputeAllocation = 1u16.try_into().unwrap();
let _ca_u32: ComputeAllocation = 1u32.try_into().unwrap();
let _ca_u64: ComputeAllocation = 1u64.try_into().unwrap();
let _ca_i8: ComputeAllocation = 1i8.try_into().unwrap();
let _ca_i16: ComputeAllocation = 1i16.try_into().unwrap();
let _ca_i32: ComputeAllocation = 1i32.try_into().unwrap();
let _ca_i64: ComputeAllocation = 1i64.try_into().unwrap();
let ca = ComputeAllocation(100);
let _ca_ca: ComputeAllocation = ComputeAllocation::try_from(ca).unwrap();
}
#[test]
#[allow(clippy::useless_conversion)]
fn can_convert_memory_allocation() {
use std::convert::{TryFrom, TryInto};
let _ma_u8: MemoryAllocation = 1u8.try_into().unwrap();
let _ma_u16: MemoryAllocation = 1u16.try_into().unwrap();
let _ma_u32: MemoryAllocation = 1u32.try_into().unwrap();
let _ma_u64: MemoryAllocation = 1u64.try_into().unwrap();
let _ma_i8: MemoryAllocation = 1i8.try_into().unwrap();
let _ma_i16: MemoryAllocation = 1i16.try_into().unwrap();
let _ma_i32: MemoryAllocation = 1i32.try_into().unwrap();
let _ma_i64: MemoryAllocation = 1i64.try_into().unwrap();
let ma = MemoryAllocation(100);
let _ma_ma: MemoryAllocation = MemoryAllocation::try_from(ma).unwrap();
}