0
0
mirror of https://github.com/torje/C_crash_course.git synced 2025-06-26 16:31:54 +02:00
Files

71 lines
1.7 KiB
C

#include <stdlib.h>
#include <string.h>
#include "array.h"
struct Array{
struct Buffer * buffer;
size_t data_size;
size_t used;
};
struct Array *Array_create( size_t data_size){
struct Array * array = calloc( sizeof( struct Array ), 1);
array -> data_size = data_size;
array -> used = 0;
array -> buffer = Buffer_create();
return array;
}
void Array_finalize(struct Array ** array){
Buffer_clear((*array)->buffer);
free((*array)->buffer);
(*array)->data_size = 0;
(*array)->used = 0;
free( *array);
*array=NULL;
}
void Array_alloc_from_zero( struct Array * array, size_t size){
Buffer_alloc_from_zero(array->buffer, size*array->data_size);
}
int Array_resize(struct Array * array, size_t size){
return Buffer_resize( array->buffer, size*array->data_size);
}
void *Array_at(struct Array *array, size_t pos){
return Buffer_at( array->buffer, pos*array->data_size);
}
size_t Array_size(struct Array *array){
return array ->used;
}
size_t Array_capacity(struct Array *array){
return Buffer_size( array->buffer)/array->data_size ;
}
void * Array_push_back(struct Array * array, void * data ){
struct Buffer *buffer = array -> buffer;
if ( array -> used >= Array_capacity( array ) ){
size_t cursize = Buffer_size(buffer);
size_t newsize = 0 ;
if ( cursize== 0 ){
newsize = 64*array -> data_size;
}else{
newsize = cursize *2;
}
Buffer_resize(buffer, newsize);
void *pos = Buffer_at(buffer, array->used * array->data_size );
memmove( pos, data, array->data_size );
array->used ++;
return pos;
}else{
void *pos = Buffer_at(buffer, array->used * array->data_size );
memmove( pos, data, array->data_size );
array->used ++;
return pos;
}
}