Select Git revision
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;
}