@@ -32,9 +32,7 @@ eaDSDynamicArray eaDSDynamicArrayInit(void * (*dataCreateAndCopy)(const void *),
3232
3333eaDSDynamicArray eaDSDynamicArrayInitWithDetails (void * (* dataCreateAndCopy )(const void * ), int (* dataCompare )(const void * , const void * ), void (* dataClear )(void * ), unsigned short expFactor , unsigned short startingCapacity )
3434{
35- eaDSDynamicArray dynamicArray = NULL ;
36-
37- dynamicArray = (eaDSDynamicArray ) malloc (sizeof (struct _eaDSDynamicArray ));
35+ eaDSDynamicArray dynamicArray = (eaDSDynamicArray ) malloc (sizeof (struct _eaDSDynamicArray ));
3836
3937 if (NULL == dynamicArray )
4038 {
@@ -56,9 +54,9 @@ eaDSDynamicArray eaDSDynamicArrayInitWithDetails(void * (*dataCreateAndCopy)(con
5654 dynamicArray -> Count = 0 ;
5755 dynamicArray -> Capacity = dynamicArray -> StartingCapacity ;
5856 dynamicArray -> ExpFactor = (expFactor < 2 ) ? DEFAULT_EXP_FACTOR : expFactor ;
59- dynamicArray -> dataCreateAndCopy = (dataCreateAndCopy == NULL ) ? copyAddress : dataCreateAndCopy ;
60- dynamicArray -> dataCompare = (dataCompare == NULL ) ? compareAddress : dataCompare ;
61- dynamicArray -> dataClear = (dataClear == NULL ) ? free : dataClear ;
57+ dynamicArray -> dataCreateAndCopy = (NULL == dataCreateAndCopy ) ? copyAddress : dataCreateAndCopy ;
58+ dynamicArray -> dataCompare = (NULL == dataCompare ) ? compareAddress : dataCompare ;
59+ dynamicArray -> dataClear = (NULL == dataClear ) ? free : dataClear ;
6260 }
6361 }
6462
@@ -122,9 +120,7 @@ void eaDSDynamicArrayClear(eaDSDynamicArray dynamicArray)
122120void eaDSDynamicArraySort (eaDSDynamicArray dynamicArray )
123121{
124122 void * buf ;
125- size_t i , j , N ;
126-
127- N = dynamicArray -> Count ;
123+ size_t i , j , N = dynamicArray -> Count ;
128124
129125 for (i = 1 ; i < N ; i ++ )
130126 {
@@ -149,9 +145,9 @@ size_t eaDSDynamicArrayGetCapacity(const eaDSDynamicArray dynamicArray)
149145
150146int eaDSDynamicArrayAdd (eaDSDynamicArray dynamicArray , const void * data )
151147{
152- void * item ;
148+ void * item = dynamicArray -> dataCreateAndCopy ( data ) ;
153149
154- if (NULL == ( item = dynamicArray -> dataCreateAndCopy ( data )) )
150+ if (NULL == item )
155151 {
156152 perror (NULL );
157153
@@ -160,11 +156,10 @@ int eaDSDynamicArrayAdd(eaDSDynamicArray dynamicArray, const void * data)
160156
161157 if (dynamicArray -> Count == dynamicArray -> Capacity )
162158 {
163- size_t i ;
164159 void * * tmp ;
165160
166161 dynamicArray -> Capacity *= dynamicArray -> ExpFactor ;
167- tmp = (void * * ) malloc ( dynamicArray -> Capacity * sizeof (void * ));
162+ tmp = (void * * ) realloc ( dynamicArray -> Data , dynamicArray -> Capacity * sizeof (void * ));
168163
169164 if (NULL == tmp )
170165 {
@@ -174,12 +169,6 @@ int eaDSDynamicArrayAdd(eaDSDynamicArray dynamicArray, const void * data)
174169 return EXIT_FAILURE ;
175170 }
176171
177- for (i = 0 ; i < dynamicArray -> Count ; i ++ )
178- {
179- tmp [i ] = dynamicArray -> Data [i ];
180- }
181-
182- free (dynamicArray -> Data );
183172 dynamicArray -> Data = tmp ;
184173 }
185174
@@ -189,11 +178,9 @@ int eaDSDynamicArrayAdd(eaDSDynamicArray dynamicArray, const void * data)
189178 return EXIT_SUCCESS ;
190179}
191180
192- int eaDSDynamicArrayInsert (eaDSDynamicArray dynamicArray , const void * data , const size_t index )
181+ int eaDSDynamicArrayInsert (eaDSDynamicArray dynamicArray , const void * data , size_t index )
193182{
194- size_t j , cnt ;
195-
196- cnt = dynamicArray -> Count ;
183+ size_t j , cnt = dynamicArray -> Count ;
197184
198185 if (index <= cnt )
199186 {
@@ -211,7 +198,7 @@ int eaDSDynamicArrayInsert(eaDSDynamicArray dynamicArray, const void * data, con
211198 void * * tmp ;
212199
213200 dynamicArray -> Capacity *= dynamicArray -> ExpFactor ;
214- tmp = (void * * ) malloc ( dynamicArray -> Capacity * sizeof (void * ));
201+ tmp = (void * * ) realloc ( dynamicArray -> Data , dynamicArray -> Capacity * sizeof (void * ));
215202
216203 if (NULL == tmp )
217204 {
@@ -221,12 +208,6 @@ int eaDSDynamicArrayInsert(eaDSDynamicArray dynamicArray, const void * data, con
221208 return EXIT_FAILURE ;
222209 }
223210
224- for (j = 0 ; j < dynamicArray -> Count ; j ++ )
225- {
226- tmp [j ] = dynamicArray -> Data [j ];
227- }
228-
229- free (dynamicArray -> Data );
230211 dynamicArray -> Data = tmp ;
231212 }
232213
@@ -254,14 +235,30 @@ int eaDSDynamicArrayInsert(eaDSDynamicArray dynamicArray, const void * data, con
254235
255236void eaDSDynamicArrayRemove (eaDSDynamicArray dynamicArray , const void * data )
256237{
257- size_t i , cnt ;
258-
259- cnt = dynamicArray -> Count ;
238+ size_t i , cnt = dynamicArray -> Count ;
260239
261240 for (i = 0 ; i < cnt ; i ++ )
262241 {
263242 if (!dynamicArray -> dataCompare (data , dynamicArray -> Data [i ]))
264243 {
244+ if ((DEFAULT_STARTING_CAPACITY < dynamicArray -> Capacity ) && (dynamicArray -> Count < dynamicArray -> Capacity / dynamicArray -> ExpFactor ))
245+ {
246+ void * * tmp ;
247+
248+ dynamicArray -> Capacity /= dynamicArray -> ExpFactor ;
249+ tmp = (void * * ) realloc (dynamicArray -> Data , dynamicArray -> Capacity * sizeof (void * ));
250+
251+ if (NULL != tmp )
252+ {
253+ dynamicArray -> Data = tmp ;
254+ }
255+ else
256+ {
257+ dynamicArray -> Capacity *= dynamicArray -> ExpFactor ;
258+ }
259+
260+ }
261+
265262 dynamicArray -> Count -- ;
266263 dynamicArray -> dataClear (dynamicArray -> Data [i ]);
267264
@@ -277,14 +274,29 @@ void eaDSDynamicArrayRemove(eaDSDynamicArray dynamicArray, const void * data)
277274
278275void eaDSDynamicArrayRemoveAll (eaDSDynamicArray dynamicArray , const void * data )
279276{
280- size_t i , cnt ;
281-
282- cnt = dynamicArray -> Count ;
277+ size_t i , cnt = dynamicArray -> Count ;
283278
284279 for (i = 0 ; i < cnt ; i ++ )
285280 {
286281 if (!dynamicArray -> dataCompare (data , dynamicArray -> Data [i ]))
287282 {
283+ if ((DEFAULT_STARTING_CAPACITY < dynamicArray -> Capacity ) && (dynamicArray -> Count < dynamicArray -> Capacity / dynamicArray -> ExpFactor ))
284+ {
285+ void * * tmp ;
286+
287+ dynamicArray -> Capacity /= dynamicArray -> ExpFactor ;
288+ tmp = (void * * ) realloc (dynamicArray -> Data , dynamicArray -> Capacity * sizeof (void * ));
289+
290+ if (NULL != tmp )
291+ {
292+ dynamicArray -> Data = tmp ;
293+ }
294+ else
295+ {
296+ dynamicArray -> Capacity *= dynamicArray -> ExpFactor ;
297+ }
298+ }
299+
288300 dynamicArray -> Count -- ;
289301 dynamicArray -> dataClear (dynamicArray -> Data [i ]);
290302
@@ -299,14 +311,13 @@ void eaDSDynamicArrayRemoveAll(eaDSDynamicArray dynamicArray, const void * data)
299311 }
300312}
301313
302- void eaDSDynamicArrayRemoveAt (eaDSDynamicArray dynamicArray , const size_t index )
314+ void eaDSDynamicArrayRemoveAt (eaDSDynamicArray dynamicArray , size_t index )
303315{
304- size_t j , cnt ;
305-
306- cnt = dynamicArray -> Count ;
316+ size_t j , cnt = dynamicArray -> Count ;
307317
308318 if (cnt && (index < cnt ))
309319 {
320+
310321 dynamicArray -> dataClear (dynamicArray -> Data [index ]);
311322
312323 for (j = index ; j < cnt - 1 ; j ++ )
@@ -318,14 +329,29 @@ void eaDSDynamicArrayRemoveAt(eaDSDynamicArray dynamicArray, const size_t index)
318329 }
319330}
320331
321- void eaDSDynamicArrayRemoveAtCopyLastItem (eaDSDynamicArray dynamicArray , const size_t index )
332+ void eaDSDynamicArrayRemoveAtCopyLastItem (eaDSDynamicArray dynamicArray , size_t index )
322333{
323- size_t cnt ;
324-
325- cnt = dynamicArray -> Count ;
334+ size_t cnt = dynamicArray -> Count ;
326335
327336 if (cnt && (index < cnt ))
328337 {
338+ if ((DEFAULT_STARTING_CAPACITY < dynamicArray -> Capacity ) && (dynamicArray -> Count < dynamicArray -> Capacity / dynamicArray -> ExpFactor ))
339+ {
340+ void * * tmp ;
341+
342+ dynamicArray -> Capacity /= dynamicArray -> ExpFactor ;
343+ tmp = (void * * ) realloc (dynamicArray -> Data , dynamicArray -> Capacity * sizeof (void * ));
344+
345+ if (NULL != tmp )
346+ {
347+ dynamicArray -> Data = tmp ;
348+ }
349+ else
350+ {
351+ dynamicArray -> Capacity *= dynamicArray -> ExpFactor ;
352+ }
353+ }
354+
329355 dynamicArray -> dataClear (dynamicArray -> Data [index ]);
330356
331357 if (cnt - 1 )
@@ -337,11 +363,9 @@ void eaDSDynamicArrayRemoveAtCopyLastItem(eaDSDynamicArray dynamicArray, const s
337363 }
338364}
339365
340- void * eaDSDynamicArrayGetFrom (const eaDSDynamicArray dynamicArray , const size_t index )
366+ void * eaDSDynamicArrayGetFrom (const eaDSDynamicArray dynamicArray , size_t index )
341367{
342- void * data ;
343-
344- data = NULL ;
368+ void * data = NULL ;
345369
346370 if (index < dynamicArray -> Count )
347371 {
@@ -354,7 +378,7 @@ void * eaDSDynamicArrayGetFrom(const eaDSDynamicArray dynamicArray, const size_t
354378 return data ;
355379}
356380
357- void * eaDSDynamicArrayGetAddressFrom (const eaDSDynamicArray dynamicArray , const size_t index )
381+ void * eaDSDynamicArrayGetAddressFrom (const eaDSDynamicArray dynamicArray , size_t index )
358382{
359383 if (index < dynamicArray -> Count )
360384 {
0 commit comments