libcute 0.1
Loading...
Searching...
No Matches
vector.h
Go to the documentation of this file.
1
2#pragma once
3
4#include "macro.h"
5#include "memory/allocator.h"
6#include "object/optional.h"
7#include "object/result.h"
8#include "object/destructor.h"
9#include "utility.h"
10#include <stddef.h>
11
18typedef struct {
19 cu_Slice_Optional data;
20 size_t length;
21 size_t capacity;
24 cu_Destructor_Optional destructor;
25} cu_Vector;
26
37
40
41
42cu_Vector_Result cu_Vector_create(
43 cu_Allocator allocator, cu_Layout layout, Size_Optional initial_capacity,
44 cu_Destructor_Optional destructor);
52cu_Vector_Error_Optional cu_Vector_resize(cu_Vector *vector, size_t size);
54void cu_Vector_destroy(cu_Vector *vector);
55
57static inline size_t cu_Vector_size(const cu_Vector *vector) {
58 CU_IF_NULL(vector) { return 0; }
59 return vector->length;
60}
62static inline size_t cu_Vector_capacity(const cu_Vector *vector) {
63 CU_IF_NULL(vector) { return 0; }
64 return vector->capacity;
65}
66
67static inline cu_Slice_Optional cu_Vector_data(const cu_Vector *vector) {
68 CU_IF_NULL(vector) { return cu_Slice_Optional_none(); }
69 return vector->data;
70}
71
73cu_Vector_Error_Optional cu_Vector_push_back(cu_Vector *vector, void *elem);
75cu_Vector_Error_Optional cu_Vector_pop_back(cu_Vector *vector, void *out_elem);
76
78cu_Vector_Error_Optional cu_Vector_push_front(cu_Vector *vector, void *elem);
80cu_Vector_Error_Optional cu_Vector_pop_front(cu_Vector *vector, void *out_elem);
81
83cu_Vector_Result cu_Vector_copy(const cu_Vector *src);
84
85static inline bool cu_Vector_is_empty(const cu_Vector *vector) {
86 CU_IF_NULL(vector) { return true; }
87 return vector->length == 0;
88}
89
91cu_Vector_Error_Optional cu_Vector_reserve(cu_Vector *vector, size_t capacity);
93cu_Vector_Error_Optional cu_Vector_shrink_to_fit(cu_Vector *vector);
95void cu_Vector_clear(cu_Vector *vector);
96
102Ptr_Optional cu_Vector_at(const cu_Vector *vector, size_t index);
103
112bool cu_Vector_iter(const cu_Vector *vector, size_t *index, void **out_elem);
113
115cu_Slice_Optional cu_Vector_slice(const cu_Vector *vector);
116
118cu_Slice_Optional cu_Vector_subslice(const cu_Vector *vector, size_t index,
119 size_t count);
#define CU_IF_NULL(expr)
Definition macro.h:6
#define CU_OPTIONAL_DECL(NAME, T)
Definition optional.h:25
#define CU_RESULT_DECL(NAME, T, E)
Definition result.h:23
Definition allocator.h:24
Definition utility.h:22
Growable array of elements.
Definition vector.h:18
cu_Allocator allocator
Definition vector.h:23
cu_Destructor_Optional destructor
Definition vector.h:24
cu_Slice_Optional data
Definition vector.h:19
cu_Layout layout
Definition vector.h:22
size_t capacity
Definition vector.h:21
size_t length
Definition vector.h:20
cu_Vector_Error
Error codes returned by vector operations.
Definition vector.h:30
@ CU_VECTOR_ERROR_NONE
Definition vector.h:31
@ CU_VECTOR_ERROR_INVALID
Definition vector.h:34
@ CU_VECTOR_ERROR_OOM
Definition vector.h:32
@ CU_VECTOR_ERROR_INVALID_LAYOUT
Definition vector.h:33
@ CU_VECTOR_ERROR_OOB
Definition vector.h:35
void cu_Vector_destroy(cu_Vector *vector)
Definition vector.c:130
cu_Vector_Error_Optional cu_Vector_pop_back(cu_Vector *vector, void *out_elem)
Definition vector.c:177
cu_Vector_Error_Optional cu_Vector_pop_front(cu_Vector *vector, void *out_elem)
Definition vector.c:236
cu_Vector_Error_Optional cu_Vector_push_back(cu_Vector *vector, void *elem)
Definition vector.c:147
void cu_Vector_clear(cu_Vector *vector)
Definition vector.c:322
cu_Vector_Error_Optional cu_Vector_push_front(cu_Vector *vector, void *elem)
Definition vector.c:203
cu_Vector_Result cu_Vector_copy(const cu_Vector *src)
Definition vector.c:267
cu_Vector_Error_Optional cu_Vector_reserve(cu_Vector *vector, size_t capacity)
Definition vector.c:290
cu_Vector_Result cu_Vector_create(cu_Allocator allocator, cu_Layout layout, Size_Optional initial_capacity, cu_Destructor_Optional destructor)
Definition vector.c:19
bool cu_Vector_iter(const cu_Vector *vector, size_t *index, void **out_elem)
Iterate over the vector elements.
Definition vector.c:346
cu_Slice_Optional cu_Vector_subslice(const cu_Vector *vector, size_t index, size_t count)
Definition vector.c:372
Ptr_Optional cu_Vector_at(const cu_Vector *vector, size_t index)
Return a pointer to the element at index.
Definition vector.c:336
cu_Slice_Optional cu_Vector_slice(const cu_Vector *vector)
Definition vector.c:363
cu_Vector_Error_Optional cu_Vector_resize(cu_Vector *vector, size_t size)
Change the number of stored elements.
Definition vector.c:105
cu_Vector_Error_Optional cu_Vector_shrink_to_fit(cu_Vector *vector)
Definition vector.c:300