@@ -293,24 +293,39 @@ static size_t deque_get_new_block_count(deque me)
293293bk_err deque_push_front (deque me , void * const data )
294294{
295295 if (me -> start_index == 0 ) {
296- const size_t new_block_count = deque_get_new_block_count (me );
297- size_t added_blocks ;
298- char * * temp ;
299- if (new_block_count == 0 ) {
300- return - BK_ERANGE ;
301- }
302- added_blocks = new_block_count - me -> block_count ;
303- temp = realloc (me -> data , new_block_count * sizeof (char * ));
304- if (!temp ) {
305- return - BK_ENOMEM ;
296+ const size_t available_end = me -> block_count - me -> alloc_block_end - 1 ;
297+ if (available_end > BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT ) {
298+ const size_t shift_end = available_end / 2 ;
299+ const size_t allocated_blocks =
300+ me -> alloc_block_end - me -> alloc_block_start + 1 ;
301+ memmove (me -> data + me -> alloc_block_start + shift_end ,
302+ me -> data + me -> alloc_block_start ,
303+ allocated_blocks * sizeof (char * ));
304+ me -> start_index += shift_end * me -> block_size ;
305+ me -> end_index += shift_end * me -> block_size ;
306+ me -> alloc_block_start += shift_end ;
307+ me -> alloc_block_end += shift_end ;
308+ } else {
309+ const size_t new_block_count = deque_get_new_block_count (me );
310+ size_t added_blocks ;
311+ char * * temp ;
312+ if (new_block_count == 0 ) {
313+ return - BK_ERANGE ;
314+ }
315+ added_blocks = new_block_count - me -> block_count ;
316+ temp = realloc (me -> data , new_block_count * sizeof (char * ));
317+ if (!temp ) {
318+ return - BK_ENOMEM ;
319+ }
320+ memmove (temp + added_blocks , temp ,
321+ me -> block_count * sizeof (char * ));
322+ me -> data = temp ;
323+ me -> block_count = new_block_count ;
324+ me -> start_index += added_blocks * me -> block_size ;
325+ me -> end_index += added_blocks * me -> block_size ;
326+ me -> alloc_block_start += added_blocks ;
327+ me -> alloc_block_end += added_blocks ;
306328 }
307- memmove (temp + added_blocks , temp , me -> block_count * sizeof (char * ));
308- me -> data = temp ;
309- me -> block_count = new_block_count ;
310- me -> start_index += added_blocks * me -> block_size ;
311- me -> end_index += added_blocks * me -> block_size ;
312- me -> alloc_block_start += added_blocks ;
313- me -> alloc_block_end += added_blocks ;
314329 }
315330 if (me -> start_index % me -> block_size == 0 ) {
316331 const size_t add_block_index = me -> start_index / me -> block_size - 1 ;
@@ -357,17 +372,31 @@ bk_err deque_push_front(deque me, void *const data)
357372bk_err deque_push_back (deque me , void * const data )
358373{
359374 if (me -> end_index == me -> block_count * me -> block_size ) {
360- const size_t new_block_count = deque_get_new_block_count (me );
361- char * * temp ;
362- if (new_block_count == 0 ) {
363- return - BK_ERANGE ;
364- }
365- temp = realloc (me -> data , new_block_count * sizeof (char * ));
366- if (!temp ) {
367- return - BK_ENOMEM ;
375+ const size_t available_start = me -> alloc_block_start ;
376+ if (available_start > BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT ) {
377+ const size_t shift_start = available_start - available_start / 2 ;
378+ const size_t allocated_blocks =
379+ me -> alloc_block_end - me -> alloc_block_start + 1 ;
380+ memmove (me -> data + me -> alloc_block_start / 2 ,
381+ me -> data + me -> alloc_block_start ,
382+ allocated_blocks * sizeof (char * ));
383+ me -> start_index -= shift_start * me -> block_size ;
384+ me -> end_index -= shift_start * me -> block_size ;
385+ me -> alloc_block_start -= shift_start ;
386+ me -> alloc_block_end -= shift_start ;
387+ } else {
388+ const size_t new_block_count = deque_get_new_block_count (me );
389+ char * * temp ;
390+ if (new_block_count == 0 ) {
391+ return - BK_ERANGE ;
392+ }
393+ temp = realloc (me -> data , new_block_count * sizeof (char * ));
394+ if (!temp ) {
395+ return - BK_ENOMEM ;
396+ }
397+ me -> data = temp ;
398+ me -> block_count = new_block_count ;
368399 }
369- me -> data = temp ;
370- me -> block_count = new_block_count ;
371400 }
372401 if (me -> end_index % me -> block_size == 0 ) {
373402 const size_t add_block_index = me -> end_index / me -> block_size ;
0 commit comments