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
15impl<'a, T> TakeIn<'a> for Vec<'a, T> {}
16
17pub trait Dummy<'a>: Sized {
19 fn dummy(allocator: &'a Allocator) -> Self;
21}
22
23impl<'a, T> Dummy<'a> for Option<T> {
24 #[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 #[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 #[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 #[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);