LF OS
Hobby operating system for amd64 with high ambitions
Loading...
Searching...
No Matches
flexarray.c
Go to the documentation of this file.
1#include <flexarray.h>
2#include <string.h>
3
4struct flexarray {
5 size_t member_size;
6 size_t count;
7 size_t alloc;
8
10
11 void* data;
12};
13
14flexarray_t new_flexarray(size_t member_size, size_t initial_alloc, allocator_t* alloc) {
15 if(!initial_alloc) {
16 initial_alloc = 8;
17 }
18
19 flexarray_t res = (flexarray_t)alloc->alloc(alloc, sizeof(struct flexarray));
20 res->member_size = member_size;
21 res->alloc = initial_alloc;
22 res->count = 0;
23 res->allocator = alloc;
24 res->data = alloc->alloc(alloc, initial_alloc * member_size);
25
26 return res;
27}
28
30 array->allocator->dealloc(array->allocator, array);
31}
32
33static void flexarray_grow(flexarray_t array, size_t copy_offset) {
34 size_t grow = array->alloc >> 4;
35
36 if(!grow) {
37 grow = 1;
38 }
39
40 size_t old_size = array->alloc * array->member_size;
41 size_t new_alloc = array->alloc + grow;
42 size_t new_size = new_alloc * array->member_size;
43
44 void* new_data = array->allocator->alloc(array->allocator, new_size);
45 memcpy(new_data, (uint8_t*)array->data + (copy_offset * array->member_size), old_size);
46 array->allocator->dealloc(array->allocator, array->data);
47
48 array->data = new_data;
49 array->alloc = new_alloc;
50}
51
52static void* flexarray_data(flexarray_t array, uint64_t idx) {
53 return (uint8_t*)array->data + (idx * array->member_size);
54}
55
57 if(array->count >= array->alloc) {
58 flexarray_grow(array, 0);
59 }
60
61 memcpy(flexarray_data(array, array->count), data, array->member_size);
62 ++array->count;
63
64 return array->count - 1;
65}
66
67void flexarray_prepend(flexarray_t array, void* data) {
68 if(array->count >= array->alloc) {
69 flexarray_grow(array, 1);
70 }
71 else {
72 memmove(flexarray_data(array, 1), array->data, array->count * array->member_size);
73 }
74
75 memcpy(flexarray_data(array, 0), data, array->member_size);
76}
77
79 if(idx >= array->count) {
80 return;
81 }
82
83 --array->count;
84
85 if(idx >= array->count) {
86 return;
87 }
88
89 memmove(flexarray_data(array, idx + 1), flexarray_data(array, idx), (array->count - idx) * array->member_size);
90}
91
93 for(uint64_t i = 0; i < array->count; ++i) {
94 if(memcmp(flexarray_data(array, i), data, array->member_size) == 0) {
95 return i;
96 }
97 }
98
99 return -1;
100}
101
103 return array->count;
104}
105
107 return array->member_size;
108}
109
110void flexarray_get(flexarray_t array, void* buffer, uint64_t idx) {
111 if(idx >= array->count) {
112 return;
113 }
114
115 memcpy(buffer, flexarray_data(array, idx), array->member_size);
116}
117
118void flexarray_set(flexarray_t array, void* buffer, uint64_t idx) {
119 if(idx >= array->count) {
120 return;
121 }
122
123 memcpy(flexarray_data(array, idx), buffer, array->member_size);
124}
125
126const void* flexarray_getall(flexarray_t array) {
127 return flexarray_data(array, 0);
128}
unsigned long uint64_t
Definition arch.h:14
unsigned char uint8_t
Definition arch.h:5
const void * flexarray_getall(flexarray_t array)
Definition flexarray.c:126
void flexarray_prepend(flexarray_t array, void *data)
Definition flexarray.c:67
flexarray_t new_flexarray(size_t member_size, size_t initial_alloc, allocator_t *alloc)
Definition flexarray.c:14
void flexarray_remove(flexarray_t array, uint64_t idx)
Definition flexarray.c:78
static void flexarray_grow(flexarray_t array, size_t copy_offset)
Definition flexarray.c:33
void delete_flexarray(flexarray_t array)
Definition flexarray.c:29
void flexarray_set(flexarray_t array, void *buffer, uint64_t idx)
Definition flexarray.c:118
static void * flexarray_data(flexarray_t array, uint64_t idx)
Definition flexarray.c:52
void * data
Definition flexarray.c:11
uint64_t flexarray_find(flexarray_t array, void *data)
Will return -1 when not found.
Definition flexarray.c:92
size_t count
Definition flexarray.c:6
allocator_t * allocator
Definition flexarray.c:9
uint64_t flexarray_append(flexarray_t array, void *data)
Definition flexarray.c:56
size_t member_size
Definition flexarray.c:5
void flexarray_get(flexarray_t array, void *buffer, uint64_t idx)
Definition flexarray.c:110
size_t flexarray_member_size(flexarray_t array)
Definition flexarray.c:106
size_t alloc
Definition flexarray.c:7
size_t flexarray_length(flexarray_t array)
Definition flexarray.c:102
struct flexarray * flexarray_t
Definition flexarray.h:8
void * memcpy(void *dest, void const *source, size_t size)
Definition string.c:80
int memcmp(const void *s1, const void *s2, size_t size)
Definition string.c:91
void * memmove(void *dest, const void *source, size_t size)
Definition string.c:106
allocator_t * alloc
void(* dealloc)(struct allocator *alloc, void *mem)
Definition allocator.h:10
void *(* alloc)(struct allocator *alloc, size_t size)
Definition allocator.h:9