ic_memory/slot/
id_range.rs1use super::memory_manager::{
2 MEMORY_MANAGER_INVALID_ID, MEMORY_MANAGER_MAX_ID, MEMORY_MANAGER_MIN_ID,
3};
4use serde::{Deserialize, Deserializer, Serialize, de::Error as _};
5
6#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize)]
14pub struct MemoryManagerIdRange {
15 start: u8,
16 end: u8,
17}
18
19impl<'de> Deserialize<'de> for MemoryManagerIdRange {
20 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21 #[derive(Deserialize)]
22 #[serde(rename = "MemoryManagerIdRange", deny_unknown_fields)]
23 struct Bounds {
24 start: u8,
25 end: u8,
26 }
27
28 let bounds = Bounds::deserialize(deserializer)?;
29 Self::new(bounds.start, bounds.end).map_err(D::Error::custom)
30 }
31}
32
33impl MemoryManagerIdRange {
34 pub const fn new(start: u8, end: u8) -> Result<Self, MemoryManagerRangeError> {
36 if start > end {
37 return Err(MemoryManagerRangeError::InvalidRange { start, end });
38 }
39 if end == MEMORY_MANAGER_INVALID_ID {
41 return Err(MemoryManagerRangeError::InvalidMemoryManagerId { id: end });
42 }
43 Ok(Self { start, end })
44 }
45
46 #[must_use]
48 pub const fn all_usable() -> Self {
49 Self {
50 start: MEMORY_MANAGER_MIN_ID,
51 end: MEMORY_MANAGER_MAX_ID,
52 }
53 }
54
55 #[must_use]
57 pub const fn contains(&self, id: u8) -> bool {
58 id >= self.start && id <= self.end
59 }
60
61 #[must_use]
63 pub const fn start(&self) -> u8 {
64 self.start
65 }
66
67 #[must_use]
69 pub const fn end(&self) -> u8 {
70 self.end
71 }
72}
73
74#[non_exhaustive]
79#[derive(Clone, Copy, Debug, Eq, thiserror::Error, PartialEq)]
80pub enum MemoryManagerRangeError {
81 #[error("MemoryManager ID range is invalid: start={start} end={end}")]
83 InvalidRange {
84 start: u8,
86 end: u8,
88 },
89 #[error("MemoryManager ID {id} is not a usable allocation slot")]
91 InvalidMemoryManagerId {
92 id: u8,
94 },
95}