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