oxilean_runtime/object/
rtobject_predicates.rs1use super::functions::{
8 PAYLOAD_MASK, TAG_ARRAY, TAG_BOOL, TAG_CHAR, TAG_CLOSURE, TAG_CTOR, TAG_EXTERNAL,
9 TAG_FLOAT_BITS, TAG_HEAP, TAG_INT, TAG_IO_ACTION, TAG_SMALL_NAT, TAG_STRING, TAG_TASK,
10 TAG_THUNK, TAG_UNIT,
11};
12
13use super::rtobject_type::RtObject;
14
15impl RtObject {
16 pub fn tag(&self) -> u8 {
18 (self.bits >> 56) as u8
19 }
20 pub fn is_inline(&self) -> bool {
22 let t = self.tag();
23 t == TAG_SMALL_NAT
24 || t == TAG_BOOL
25 || t == TAG_UNIT
26 || t == TAG_CHAR
27 || t == TAG_CTOR
28 || t == TAG_INT
29 || t == TAG_FLOAT_BITS
30 }
31 pub fn is_nat(&self) -> bool {
33 self.tag() == TAG_SMALL_NAT || self.tag() == TAG_HEAP
34 }
35 pub fn is_bool(&self) -> bool {
37 self.tag() == TAG_BOOL
38 }
39 pub fn is_unit(&self) -> bool {
41 self.tag() == TAG_UNIT
42 }
43 pub fn is_char(&self) -> bool {
45 self.tag() == TAG_CHAR
46 }
47 pub fn is_small_ctor(&self) -> bool {
49 self.tag() == TAG_CTOR
50 }
51 pub fn is_closure(&self) -> bool {
53 self.tag() == TAG_CLOSURE || self.tag() == TAG_HEAP
54 }
55 pub fn is_string_ref(&self) -> bool {
57 self.tag() == TAG_STRING
58 }
59 pub fn is_array_ref(&self) -> bool {
61 self.tag() == TAG_ARRAY
62 }
63 pub fn is_thunk_ref(&self) -> bool {
65 self.tag() == TAG_THUNK
66 }
67 pub fn is_io_action(&self) -> bool {
69 self.tag() == TAG_IO_ACTION
70 }
71 pub fn is_task_ref(&self) -> bool {
73 self.tag() == TAG_TASK
74 }
75 pub fn is_external_ref(&self) -> bool {
77 self.tag() == TAG_EXTERNAL
78 }
79 pub fn as_bool(&self) -> Option<bool> {
81 if self.tag() != TAG_BOOL {
82 return None;
83 }
84 Some(self.payload() != 0)
85 }
86 pub fn as_small_nat(&self) -> Option<u64> {
88 if self.tag() != TAG_SMALL_NAT {
89 return None;
90 }
91 Some(self.payload())
92 }
93 pub fn as_char(&self) -> Option<char> {
95 if self.tag() != TAG_CHAR {
96 return None;
97 }
98 char::from_u32(self.payload() as u32)
99 }
100 pub fn as_small_ctor(&self) -> Option<u32> {
102 if self.tag() != TAG_CTOR {
103 return None;
104 }
105 Some(self.payload() as u32)
106 }
107 pub fn as_small_int(&self) -> Option<i64> {
109 if self.tag() != TAG_INT {
110 return None;
111 }
112 let payload = self.payload();
113 if (payload >> 55) & 1 == 1 {
114 Some((payload | !PAYLOAD_MASK) as i64)
115 } else {
116 Some(payload as i64)
117 }
118 }
119 pub fn as_float_bits(&self) -> Option<u64> {
121 if self.tag() != TAG_FLOAT_BITS {
122 return None;
123 }
124 Some(self.payload())
125 }
126}