@@ -34,6 +34,8 @@ struct internal_deque {
3434 size_t start_index ;
3535 size_t end_index ;
3636 size_t block_count ;
37+ size_t alloc_block_start ;
38+ size_t alloc_block_end ;
3739 char * * data ;
3840};
3941
@@ -70,7 +72,9 @@ deque deque_init(const size_t data_size)
7072 init -> block_size * BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT / 2 ;
7173 init -> end_index = init -> start_index ;
7274 init -> block_count = BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT ;
73- init -> data = calloc (init -> block_count , sizeof (char * ));
75+ init -> alloc_block_start = init -> start_index / init -> block_size ;
76+ init -> alloc_block_end = init -> alloc_block_start ;
77+ init -> data = malloc (init -> block_count * sizeof (char * ));
7478 if (!init -> data ) {
7579 free (init );
7680 return NULL ;
@@ -81,8 +85,7 @@ deque deque_init(const size_t data_size)
8185 free (init );
8286 return NULL ;
8387 }
84- memcpy (init -> data + init -> start_index / init -> block_size , & block ,
85- sizeof (char * ));
88+ init -> data [init -> alloc_block_start ] = block ;
8689 return init ;
8790}
8891
@@ -134,20 +137,18 @@ bk_err deque_trim(deque me)
134137 }
135138 memcpy (updated_data , me -> data + start_block_index ,
136139 updated_block_count * sizeof (char * ));
137- for (i = 0 ; i < start_block_index ; i ++ ) {
138- char * block ;
139- memcpy (& block , me -> data + i , sizeof (char * ));
140- free (block );
140+ for (i = me -> alloc_block_start ; i < start_block_index ; i ++ ) {
141+ free (me -> data [i ]);
141142 }
142- for (i = end_block_index + 1 ; i < me -> block_count ; i ++ ) {
143- char * block ;
144- memcpy (& block , me -> data + i , sizeof (char * ));
145- free (block );
143+ for (i = end_block_index + 1 ; i <= me -> alloc_block_end ; i ++ ) {
144+ free (me -> data [i ]);
146145 }
147146 free (me -> data );
148147 me -> start_index -= start_block_index * me -> block_size ;
149148 me -> end_index -= start_block_index * me -> block_size ;
150149 me -> block_count = updated_block_count ;
150+ me -> alloc_block_start = 0 ;
151+ me -> alloc_block_end = updated_block_count - 1 ;
151152 me -> data = updated_data ;
152153 return BK_OK ;
153154}
@@ -235,18 +236,15 @@ bk_err deque_add_all(deque me, void *const arr, const size_t size)
235236 if (!temp ) {
236237 return - BK_ENOMEM ;
237238 }
238- memset (temp + me -> block_count , 0 , appended_blocks * sizeof (char * ));
239239 me -> data = temp ;
240240 me -> block_count = new_block_count ;
241241 }
242- for (i = block_index + 1 ; i <= block_index + needed_blocks ; i ++ ) {
243- if (me -> data [i ]) {
244- continue ;
245- }
242+ for (i = me -> alloc_block_end + 1 ; i <= block_index + needed_blocks ; i ++ ) {
246243 me -> data [i ] = malloc (me -> block_size * me -> data_size );
247244 if (!me -> data [i ]) {
248245 return - BK_ENOMEM ;
249246 }
247+ me -> alloc_block_end ++ ;
250248 }
251249 offset = first_block_space * me -> data_size ;
252250 memcpy (me -> data [block_index ] + inner_index * me -> data_size , arr , offset );
@@ -307,23 +305,28 @@ bk_err deque_push_front(deque me, void *const data)
307305 return - BK_ENOMEM ;
308306 }
309307 memmove (temp + added_blocks , temp , me -> block_count * sizeof (char * ));
310- memset (temp , 0 , added_blocks * sizeof (char * ));
311308 me -> data = temp ;
312309 me -> block_count = new_block_count ;
313310 me -> start_index += added_blocks * me -> block_size ;
314311 me -> end_index += added_blocks * me -> block_size ;
312+ me -> alloc_block_start += added_blocks ;
313+ me -> alloc_block_end += added_blocks ;
315314 }
316315 if (me -> start_index % me -> block_size == 0 ) {
317- char * block ;
318- const size_t previous_block_index =
319- me -> start_index / me -> block_size - 1 ;
320- memcpy (& block , me -> data + previous_block_index , sizeof (char * ));
321- if (!block ) {
322- block = malloc (me -> block_size * me -> data_size );
323- if (!block ) {
324- return - BK_ENOMEM ;
316+ const size_t add_block_index = me -> start_index / me -> block_size - 1 ;
317+ if (add_block_index < me -> alloc_block_start ) {
318+ const size_t end_block = (me -> end_index - 1 ) / me -> block_size ;
319+ if (end_block < me -> alloc_block_end ) {
320+ me -> data [add_block_index ] = me -> data [me -> alloc_block_end ];
321+ me -> alloc_block_end -- ;
322+ } else {
323+ me -> data [add_block_index ] =
324+ malloc (me -> block_size * me -> data_size );
325+ if (!me -> data [add_block_index ]) {
326+ return - BK_ENOMEM ;
327+ }
325328 }
326- memcpy ( me -> data + previous_block_index , & block , sizeof ( char * )) ;
329+ me -> alloc_block_start -- ;
327330 }
328331 }
329332 me -> start_index -- ;
@@ -355,30 +358,32 @@ bk_err deque_push_back(deque me, void *const data)
355358{
356359 if (me -> end_index == me -> block_count * me -> block_size ) {
357360 const size_t new_block_count = deque_get_new_block_count (me );
358- size_t added_blocks ;
359361 char * * temp ;
360362 if (new_block_count == 0 ) {
361363 return - BK_ERANGE ;
362364 }
363- added_blocks = new_block_count - me -> block_count ;
364365 temp = realloc (me -> data , new_block_count * sizeof (char * ));
365366 if (!temp ) {
366367 return - BK_ENOMEM ;
367368 }
368- memset (temp + me -> block_count , 0 , added_blocks * sizeof (char * ));
369369 me -> data = temp ;
370370 me -> block_count = new_block_count ;
371371 }
372372 if (me -> end_index % me -> block_size == 0 ) {
373- char * block ;
374- const size_t tentative_block_index = me -> end_index / me -> block_size ;
375- memcpy (& block , me -> data + tentative_block_index , sizeof (char * ));
376- if (!block ) {
377- block = malloc (me -> block_size * me -> data_size );
378- if (!block ) {
379- return - BK_ENOMEM ;
373+ const size_t add_block_index = me -> end_index / me -> block_size ;
374+ if (add_block_index > me -> alloc_block_end ) {
375+ const size_t start_block = me -> start_index / me -> block_size ;
376+ if (start_block > me -> alloc_block_start ) {
377+ me -> data [add_block_index ] = me -> data [me -> alloc_block_start ];
378+ me -> alloc_block_start ++ ;
379+ } else {
380+ me -> data [add_block_index ] =
381+ malloc (me -> block_size * me -> data_size );
382+ if (!me -> data [add_block_index ]) {
383+ return - BK_ENOMEM ;
384+ }
380385 }
381- memcpy ( me -> data + tentative_block_index , & block , sizeof ( char * )) ;
386+ me -> alloc_block_end ++ ;
382387 }
383388 }
384389 {
@@ -586,8 +591,8 @@ bk_err deque_clear(deque me)
586591{
587592 size_t i ;
588593 char * updated_block ;
589- char * * updated_data = calloc ( BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT ,
590- sizeof (char * ));
594+ char * * updated_data =
595+ malloc ( BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT * sizeof (char * ));
591596 if (!updated_data ) {
592597 return - BK_ENOMEM ;
593598 }
@@ -596,18 +601,17 @@ bk_err deque_clear(deque me)
596601 free (updated_data );
597602 return - BK_ENOMEM ;
598603 }
599- for (i = 0 ; i < me -> block_count ; i ++ ) {
600- char * block ;
601- memcpy (& block , me -> data + i , sizeof (char * ));
602- free (block );
604+ for (i = me -> alloc_block_start ; i <= me -> alloc_block_end ; i ++ ) {
605+ free (me -> data [i ]);
603606 }
604607 free (me -> data );
605608 me -> start_index = me -> block_size * BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT / 2 ;
606609 me -> end_index = me -> start_index ;
607610 me -> block_count = BKTHOMPS_DEQUE_INITIAL_BLOCK_COUNT ;
611+ me -> alloc_block_start = me -> start_index / me -> block_size ;
612+ me -> alloc_block_end = me -> alloc_block_start ;
608613 me -> data = updated_data ;
609- memcpy (me -> data + me -> start_index / me -> block_size , & updated_block ,
610- sizeof (char * ));
614+ me -> data [me -> alloc_block_start ] = updated_block ;
611615 return BK_OK ;
612616}
613617
@@ -622,10 +626,8 @@ bk_err deque_clear(deque me)
622626deque deque_destroy (deque me )
623627{
624628 size_t i ;
625- for (i = 0 ; i < me -> block_count ; i ++ ) {
626- char * block ;
627- memcpy (& block , me -> data + i , sizeof (char * ));
628- free (block );
629+ for (i = me -> alloc_block_start ; i <= me -> alloc_block_end ; i ++ ) {
630+ free (me -> data [i ]);
629631 }
630632 free (me -> data );
631633 free (me );
0 commit comments