@@ -196,19 +196,55 @@ impl Heap {
196196 self . size ( ) - self . used
197197 }
198198
199- /// Extends the size of the heap by creating a new hole at the end
199+ /// Extends the size of the heap by creating a new hole at the end.
200+ ///
201+ /// Panics when the heap extension fails. Use [`try_extend`] to handle potential errors.
200202 ///
201203 /// # Safety
202204 ///
203205 /// The amount of data given in `by` MUST exist directly after the original
204206 /// range of data provided when constructing the [Heap]. The additional data
205207 /// must have the same lifetime of the original range of data.
206208 pub unsafe fn extend ( & mut self , by : usize ) {
207- let top = self . top ( ) ;
208- let layout = Layout :: from_size_align ( by, 1 ) . unwrap ( ) ;
209- self . holes
210- . deallocate ( NonNull :: new_unchecked ( top as * mut u8 ) , layout) ;
211- self . holes . top = self . holes . top . add ( by) ;
209+ self . holes . try_extend ( by) . expect ( "heap extension failed" ) ;
210+ }
211+
212+ /// Tries to extend the size of the heap by creating a new hole at the end.
213+ ///
214+ /// # Safety
215+ ///
216+ /// The amount of data given in `by` MUST exist directly after the original
217+ /// range of data provided when constructing the [Heap]. The additional data
218+ /// must have the same lifetime of the original range of data.
219+ pub unsafe fn try_extend ( & mut self , by : usize ) -> Result < ( ) , ExtendError > {
220+ self . holes . try_extend ( by)
221+ }
222+ }
223+
224+ #[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
225+ pub enum ExtendError {
226+ /// The given extension size was not large enough to store the necessary metadata.
227+ SizeTooSmall ,
228+ /// The given extension size was must be a multiple of 16.
229+ OddSize ,
230+ /// The heap size must be a multiple of 16, otherwise extension is not possible.
231+ OddHeapSize ,
232+ /// Extending an empty heap is not possible.
233+ EmptyHeap ,
234+ }
235+
236+ impl core:: fmt:: Display for ExtendError {
237+ fn fmt ( & self , f : & mut core:: fmt:: Formatter < ' _ > ) -> core:: fmt:: Result {
238+ f. write_str ( match self {
239+ ExtendError :: SizeTooSmall => {
240+ "heap extension size was not large enough to store the necessary metadata"
241+ }
242+ ExtendError :: OddSize => "heap extension size is not a multiple of 16" ,
243+ ExtendError :: OddHeapSize => {
244+ "heap extension not possible because heap size is not a multiple of 16"
245+ }
246+ ExtendError :: EmptyHeap => "tried to extend an emtpy heap" ,
247+ } )
212248 }
213249}
214250
0 commit comments