first commit, vector implemented

AuthorKonata <konata@posteo.jp>
Date
Commita20ef80489e083da51f52ffc6dc5949781db157e
5 files changed, 213 insertions(+)
▾A.gitignore
@@ -0,0 +1,52 @@
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
▾AMakefile
@@ -0,0 +1,3 @@
all:
gcc -Og -g -march=native -shared -fPIC -fstrict-aliasing vector.c -o cutils.so -flto \
-Wall -Werror -Wpedantic -Wnull-dereference -Wshadow -Wconversion -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wstrict-overflow=5 -Wunreachable-code -Wno-unused-parameter
▾Acutils.h
@@ -0,0 +1,4 @@
#ifndef CUTILS_H
#define CUTILS_H
#include <vector.h>
#endif //CUTILS_H
▾Avector.c
@@ -0,0 +1,121 @@
#include "vector.h"
Vector* new_vector(void)
{
Vector* vector = malloc(sizeof(*vector));
if(!vector)
return NULL;
vector->items = malloc(sizeof(*vector->items)*VECTOR_DEFAULT_SIZE);
if(!vector->items)
{
free(vector);
return NULL;
}
vector->length = 0;
vector->capacity = 4;
return vector;
}
void* vector_at(const Vector* vector, size_t index)
{
if(index >= vector->length)
return NULL;
else
return vector->items[index];
}
void* vector_pop(Vector* vector, size_t index)
{
if(index >= vector->length)
return NULL;
else
{
void* tmp = vector->items[index];
memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
vector->length--;
return tmp;
}
}
void vector_remove(Vector* vector, size_t index)
{
if(index < vector->length)
{
free(vector->items[index]);
memmove(vector->items+index, vector->items+index+1, (vector->length-index-1)*sizeof(*vector->items));
vector->length--;
}
}
bool vector_push(Vector* vector, void* item)
{
if(!vector_adjust_size(vector, ++vector->length))
return false;
vector->items[vector->length-1] = item;
return true;
}
FindReturn vector_find(const Vector* haystack, const void* needle, bool (*cmp)(const void*, const void*))
{
FindReturn ret;
for(size_t i = 0; i < haystack->length; i++)
{
if(cmp)
{
if(cmp(haystack->items[i],needle))
{
ret.found = true;
ret.index = i;
return ret;
}
} else {
if(haystack->items[i] == needle)
{
ret.found = true;
ret.index = i;
return ret;
}
}
}
ret.found = false;
return ret;
}
bool vector_insert(Vector* vector, size_t index, void* item)
{
if(!vector_adjust_size(vector, ++vector->length))
return false;
memmove(vector->items+index+1, vector->items+index, (vector->length-index)*sizeof(*vector->items));
vector->items[index] = item;
vector->length++;
return true;
}
bool vector_adjust_size(Vector* vector, size_t size)
{
while(vector->capacity < size)
{
void** tmp = vector->items;
vector->items = realloc(vector->items, vector->capacity*2*(sizeof(*vector->items)));
if(!vector->items)
{
vector->items = tmp;
return false;
}
vector->capacity *= 2;
}
while(vector->capacity > (size*2))
{
void** tmp = vector->items;
vector->items = realloc(vector->items, vector->capacity/2*(sizeof(*vector->items)));
if(!vector->items)
{
vector->items = tmp;
return false;
}
vector->capacity /= 2;
}
return true;
}
▾Avector.h
@@ -0,0 +1,33 @@
#ifndef VECTOR_H
#define VECTOR_H
#define VECTOR_DEFAULT_SIZE 4
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdbool.h>
typedef struct Vector
{
void** items;
size_t capacity;
size_t length;
} Vector;
typedef struct FindReturn
{
bool found;
size_t index; //if found is false, this contains rubbish
} FindReturn;
Vector* new_vector(void);
void* vector_at(const Vector* vector, size_t index);
void* vector_pop(Vector* vector, size_t index);
bool vector_push(Vector* vector, void* item);
void vector_remove(Vector* vector, size_t index);
bool vector_adjust_size(Vector* vector, size_t size);
FindReturn vector_find(const Vector* haystack, const void* needle, bool (*cmp)(const void*, const void*));
bool vector_insert(Vector* vector, size_t index, void* item);
#endif //VECTOR_H