3838#define _OPENCSTL_DEQUE_H
3939#include "error.h"
4040#include "zalloc.h"
41+ #include "van_emde_boas_tree.h"
4142#ifdef _MSC_VER
4243#pragma warning(disable:4146)
4344#pragma warning(disable:4308)
@@ -71,6 +72,15 @@ OPENCSTL_FUNC void *__cstl_deque(size_t type_size, char *type) {
7172 OPENCSTL_NIDX (container , -2 ) = 0 ; // length
7273 * container = (char * ) ptr + type_size ;
7374 OPENCSTL_NIDX (container , -1 ) = - type_size - 1 ;
75+ bool iveb_init = false;
76+ if (iveb == NULL ) {
77+ iveb = iveb_new ();
78+ iveb_init = true;
79+ }
80+ iveb_insert (iveb , ptr , (char * ) ptr + (type_size * 2 ), CT_DEQUE , type_size , type );
81+ if (iveb_init ) {
82+ atexit (__opencstl_iveb_destroy );
83+ }
7484 return ptr ;
7585}
7686
@@ -90,6 +100,7 @@ OPENCSTL_FUNC void __cstl_deque_assign(void **container, size_t n, void *value)
90100#endif
91101
92102 capacity = n ;
103+ iveb_erase (iveb , (char * ) * container + distance );
93104 void * b = zalloc (1 , header_sz + capacity * type_size );
94105 memcpy (b , (char * ) * container - header_sz + distance , header_sz );
95106 zfree (((char * ) * container ) - header_sz + distance );
@@ -98,6 +109,7 @@ OPENCSTL_FUNC void __cstl_deque_assign(void **container, size_t n, void *value)
98109 distance = 0 ;
99110 * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance ) = n ;
100111 * (size_t * ) ((char * ) * (void * * ) container + -2 * sizeof (size_t ) + distance ) = n ;
112+ iveb_insert (iveb , * container , (char * ) (* container ) + (type_size * n ), CT_DEQUE , type_size , type );
101113
102114 if (value == NULL ) {
103115 memset ((char * ) * container , 0 , n * type_size );
@@ -114,7 +126,7 @@ OPENCSTL_FUNC void __cstl_deque_push_back(void **container, void *value) {
114126 size_t type_size = * (size_t * ) ((char * ) * (void * * ) container + NIDX_TSIZE * sizeof (size_t ) + distance );
115127 size_t length = * (size_t * ) ((char * ) * (void * * ) container + -2 * sizeof (size_t ) + distance );
116128 size_t capacity = * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance );
117- // char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
129+ char * type = (char * ) * (size_t * ) ((char * ) * (void * * ) container + -4 * sizeof (size_t ) + distance );
118130
119131#if !defined(__linux__ ) && !defined(__APPLE__ )
120132 size_t is_float = * (size_t * ) ((char * ) * (void * * ) container + -8 * sizeof (size_t ) + distance );
@@ -127,15 +139,19 @@ OPENCSTL_FUNC void __cstl_deque_push_back(void **container, void *value) {
127139
128140 if (length == capacity + distance / (ptrdiff_t ) type_size ) {
129141 size_t distance_sz = - distance ;
130- void * b = zalloc (1 , header_sz + capacity * 2 * type_size );
142+ size_t new_capacity = capacity * 2 ;
143+ iveb_erase (iveb , (char * ) * container + distance );
144+ void * b = zalloc (1 , header_sz + new_capacity * type_size );
131145 memcpy (b , (char * ) * container - (header_sz + distance_sz ), header_sz );
132- distance = capacity * 2 / 4 ;
146+ distance = new_capacity / 4 ;
133147 memcpy ((char * ) b + header_sz + distance * type_size , * container , length * type_size );
134148 zfree ((char * ) * container - (header_sz + distance_sz ));
135149 * container = ((char * ) b + (header_sz + distance * type_size ));
136150 distance = - distance * type_size ;
137151 * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance ) *= 2 ;
138152 OPENCSTL_NIDX (container , -1 ) = distance - 1 ;
153+ iveb_insert (iveb , (char * ) * container + distance ,
154+ (char * ) * container + distance + (type_size * new_capacity ), CT_DEQUE , type_size , type );
139155 }
140156 memcpy ((char * ) * container + type_size * length , value , type_size );
141157
@@ -148,7 +164,7 @@ OPENCSTL_FUNC void __cstl_deque_push_front(void **container, void *value) {
148164 size_t type_size = * (size_t * ) ((char * ) * (void * * ) container + NIDX_TSIZE * sizeof (size_t ) + distance );
149165 size_t length = * (size_t * ) ((char * ) * (void * * ) container + -2 * sizeof (size_t ) + distance );
150166 size_t capacity = * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance );
151- // char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
167+ char * type = (char * ) * (size_t * ) ((char * ) * (void * * ) container + -4 * sizeof (size_t ) + distance );
152168
153169#if !defined(__linux__ ) && !defined(__APPLE__ )
154170 size_t is_float = * (size_t * ) ((char * ) * (void * * ) container + -8 * sizeof (size_t ) + distance );
@@ -159,14 +175,18 @@ OPENCSTL_FUNC void __cstl_deque_push_front(void **container, void *value) {
159175 }
160176#endif
161177 if (distance == 0 ) {
162- void * b = zalloc (1 , header_sz + capacity * 2 * type_size );
178+ size_t new_capacity = capacity * 2 ;
179+ iveb_erase (iveb , (char * ) * container );
180+ void * b = zalloc (1 , header_sz + new_capacity * type_size );
163181 memcpy (b , (char * ) * container - header_sz , header_sz );
164- distance = capacity * 2 / 4 ;
182+ distance = new_capacity / 4 ;
165183 memcpy ((char * ) b + header_sz + distance * type_size , * container , length * type_size );
166184 zfree ((char * ) * container - header_sz );
167185 * container = ((char * ) b + (header_sz + distance * type_size ));
168186 distance = - distance * type_size ;
169187 * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance ) *= 2 ;
188+ iveb_insert (iveb , (char * ) * container + distance ,
189+ (char * ) * container + distance + (type_size * new_capacity ), CT_DEQUE , type_size , type );
170190 }
171191 memcpy ((char * ) * container - type_size * 2 , (char * ) * container - type_size , type_size );
172192 memcpy ((char * ) * container - type_size , value , type_size );
@@ -204,7 +224,7 @@ OPENCSTL_FUNC void __cstl_deque_insert(void **container, void *it, size_t n, voi
204224 size_t type_size = * (size_t * ) ((char * ) * (void * * ) container + NIDX_TSIZE * sizeof (size_t ) + distance );
205225 size_t length = * (size_t * ) ((char * ) * (void * * ) container + -2 * sizeof (size_t ) + distance );
206226 size_t capacity = * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance );
207- // char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
227+ char * type = (char * ) * (size_t * ) ((char * ) * (void * * ) container + -4 * sizeof (size_t ) + distance );
208228
209229#if !defined(__linux__ ) && !defined(__APPLE__ )
210230 size_t is_float = * (size_t * ) ((char * ) * (void * * ) container + -8 * sizeof (size_t ) + distance );
@@ -216,10 +236,14 @@ OPENCSTL_FUNC void __cstl_deque_insert(void **container, void *it, size_t n, voi
216236#endif
217237 size_t pos = (* (char * * ) it - * (char * * ) container ) / type_size ;
218238 if (length + n > capacity + distance / (ptrdiff_t ) type_size ) {
239+ iveb_erase (iveb , (char * ) * container + distance );
219240 capacity += n ;
220- void * b = realloc ((char * ) * container - header_sz + distance , header_sz + capacity * type_size - distance );
241+ size_t alloc_sz = header_sz + capacity * type_size - distance ;
242+ void * b = realloc ((char * ) * container - header_sz + distance , alloc_sz );
221243 * container = (char * ) b + header_sz - distance ;
222244 * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance ) += n ;
245+ iveb_insert (iveb , (char * ) * container + distance ,
246+ (char * ) b + alloc_sz , CT_DEQUE , type_size , type );
223247 }
224248 memcpy ((char * ) * container + (pos + n ) * type_size , (char * ) * container + pos * type_size ,
225249 (length - pos ) * type_size );
@@ -257,7 +281,7 @@ OPENCSTL_FUNC void __cstl_deque_resize(void **container, size_t n, void *value)
257281 size_t type_size = * (size_t * ) ((char * ) * (void * * ) container + NIDX_TSIZE * sizeof (size_t ) + distance );
258282 size_t length = * (size_t * ) ((char * ) * (void * * ) container + -2 * sizeof (size_t ) + distance );
259283 size_t capacity = * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance );
260- // char *type = (char *) *(size_t *) ((char *) *(void **) container + -4 * sizeof(size_t) + distance);
284+ char * type = (char * ) * (size_t * ) ((char * ) * (void * * ) container + -4 * sizeof (size_t ) + distance );
261285
262286#if !defined(__linux__ ) && !defined(__APPLE__ )
263287 size_t is_float = * (size_t * ) ((char * ) * (void * * ) container + -8 * sizeof (size_t ) + distance );
@@ -269,6 +293,7 @@ OPENCSTL_FUNC void __cstl_deque_resize(void **container, size_t n, void *value)
269293#endif
270294 if (capacity + distance / (ptrdiff_t ) type_size < n ) {
271295 capacity = n ;
296+ iveb_erase (iveb , (char * ) * container + distance );
272297 void * b = zalloc (1 , header_sz + capacity * type_size );
273298 memcpy (b , (char * ) * container - header_sz + distance , header_sz );
274299 memcpy ((char * ) b + header_sz , * container , length * type_size );
@@ -277,6 +302,7 @@ OPENCSTL_FUNC void __cstl_deque_resize(void **container, size_t n, void *value)
277302 OPENCSTL_NIDX (container , -1 ) = -1 ;
278303 distance = 0 ;
279304 * (size_t * ) ((char * ) * (void * * ) container + -3 * sizeof (size_t ) + distance ) = n ;
305+ iveb_insert (iveb , * container , (char * ) (* container ) + (type_size * n ), CT_DEQUE , type_size , type );
280306 }
281307 * (size_t * ) ((char * ) * (void * * ) container + -2 * sizeof (size_t ) + distance ) = n ;
282308 if (length < n ) {
@@ -327,6 +353,7 @@ OPENCSTL_FUNC void __cstl_deque_free(void **container) {
327353 ptrdiff_t distance = OPENCSTL_NIDX (container , -1 ) + 1 ;
328354 size_t header_sz = * (size_t * ) ((char * ) * (void * * ) container + NIDX_HSIZE * sizeof (size_t ) + distance );
329355
356+ iveb_erase (iveb , (char * ) * container + distance );
330357 zfree ((char * ) * container - (header_sz - distance ));
331358}
332359
0 commit comments