Skip to content
Snippets Groups Projects
Select Git revision
  • 71e7f697e2faa5fff085be27522c839abe671638
  • master default protected
2 results

vectors.c

Blame
  • vectors.c 2.96 KiB
    /*
    	Autheur		: Abivarman KANDIAH
    	Date		: 22/02/2022
    	Fichier		: vectors.c
    	Descritpion : 
    */
    
    #include "../header/vectors.h"
    
    struct vector_ {
        type *content; // actual content of the vector
        int capacity; // capacity allocated
        int length; // actual length
    };
    
    vector vector_create()
    {
    	vector vec = malloc(sizeof(*vec)); //!BUG POSSIBLE
    
    	assert(vec != NULL);
    
    	vec->content = malloc(sizeof(type) * VECTOR_INIT_CAPACITY);
    	assert(vec->content != NULL);
    
    	vec->capacity = VECTOR_INIT_CAPACITY;
    	vec->length = 0;
    
    	return vec;
    }
    
    int vector_length(vector vec)
    {
    	return vec->length;
    }
    
    void vector_push(vector vec, type element)
    {
    	if(vec->length >= vec->capacity)
    	{
    		vec->content = realloc(vec->content, sizeof(type) * vec->capacity * 2);
    		assert(vec->content != NULL);
    
    		vec->capacity = vec->capacity * 2;
    	}
    
    	vec->content[vec->length] = element;
    	vec->length++;
    }
    
    type vector_pop(vector vec)
    {	
    	assert(vec->length > 0);
    
    	vec->length--;
    	type tmp = vec->content[vec->length];
    
    	if(vec->length < (vec->capacity / 4))
    	{
    		vec->content = realloc(vec->content, sizeof(type) * (vec->capacity / 2));
    		assert(vec->content != NULL);
    
    		vec->capacity = vec->capacity / 2;
    	} 
    
    	return tmp;
    }
    
    void vector_set(vector vec, int index, type element)
    {
    	assert(index < vec->length);
    
    	vec->content[index] = element;
    }
    
    type vector_get(vector vec, int index)
    {
    	assert(index < vec->length);
    
    	return vec->content[index];
    }
    
    type vector_remove(vector vec, int index)
    {
    	assert(index < vec->length);
    
    	type tmp = vec->content[index];
    
    	vec->length--;
    
    	for (int i = index; i < vec->length; i++) // Ex : 0 1 2 {3} 4 5  // Index 3 , lenght 6
    	{
    		vec->content[i] = vec->content[i+1]; 
    	}
    
    	return tmp;
    }
    
    void vector_insert(vector vec, type element, int index)
    {
    	assert(index < vec->length);
    
    	vec->length++;
    
    	for (int i = vec->length; i > index; i--) // Ex : 0 1 2 {3} 4 5  // Index 3 , lenght 6
    	{
    		vec->content[i] = vec->content[i-1]; 
    	}
    
    	vec->content[index] = element;
    }
    
    void vector_empty(vector vec)
    {
    	for (int i = 0; i < vec->length; i++)
    	{
    		vec->content[i] = 0;
    	}
    
    	vec->capacity = VECTOR_INIT_CAPACITY;
    	vec->length = 0;
    
    	vec->content = realloc(vec->content, sizeof(type) * vec->capacity);
    	assert(vec->content != NULL);
    }
    
    void vector_free(vector vec)
    {
    	free(vec->content);
    	free(vec);
    }
    
    void vector_print(vector vec, void (*print)(type))
    {
    	for (int i = 0; i < vec->length; i++)
    	{
    		print(vec->content[i]);
    	}
    }
    
    vector vector_map(vector vec, type (*f)(type))
    {
    	vector new_vec = vector_create();
    	for (int i = 0; i < vec->length; i++)
    	{
    		vector_push(new_vec, f(vec->content[i]));
    	}
    	return new_vec;
    }
    
    vector vector_filter(vector vec, bool (*f)(type))
    {
    	vector new_vec = vector_create();
    	for (int i = 0; i < vec->length; i++)
    	{
    		if(f(vec->content[i]))
    		{
    			vector_push(new_vec, vec->content[i]);
    		}
    	}
    	return new_vec;
    }
    
    type vector_reduce(vector vec, type neutral, type (*f)(type, type))
    {
    	for (int i = 0; i < vec->length; i++)
    	{
    		neutral = f(neutral, vec->content[i]);
    	}
    	return neutral;
    }