gbf_core/decompiler/ast/
ptr.rs1use std::fmt::{self, Debug, Display};
32use std::ops::{Deref, DerefMut};
33use std::{slice, vec};
34
35use serde::{Deserialize, Serialize};
36
37use super::meta::Metadata;
38use super::node_id::NodeId;
39
40#[derive(Serialize, Deserialize)]
44pub struct P<T: ?Sized> {
45 ptr: Box<T>,
46 node_id: NodeId,
47 metadata: Metadata,
48}
49
50#[allow(non_snake_case)]
52pub fn P<T: 'static>(value: T) -> P<T> {
53 P {
54 ptr: Box::new(value),
55 node_id: NodeId::new(),
56 metadata: Metadata::default(),
57 }
58}
59
60impl<T: 'static> P<T> {
61 pub fn and_then<U, F>(self, f: F) -> U
64 where
65 F: FnOnce(T) -> U,
66 {
67 f(*self.ptr)
68 }
69
70 pub fn into_inner(self) -> T {
72 *self.ptr
73 }
74
75 pub fn map<F>(mut self, f: F) -> P<T>
77 where
78 F: FnOnce(T) -> T,
79 {
80 let x = f(*self.ptr);
81 *self.ptr = x;
82
83 self
84 }
85
86 pub fn filter_map<F>(mut self, f: F) -> Option<P<T>>
88 where
89 F: FnOnce(T) -> Option<T>,
90 {
91 *self.ptr = f(*self.ptr)?;
92 Some(self)
93 }
94
95 pub fn node_id(&self) -> NodeId {
97 self.node_id
98 }
99
100 pub fn metadata(&self) -> &Metadata {
102 &self.metadata
103 }
104
105 pub fn metadata_mut(&mut self) -> &mut Metadata {
107 &mut self.metadata
108 }
109}
110
111impl<T: ?Sized> Deref for P<T> {
112 type Target = T;
113
114 fn deref(&self) -> &T {
115 &self.ptr
116 }
117}
118
119impl<T: ?Sized> DerefMut for P<T> {
120 fn deref_mut(&mut self) -> &mut T {
121 &mut self.ptr
122 }
123}
124
125impl<T: ?Sized> AsRef<T> for P<T> {
126 fn as_ref(&self) -> &T {
128 &self.ptr
129 }
130}
131
132impl<T: 'static + Clone> Clone for P<T> {
133 fn clone(&self) -> P<T> {
134 P {
135 ptr: self.ptr.clone(),
136 node_id: NodeId::new(),
138 metadata: self.metadata.clone(),
139 }
140 }
141}
142
143impl<T: ?Sized + Debug> Debug for P<T> {
144 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
145 Debug::fmt(&self.ptr, f)
146 }
147}
148
149impl<T: Display> Display for P<T> {
150 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
151 Display::fmt(&**self, f)
152 }
153}
154
155impl<T> fmt::Pointer for P<T> {
156 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
157 fmt::Pointer::fmt(&self.ptr, f)
158 }
159}
160
161impl<T> From<T> for P<T> {
162 fn from(value: T) -> Self {
163 P {
164 ptr: Box::new(value),
165 node_id: NodeId::new(),
166 metadata: Metadata::default(),
167 }
168 }
169}
170
171impl<T> P<[T]> {
172 pub fn new() -> P<[T]> {
174 P {
175 ptr: Box::default(),
176 node_id: NodeId::new(),
177 metadata: Metadata::default(),
178 }
179 }
180
181 #[inline(never)]
182 pub fn from_vec(v: Vec<T>) -> P<[T]> {
184 P {
185 ptr: v.into_boxed_slice(),
186 node_id: NodeId::new(),
187 metadata: Metadata::default(),
188 }
189 }
190
191 #[inline(never)]
192 pub fn into_vec(self) -> Vec<T> {
194 self.ptr.into_vec()
195 }
196}
197
198impl<T> Default for P<[T]> {
199 fn default() -> P<[T]> {
201 P::new()
202 }
203}
204
205impl<T: Clone> Clone for P<[T]> {
206 fn clone(&self) -> P<[T]> {
207 P::from_vec(self.to_vec())
208 }
209}
210
211impl<T> From<Vec<T>> for P<[T]> {
212 fn from(v: Vec<T>) -> Self {
213 P::from_vec(v)
214 }
215}
216
217impl<T> From<P<[T]>> for Vec<T> {
218 fn from(val: P<[T]>) -> Self {
219 val.into_vec()
220 }
221}
222
223impl<T> FromIterator<T> for P<[T]> {
224 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> P<[T]> {
225 P::from_vec(iter.into_iter().collect())
226 }
227}
228
229impl<T> IntoIterator for P<[T]> {
230 type Item = T;
231 type IntoIter = vec::IntoIter<T>;
232
233 fn into_iter(self) -> Self::IntoIter {
234 self.into_vec().into_iter()
235 }
236}
237
238impl<'a, T> IntoIterator for &'a P<[T]> {
239 type Item = &'a T;
240 type IntoIter = slice::Iter<'a, T>;
241 fn into_iter(self) -> Self::IntoIter {
242 self.ptr.iter()
243 }
244}
245
246impl<T: PartialEq> PartialEq for P<T> {
247 fn eq(&self, other: &Self) -> bool {
248 **self == **other
249 }
250}
251
252impl<T: Eq> Eq for P<T> {}