bump_scope/
error_behavior.rs1use core::alloc::Layout;
2
3use crate::{BumpAllocatorExt, MutBumpAllocatorExt, NonNull, alloc::AllocError};
4
5#[cfg(feature = "panic-on-alloc")]
6use crate::{Infallible, capacity_overflow, format_trait_error, handle_alloc_error};
7
8pub(crate) trait ErrorBehavior: Sized {
9 #[cfg(feature = "panic-on-alloc")]
10 const PANICS_ON_ALLOC: bool;
11
12 fn allocation(layout: Layout) -> Self;
13 fn capacity_overflow() -> Self;
14 fn fixed_size_vector_is_full() -> Self;
15 fn fixed_size_vector_no_space(amount: usize) -> Self;
16 fn format_trait_error() -> Self;
17 #[expect(dead_code)]
18 fn allocate_layout(allocator: &impl BumpAllocatorExt, layout: Layout) -> Result<NonNull<u8>, Self>;
19 #[expect(dead_code)]
20 fn allocate_sized<T>(allocator: &impl BumpAllocatorExt) -> Result<NonNull<T>, Self>;
21 fn allocate_slice<T>(allocator: &impl BumpAllocatorExt, len: usize) -> Result<NonNull<T>, Self>;
22 unsafe fn prepare_slice_allocation<T>(
23 allocator: &mut impl MutBumpAllocatorExt,
24 len: usize,
25 ) -> Result<NonNull<[T]>, Self>;
26}
27
28#[cfg(feature = "panic-on-alloc")]
29impl ErrorBehavior for Infallible {
30 #[cfg(feature = "panic-on-alloc")]
31 const PANICS_ON_ALLOC: bool = true;
32
33 #[inline(always)]
34 fn allocation(layout: Layout) -> Self {
35 handle_alloc_error(layout)
36 }
37
38 #[inline(always)]
39 fn capacity_overflow() -> Self {
40 capacity_overflow()
41 }
42
43 #[inline(always)]
44 fn fixed_size_vector_is_full() -> Self {
45 fixed_size_vector_is_full()
46 }
47
48 #[inline(always)]
49 fn fixed_size_vector_no_space(amount: usize) -> Self {
50 fixed_size_vector_no_space(amount)
51 }
52
53 #[inline(always)]
54 fn format_trait_error() -> Self {
55 format_trait_error()
56 }
57
58 #[inline(always)]
59 fn allocate_layout(allocator: &impl BumpAllocatorExt, layout: Layout) -> Result<NonNull<u8>, Self> {
60 Ok(allocator.allocate_layout(layout))
61 }
62
63 #[inline(always)]
64 fn allocate_sized<T>(allocator: &impl BumpAllocatorExt) -> Result<NonNull<T>, Self> {
65 Ok(allocator.allocate_sized::<T>())
66 }
67
68 #[inline(always)]
69 fn allocate_slice<T>(allocator: &impl BumpAllocatorExt, len: usize) -> Result<NonNull<T>, Self> {
70 Ok(allocator.allocate_slice::<T>(len))
71 }
72
73 #[inline(always)]
74 unsafe fn prepare_slice_allocation<T>(
75 allocator: &mut impl MutBumpAllocatorExt,
76 len: usize,
77 ) -> Result<NonNull<[T]>, Self> {
78 Ok(allocator.prepare_slice_allocation::<T>(len))
79 }
80}
81
82impl ErrorBehavior for AllocError {
83 #[cfg(feature = "panic-on-alloc")]
84 const PANICS_ON_ALLOC: bool = false;
85
86 #[inline(always)]
87 fn allocation(_: Layout) -> Self {
88 Self
89 }
90
91 #[inline(always)]
92 fn capacity_overflow() -> Self {
93 Self
94 }
95
96 #[inline(always)]
97 fn fixed_size_vector_is_full() -> Self {
98 Self
99 }
100
101 #[inline(always)]
102 fn fixed_size_vector_no_space(amount: usize) -> Self {
103 let _ = amount;
104 Self
105 }
106
107 #[inline(always)]
108 fn format_trait_error() -> Self {
109 Self
110 }
111
112 #[inline(always)]
113 fn allocate_layout(allocator: &impl BumpAllocatorExt, layout: Layout) -> Result<NonNull<u8>, Self> {
114 allocator.try_allocate_layout(layout)
115 }
116
117 #[inline(always)]
118 fn allocate_sized<T>(allocator: &impl BumpAllocatorExt) -> Result<NonNull<T>, Self> {
119 allocator.try_allocate_sized::<T>()
120 }
121
122 #[inline(always)]
123 fn allocate_slice<T>(allocator: &impl BumpAllocatorExt, len: usize) -> Result<NonNull<T>, Self> {
124 allocator.try_allocate_slice::<T>(len)
125 }
126
127 #[inline(always)]
128 unsafe fn prepare_slice_allocation<T>(
129 allocator: &mut impl MutBumpAllocatorExt,
130 len: usize,
131 ) -> Result<NonNull<[T]>, Self> {
132 allocator.try_prepare_slice_allocation::<T>(len)
133 }
134}
135
136#[cold]
137#[inline(never)]
138#[cfg(feature = "panic-on-alloc")]
139fn fixed_size_vector_is_full() -> ! {
140 panic!("fixed size vector is full");
141}
142
143#[cold]
144#[inline(never)]
145#[cfg(feature = "panic-on-alloc")]
146fn fixed_size_vector_no_space(amount: usize) -> ! {
147 panic!("fixed size vector does not have space for {amount} more elements");
148}