datex_core/datex_values/
slot.rs

1use std::fmt;
2
3#[derive(Clone, PartialEq, Eq)]
4pub struct SlotIdentifier {
5	pub index: u16,
6}
7
8
9
10pub mod internal_slot {
11    use super::SlotIdentifier;
12
13	pub const THIS:SlotIdentifier       = SlotIdentifier {index: 0xff00};
14	pub const IT:SlotIdentifier         = SlotIdentifier {index: 0xff01};
15	pub const PUBLIC:SlotIdentifier     = SlotIdentifier {index: 0xff02};
16	pub const ORIGIN:SlotIdentifier     = SlotIdentifier {index: 0xff03};
17	pub const ENDPOINT:SlotIdentifier   = SlotIdentifier {index: 0xff04};
18	pub const LOCATION:SlotIdentifier   = SlotIdentifier {index: 0xff05};
19	pub const META:SlotIdentifier       = SlotIdentifier {index: 0xff06};
20	pub const ENV:SlotIdentifier        = SlotIdentifier {index: 0xff07};
21	pub const RESULT:SlotIdentifier     = SlotIdentifier {index: 0xff08};
22	pub const SUB_RESULT:SlotIdentifier = SlotIdentifier {index: 0xff09};
23	pub const ENTRYPOINT:SlotIdentifier = SlotIdentifier {index: 0xff0a};
24	pub const STD:SlotIdentifier        = SlotIdentifier {index: 0xff0b};
25
26	pub const OBJ_WRITE:SlotIdentifier  = SlotIdentifier {index: 0xfef0};
27	pub const OBJ_READ:SlotIdentifier   = SlotIdentifier {index: 0xfef1};
28	pub const OBJ_EXEC:SlotIdentifier   = SlotIdentifier {index: 0xfef2};
29}
30
31
32/**
33 * global slot address space:
34 * 0xff00 - 0xffff (255) reserved internal slots (#result, #location, #it, ...)
35 * 0xf000 - 0xf9ff (2559) use for scope value transfers
36 * 
37 * object slot address space
38 * 0xfef0 - 0xfeff (15) reserved internal object slots (#read, #write)
39 * 0xfa00 - 0xfeef (1263) use for object slots
40 * 
41 * free slots (for variables):
42 * 0x0000 - 0xefff (61439)
43 */
44
45pub mod internal_slot_address_space {
46	pub const RESERVED:(u16,u16) 				= (0xff00, 0xffff);
47	pub const RESERVED_OBJECT_SLOTS:(u16,u16) 	= (0xfef0, 0xfeff);
48
49	pub const SCOPE_VAL_TRANSFER:(u16,u16) 		= (0xf000, 0xf9ff);
50	pub const OBJECT_SLOTS:(u16,u16) 			= (0xfa00, 0xfeef);
51	pub const UNASSIGNED:(u16,u16) 				= (0x0000, 0xefff);
52}
53
54impl Default for SlotIdentifier {
55    fn default() -> Self { SlotIdentifier {index:0} }
56}
57
58impl SlotIdentifier {
59
60	pub fn new(index:u16) -> SlotIdentifier {
61		SlotIdentifier {index}
62	}
63
64	pub fn to_string(&self) -> String {
65		match *self {
66			internal_slot::THIS => {"#this".to_string()},
67			internal_slot::IT => {"#it".to_string()},
68			internal_slot::PUBLIC => {"#public".to_string()},
69			internal_slot::ORIGIN => {"#origin".to_string()},
70			internal_slot::ENDPOINT => {"#endpoint".to_string()},
71			internal_slot::LOCATION => {"#location".to_string()},
72			internal_slot::META => {"#meta".to_string()},
73			internal_slot::ENV => {"#env".to_string()},
74			internal_slot::RESULT => {"#result".to_string()},
75			internal_slot::SUB_RESULT => {"#sub_result".to_string()},
76			internal_slot::ENTRYPOINT => {"#entrypoint".to_string()},
77			internal_slot::STD => {"#std".to_string()},
78
79			internal_slot::OBJ_READ => {"#read".to_string()},
80			internal_slot::OBJ_WRITE => {"#write".to_string()},
81			internal_slot::OBJ_EXEC => {"#exec".to_string()},
82
83			_ => format!("#{:X}", self.index)
84		}
85    }
86
87	pub fn is_reserved(&self) -> bool {
88		self.index >= internal_slot_address_space::RESERVED_OBJECT_SLOTS.0 && self.index <= internal_slot_address_space::RESERVED.1
89	}
90
91	pub fn is_object_slot(&self) -> bool {
92		(self.index >= internal_slot_address_space::OBJECT_SLOTS.0 && self.index <= internal_slot_address_space::OBJECT_SLOTS.1) ||
93		(self.index >= internal_slot_address_space::RESERVED_OBJECT_SLOTS.0 && self.index <= internal_slot_address_space::RESERVED_OBJECT_SLOTS.1)
94	}
95}
96
97impl fmt::Display for SlotIdentifier {
98    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
99        write!(f, "{}", self.to_string())
100    }
101}