Skip to main content

oxilean_runtime/object/
rtobject_traits.rs

1//! # RtObject - Trait Implementations
2//!
3//! This module contains trait implementations for `RtObject`.
4//!
5//! ## Implemented Traits
6//!
7//! - `Debug`
8//! - `Display`
9//! - `PartialEq`
10//! - `Eq`
11//! - `Hash`
12//!
13//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
14
15use std::fmt;
16use std::hash::{Hash, Hasher};
17
18use super::functions::{
19    TAG_ARRAY, TAG_BOOL, TAG_CHAR, TAG_CLOSURE, TAG_CTOR, TAG_EXTERNAL, TAG_FLOAT_BITS, TAG_HEAP,
20    TAG_INT, TAG_IO_ACTION, TAG_SMALL_NAT, TAG_STRING, TAG_TASK, TAG_THUNK, TAG_UNIT,
21};
22use super::rtobject_type::RtObject;
23
24impl fmt::Debug for RtObject {
25    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
26        match self.tag() {
27            TAG_SMALL_NAT => write!(f, "RtObject::Nat({})", self.payload()),
28            TAG_BOOL => write!(f, "RtObject::Bool({})", self.payload() != 0),
29            TAG_UNIT => write!(f, "RtObject::Unit"),
30            TAG_CHAR => {
31                if let Some(c) = self.as_char() {
32                    write!(f, "RtObject::Char({:?})", c)
33                } else {
34                    write!(f, "RtObject::Char(<invalid>)")
35                }
36            }
37            TAG_CTOR => write!(f, "RtObject::Ctor({})", self.payload()),
38            TAG_INT => {
39                if let Some(n) = self.as_small_int() {
40                    write!(f, "RtObject::Int({})", n)
41                } else {
42                    write!(f, "RtObject::Int(<invalid>)")
43                }
44            }
45            TAG_FLOAT_BITS => write!(f, "RtObject::Float(bits={})", self.payload()),
46            TAG_HEAP => write!(f, "RtObject::Heap(id={})", self.payload()),
47            TAG_CLOSURE => write!(f, "RtObject::Closure(id={})", self.payload()),
48            TAG_ARRAY => write!(f, "RtObject::Array(id={})", self.payload()),
49            TAG_STRING => write!(f, "RtObject::String(id={})", self.payload()),
50            TAG_THUNK => write!(f, "RtObject::Thunk(id={})", self.payload()),
51            TAG_IO_ACTION => write!(f, "RtObject::IoAction(id={})", self.payload()),
52            TAG_TASK => write!(f, "RtObject::Task(id={})", self.payload()),
53            TAG_EXTERNAL => write!(f, "RtObject::External(id={})", self.payload()),
54            _ => {
55                write!(
56                    f,
57                    "RtObject::Unknown(tag={}, payload={})",
58                    self.tag(),
59                    self.payload()
60                )
61            }
62        }
63    }
64}
65
66impl fmt::Display for RtObject {
67    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
68        match self.tag() {
69            TAG_SMALL_NAT => write!(f, "{}", self.payload()),
70            TAG_BOOL => {
71                if self.payload() != 0 {
72                    write!(f, "true")
73                } else {
74                    write!(f, "false")
75                }
76            }
77            TAG_UNIT => write!(f, "()"),
78            TAG_CHAR => {
79                if let Some(c) = self.as_char() {
80                    write!(f, "{}", c)
81                } else {
82                    write!(f, "<invalid char>")
83                }
84            }
85            TAG_CTOR => write!(f, "ctor#{}", self.payload()),
86            TAG_INT => {
87                if let Some(n) = self.as_small_int() {
88                    write!(f, "{}", n)
89                } else {
90                    write!(f, "<invalid int>")
91                }
92            }
93            _ => write!(f, "<object tag={}>", self.tag()),
94        }
95    }
96}
97
98impl PartialEq for RtObject {
99    fn eq(&self, other: &Self) -> bool {
100        self.bits == other.bits
101    }
102}
103
104impl Eq for RtObject {}
105
106impl Hash for RtObject {
107    fn hash<H: Hasher>(&self, state: &mut H) {
108        self.bits.hash(state);
109    }
110}