void DArray_Erase( DArray *self, daoint start, daoint n ) { void **buf = self->items.pVoid - self->offset; daoint rest, locked; if( start >= self->size ) return; if( n < 0 ) n = self->size; if( n > self->size - start ) n = self->size - start; if( n == 1 ){ if( start == 0 ){ DArray_PopFront( self ); return; }else if( start == self->size -1 ){ DArray_PopBack( self ); return; } } DArray_DeleteItems( self, start, start+n ); rest = self->size - start - n; locked = self->type == D_VALUE ? DaoGC_LockArray( self ) : 0; memmove( self->items.pVoid + start, self->items.pVoid + start + n, rest * sizeof(void*) ); self->size -= n; if( self->size < 0.5*self->bufsize && self->size + 10 < self->bufsize ){ if( self->offset ) memmove( buf, self->items.pVoid, self->size * sizeof(void*)); self->bufsize = 0.6 * self->bufsize + 1; self->items.pVoid = (void**) dao_realloc( buf, (self->bufsize+1)*sizeof(void*) ); self->offset = 0; } DaoGC_UnlockArray( self, locked ); }
void DArray_Resize( DArray *self, daoint size, void *val ) { void **buf = self->items.pVoid - self->offset; daoint i; if( size == self->size && self->bufsize>0 ) return; DArray_DeleteItems( self, size, self->size ); if( self->offset ){ daoint min = size > self->size ? self->size : size; int locked = self->type == D_VALUE ? DaoGC_LockArray( self ) : 0; memmove( buf, self->items.pVoid, min*sizeof(void*) ); self->items.pVoid = buf; self->offset = 0; DaoGC_UnlockArray( self, locked ); } /* When resize() is called, probably this is the intended size, * not to be changed frequently. */ if( size >= self->bufsize || size < self->bufsize /2 ){ int locked = self->type == D_VALUE ? DaoGC_LockArray( self ) : 0; self->bufsize = size; self->items.pVoid = (void**) dao_realloc( buf, self->bufsize*sizeof(void*) ); DaoGC_UnlockArray( self, locked ); } if( self->type && val != NULL ){ for(i=self->size; i<size; i++ ) self->items.pVoid[i] = DArray_CopyItem( self, val ); }else{ for(i=self->size; i<size; i++ ) self->items.pVoid[i] = val; } self->size = size; }
void DArray_Clear( DArray *self ) { void **buf = self->items.pVoid - self->offset; DArray_DeleteItems( self, 0, self->size ); if( buf ) dao_free( buf ); self->items.pVoid = NULL; self->size = self->bufsize = 0; self->offset = 0; }