oxc_allocator/
take_in.rs

1use std::{cell::Cell, mem, num};
2
3use crate::{Allocator, Box, Vec};
4
5/// A trait to replace an existing AST node with a dummy.
6pub trait TakeIn<'a>: Dummy<'a> {
7    /// Replace node with a dummy.
8    #[must_use]
9    fn take_in(&mut self, allocator: &'a Allocator) -> Self {
10        let dummy = Dummy::dummy(allocator);
11        mem::replace(self, dummy)
12    }
13
14    /// Replace node with a boxed dummy.
15    #[must_use]
16    fn take_in_box(&mut self, allocator: &'a Allocator) -> Box<'a, Self> {
17        let dummy = Dummy::dummy(allocator);
18        Box::new_in(mem::replace(self, dummy), allocator)
19    }
20}
21
22impl<'a, T> TakeIn<'a> for Vec<'a, T> {}
23
24/// A trait to create a dummy AST node.
25pub trait Dummy<'a>: Sized {
26    /// Create a dummy node.
27    fn dummy(allocator: &'a Allocator) -> Self;
28}
29
30impl<'a, T> Dummy<'a> for Option<T> {
31    /// Create a dummy [`Option`].
32    #[expect(clippy::inline_always)]
33    #[inline(always)]
34    fn dummy(_allocator: &'a Allocator) -> Self {
35        None
36    }
37}
38
39impl<'a, T: Dummy<'a>> Dummy<'a> for Box<'a, T> {
40    /// Create a dummy [`Box`].
41    #[inline]
42    fn dummy(allocator: &'a Allocator) -> Self {
43        Box::new_in(Dummy::dummy(allocator), allocator)
44    }
45}
46
47impl<'a, T> Dummy<'a> for Vec<'a, T> {
48    /// Create a dummy [`Vec`].
49    #[inline]
50    fn dummy(allocator: &'a Allocator) -> Self {
51        Vec::new_in(allocator)
52    }
53}
54
55impl<'a, T: Dummy<'a>> Dummy<'a> for Cell<T> {
56    /// Create a dummy [`Cell`].
57    #[expect(clippy::inline_always)]
58    #[inline(always)]
59    fn dummy(allocator: &'a Allocator) -> Self {
60        Cell::new(Dummy::dummy(allocator))
61    }
62}
63
64impl<'a> Dummy<'a> for () {
65    #[inline(always)]
66    fn dummy(_allocator: &'a Allocator) {}
67}
68
69impl<'a> Dummy<'a> for bool {
70    #[expect(clippy::inline_always)]
71    #[inline(always)]
72    fn dummy(_allocator: &'a Allocator) -> Self {
73        false
74    }
75}
76
77impl<'a> Dummy<'a> for &'a str {
78    #[expect(clippy::inline_always)]
79    #[inline(always)]
80    fn dummy(_allocator: &'a Allocator) -> Self {
81        ""
82    }
83}
84
85macro_rules! dummy_impl_int {
86    ($ty:ident) => {
87        impl<'a> Dummy<'a> for $ty {
88            #[inline(always)]
89            fn dummy(_allocator: &'a Allocator) -> Self {
90                0
91            }
92        }
93    };
94}
95
96dummy_impl_int!(u8);
97dummy_impl_int!(u16);
98dummy_impl_int!(u32);
99dummy_impl_int!(u64);
100dummy_impl_int!(u128);
101dummy_impl_int!(usize);
102dummy_impl_int!(i8);
103dummy_impl_int!(i16);
104dummy_impl_int!(i32);
105dummy_impl_int!(i64);
106dummy_impl_int!(i128);
107dummy_impl_int!(isize);
108
109macro_rules! dummy_impl_float {
110    ($ty:ident) => {
111        impl<'a> Dummy<'a> for $ty {
112            #[inline(always)]
113            fn dummy(_allocator: &'a Allocator) -> Self {
114                0.0
115            }
116        }
117    };
118}
119
120dummy_impl_float!(f32);
121dummy_impl_float!(f64);
122
123macro_rules! dummy_impl_non_zero {
124    ($ty:ident) => {
125        impl<'a> Dummy<'a> for num::$ty {
126            #[inline(always)]
127            fn dummy(_allocator: &'a Allocator) -> Self {
128                Self::MIN
129            }
130        }
131    };
132}
133
134dummy_impl_non_zero!(NonZeroU8);
135dummy_impl_non_zero!(NonZeroU16);
136dummy_impl_non_zero!(NonZeroU32);
137dummy_impl_non_zero!(NonZeroU64);
138dummy_impl_non_zero!(NonZeroU128);
139dummy_impl_non_zero!(NonZeroUsize);
140dummy_impl_non_zero!(NonZeroI8);
141dummy_impl_non_zero!(NonZeroI16);
142dummy_impl_non_zero!(NonZeroI32);
143dummy_impl_non_zero!(NonZeroI64);
144dummy_impl_non_zero!(NonZeroI128);
145dummy_impl_non_zero!(NonZeroIsize);