Cthulhu  0.2.10
Cthulhu compiler collection
vector.h
Go to the documentation of this file.
1 // SPDX-License-Identifier: LGPL-3.0-only
2 
3 #pragma once
4 
5 #include <ctu_std_api.h>
6 
7 #include "core/analyze.h"
8 #include "core/compiler.h"
9 
10 #include <stddef.h>
11 
12 typedef struct arena_t arena_t;
13 
15 
20 
23 typedef struct typevec_t
24 {
26 
28  size_t size;
29 
31  size_t used;
32 
34  size_t width;
35 
37  STA_FIELD_SIZE(size) void *data;
38 } typevec_t;
39 
40 CT_STD_API extern const typevec_t kEmptyTypevec;
41 
48 CT_STD_API void typevec_init(IN_NOTNULL typevec_t *vec, size_t width, size_t len, IN_NOTNULL arena_t *arena);
49 
57 CT_STD_API typevec_t typevec_make(size_t width, size_t len, IN_NOTNULL arena_t *arena);
58 
67 CT_STD_API typevec_t *typevec_new(IN_DOMAIN(>, 0) size_t width, size_t len, IN_NOTNULL arena_t *arena);
68 
79 CT_STD_API typevec_t *typevec_of(IN_DOMAIN(>, 0) size_t width, size_t len, IN_NOTNULL arena_t *arena);
80 
92  IN_DOMAIN(>, 0) size_t width,
93  STA_READS(count * width) const void *src,
94  size_t count,
95  IN_NOTNULL arena_t *arena);
96 
106 CT_STD_API typevec_t *typevec_slice(
107  IN_NOTNULL const typevec_t *vec,
108  IN_DOMAIN(<, end) size_t start,
109  IN_DOMAIN(>, start) size_t end);
110 
116 CT_STD_API size_t typevec_len(IN_NOTNULL const typevec_t *vec);
117 
126 CT_STD_API void typevec_set(IN_NOTNULL typevec_t *vec, size_t index, IN_NOTNULL const void *src);
127 
136 CT_STD_API void typevec_get(IN_NOTNULL const typevec_t *vec, size_t index, STA_WRITES(vec->width) void *dst);
137 
142 CT_STD_API void typevec_tail(IN_NOTNULL const typevec_t *vec, IN_NOTNULL void *dst);
143 
148 CT_STD_API void *typevec_push(IN_NOTNULL typevec_t *vec, IN_NOTNULL const void *src);
149 
156 CT_STD_API void typevec_append(IN_NOTNULL typevec_t *vec, IN_NOTNULL const void *src, size_t len);
157 
162 CT_STD_API void typevec_pop(IN_NOTNULL typevec_t *vec, IN_NOTNULL void *dst);
163 
172 CT_STD_API void *typevec_offset(IN_NOTNULL const typevec_t *vec, size_t index);
173 
181 CT_STD_API void *typevec_data(IN_NOTNULL const typevec_t *vec);
182 
187 CT_STD_API void typevec_sort(IN_NOTNULL typevec_t *vec, int (*cmp)(const void *, const void *));
188 
194 CT_STD_API void typevec_reset(IN_NOTNULL typevec_t *vec);
195 
197 
CT_NODISCARD STA_WRITES(size) void *dst
#define CT_PUREFN
mark a function as pure, always returns the same value for the same arguments
Definition: analyze.h:228
#define CT_NODISCARD
mark a function as returning a value that must be used
#define IN_NOTNULL
annotate a parameter as not being null
#define STA_READS(size)
annotate a parameter as reading expr elements
#define IN_DOMAIN(cmp, it)
annotate a parameter as being bounded by the expression of cmp and it
#define CT_BEGIN_API
Definition: compiler.h:129
#define CT_END_API
Definition: compiler.h:130
CT_STD_API void typevec_set(typevec_t *vec, size_t index, const void *src)
set an element in the vector
Definition: vector.c:128
CT_STD_API void typevec_pop(typevec_t *vec, void *dst)
pop a value from the vector
Definition: vector.c:182
CT_STD_API void typevec_sort(typevec_t *vec, int(*cmp)(const void *, const void *))
sort a vector
Definition: vector.c:206
CT_NODISCARD CT_STD_API typevec_t * typevec_of(size_t width, size_t len, arena_t *arena)
create a new typed vector with an initial size and length
Definition: vector.c:83
CT_STD_API typevec_t typevec_make(size_t width, size_t len, arena_t *arena)
create a new typed vector on the stack
Definition: vector.c:69
CT_STD_API void typevec_init(typevec_t *vec, size_t width, size_t len, arena_t *arena)
initialize a typed vector
Definition: vector.c:53
CT_NODISCARD CT_STD_API typevec_t * typevec_of_array(size_t width, STA_READS(count *width) const void *src, size_t count, arena_t *arena)
create a new typed vector from an array this copies count * width bytes from src to the vector
CT_STD_API void typevec_tail(const typevec_t *vec, void *dst)
get the last element from the vector
Definition: vector.c:148
CT_STD_API const typevec_t kEmptyTypevec
Definition: vector.c:13
CT_STD_API void * typevec_push(typevec_t *vec, const void *src)
push a value onto the vector
Definition: vector.c:156
CT_STD_API void typevec_reset(typevec_t *vec)
reset a vector
Definition: vector.c:217
CT_NODISCARD CT_PUREFN CT_STD_API size_t typevec_len(const typevec_t *vec)
get the length of a vector
Definition: vector.c:120
CT_NODISCARD CT_PUREFN CT_STD_API void * typevec_data(const typevec_t *vec)
get a pointer to the underlying data
Definition: vector.c:199
CT_NODISCARD CT_STD_API typevec_t * typevec_slice(const typevec_t *vec, size_t start, size_t end)
create a new typevec from an existing typevec
Definition: vector.c:104
CT_STD_API void typevec_get(const typevec_t *vec, size_t index, STA_WRITES(vec->width) void *dst)
get an element from the vector
CT_STD_API void typevec_append(typevec_t *vec, const void *src, size_t len)
append multiple values onto the vector
Definition: vector.c:169
CT_NODISCARD CT_STD_API typevec_t * typevec_new(size_t width, size_t len, arena_t *arena)
create a new typed vector on the heap
Definition: vector.c:77
CT_NODISCARD CT_PUREFN CT_STD_API void * typevec_offset(const typevec_t *vec, size_t index)
get a pointer to the value at the given index
Definition: vector.c:191
an allocator object
Definition: arena.h:86
A vector with a fixed type size.
Definition: vector.h:24
size_t used
The number of elements used.
Definition: vector.h:31
STA_FIELD_SIZE(size) void *data
The data of the vector.
size_t width
The size of each element.
Definition: vector.h:34
arena_t * arena
Definition: vector.h:25
size_t size
The number of elements allocated.
Definition: vector.h:28