Skip to main content

oxilean_runtime/object/
rtobject_predicates.rs

1//! # RtObject - predicates Methods
2//!
3//! This module contains method implementations for `RtObject`.
4//!
5//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
6
7use 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    /// Get the tag byte.
17    pub fn tag(&self) -> u8 {
18        (self.bits >> 56) as u8
19    }
20    /// Check if this is an inline (non-heap) value.
21    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    /// Check if this is a natural number (small or big).
32    pub fn is_nat(&self) -> bool {
33        self.tag() == TAG_SMALL_NAT || self.tag() == TAG_HEAP
34    }
35    /// Check if this is a boolean.
36    pub fn is_bool(&self) -> bool {
37        self.tag() == TAG_BOOL
38    }
39    /// Check if this is the unit value.
40    pub fn is_unit(&self) -> bool {
41        self.tag() == TAG_UNIT
42    }
43    /// Check if this is a character.
44    pub fn is_char(&self) -> bool {
45        self.tag() == TAG_CHAR
46    }
47    /// Check if this is a small constructor.
48    pub fn is_small_ctor(&self) -> bool {
49        self.tag() == TAG_CTOR
50    }
51    /// Check if this is a closure reference.
52    pub fn is_closure(&self) -> bool {
53        self.tag() == TAG_CLOSURE || self.tag() == TAG_HEAP
54    }
55    /// Check if this is a string reference.
56    pub fn is_string_ref(&self) -> bool {
57        self.tag() == TAG_STRING
58    }
59    /// Check if this is an array reference.
60    pub fn is_array_ref(&self) -> bool {
61        self.tag() == TAG_ARRAY
62    }
63    /// Check if this is a thunk reference.
64    pub fn is_thunk_ref(&self) -> bool {
65        self.tag() == TAG_THUNK
66    }
67    /// Check if this is an IO action reference.
68    pub fn is_io_action(&self) -> bool {
69        self.tag() == TAG_IO_ACTION
70    }
71    /// Check if this is a task reference.
72    pub fn is_task_ref(&self) -> bool {
73        self.tag() == TAG_TASK
74    }
75    /// Check if this is an external object reference.
76    pub fn is_external_ref(&self) -> bool {
77        self.tag() == TAG_EXTERNAL
78    }
79    /// Extract a boolean value.
80    pub fn as_bool(&self) -> Option<bool> {
81        if self.tag() != TAG_BOOL {
82            return None;
83        }
84        Some(self.payload() != 0)
85    }
86    /// Extract a small natural number.
87    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    /// Extract a character value.
94    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    /// Extract a small constructor index.
101    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    /// Extract a small signed integer.
108    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    /// Extract float bits.
120    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}