bump_scope/
error_behavior.rs

1use 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}