1use std::{cell::Cell, mem, num};
2
3use crate::{Allocator, Box, Vec};
4
5pub trait TakeIn<'a>: Dummy<'a> {
7 #[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 #[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
24pub trait Dummy<'a>: Sized {
26 fn dummy(allocator: &'a Allocator) -> Self;
28}
29
30impl<'a, T> Dummy<'a> for Option<T> {
31 #[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 #[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 #[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 #[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);