Zycore 1.5.1.0
Loading...
Searching...
No Matches
Vector.h
Go to the documentation of this file.
1/***************************************************************************************************
2
3 Zyan Core Library (Zycore-C)
4
5 Original Author : Florian Bernd
6
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in all
15 * copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24
25***************************************************************************************************/
26
32#ifndef ZYCORE_VECTOR_H
33#define ZYCORE_VECTOR_H
34
35#include <Zycore/Allocator.h>
36#include <Zycore/Comparison.h>
37#include <Zycore/Object.h>
38#include <Zycore/Status.h>
39#include <Zycore/Types.h>
40
41#ifdef __cplusplus
42extern "C" {
43#endif
44
45/* ============================================================================================== */
46/* Constants */
47/* ============================================================================================== */
48
53#define ZYAN_VECTOR_MIN_CAPACITY 1
54
58#define ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR 2
59
63#define ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD 4
64
65/* ============================================================================================== */
66/* Enums and types */
67/* ============================================================================================== */
68
110
111/* ============================================================================================== */
112/* Macros */
113/* ============================================================================================== */
114
115/* ---------------------------------------------------------------------------------------------- */
116/* General */
117/* ---------------------------------------------------------------------------------------------- */
118
122#define ZYAN_VECTOR_INITIALIZER \
123 { \
124 /* allocator */ ZYAN_NULL, \
125 /* growth_factor */ 0, \
126 /* shrink_threshold */ 0, \
127 /* size */ 0, \
128 /* capacity */ 0, \
129 /* element_size */ 0, \
130 /* destructor */ ZYAN_NULL, \
131 /* data */ ZYAN_NULL \
132 }
133
134/* ---------------------------------------------------------------------------------------------- */
135/* Helper macros */
136/* ---------------------------------------------------------------------------------------------- */
137
149#ifdef __cplusplus
150#define ZYAN_VECTOR_GET(type, vector, index) \
151 (*reinterpret_cast<const type*>(ZyanVectorGet(vector, index)))
152#else
153#define ZYAN_VECTOR_GET(type, vector, index) \
154 (*(const type*)ZyanVectorGet(vector, index))
155#endif
156
165#define ZYAN_VECTOR_FOREACH(type, vector, item_name, body) \
166 { \
167 const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \
168 for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \
169 ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \
170 ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \
171 ++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \
172 { \
173 const type item_name = ZYAN_VECTOR_GET(type, vector, \
174 ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \
175 body \
176 } \
177 }
178
187#define ZYAN_VECTOR_FOREACH_MUTABLE(type, vector, item_name, body) \
188 { \
189 const ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \
190 for (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \
191 ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \
192 ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \
193 ++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \
194 { \
195 type* const item_name = ZyanVectorGetMutable(vector, \
196 ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \
197 body \
198 } \
199 }
200
201/* ---------------------------------------------------------------------------------------------- */
202
203/* ============================================================================================== */
204/* Exported functions */
205/* ============================================================================================== */
206
207/* ---------------------------------------------------------------------------------------------- */
208/* Constructor and destructor */
209/* ---------------------------------------------------------------------------------------------- */
210
211#ifndef ZYAN_NO_LIBC
212
230 ZyanUSize element_size, ZyanUSize capacity, ZyanMemberProcedure destructor);
231
232#endif // ZYAN_NO_LIBC
233
254ZYCORE_EXPORT ZyanStatus ZyanVectorInitEx(ZyanVector* vector, ZyanUSize element_size,
255 ZyanUSize capacity, ZyanMemberProcedure destructor, ZyanAllocator* allocator,
256 ZyanU8 growth_factor, ZyanU8 shrink_threshold);
257
274 void* buffer, ZyanUSize capacity, ZyanMemberProcedure destructor);
275
284
285/* ---------------------------------------------------------------------------------------------- */
286/* Duplication */
287/* ---------------------------------------------------------------------------------------------- */
288
289#ifndef ZYAN_NO_LIBC
290
309 const ZyanVector* source, ZyanUSize capacity);
310
311#endif // ZYAN_NO_LIBC
312
335 ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold);
336
354 const ZyanVector* source, void* buffer, ZyanUSize capacity);
355
356/* ---------------------------------------------------------------------------------------------- */
357/* Element access */
358/* ---------------------------------------------------------------------------------------------- */
359
375ZYCORE_EXPORT const void* ZyanVectorGet(const ZyanVector* vector, ZyanUSize index);
376
392ZYCORE_EXPORT void* ZyanVectorGetMutable(const ZyanVector* vector, ZyanUSize index);
393
407 const void** value);
408
422 void** value);
423
434 const void* value);
435
436/* ---------------------------------------------------------------------------------------------- */
437/* Insertion */
438/* ---------------------------------------------------------------------------------------------- */
439
449
460 const void* element);
461
473 const void* elements, ZyanUSize count);
474
486 ZyanMemberFunction constructor);
487
500 void** element, ZyanMemberFunction constructor);
501
502/* ---------------------------------------------------------------------------------------------- */
503/* Utils */
504/* ---------------------------------------------------------------------------------------------- */
505
519 ZyanUSize index_second);
520
521/* ---------------------------------------------------------------------------------------------- */
522/* Deletion */
523/* ---------------------------------------------------------------------------------------------- */
524
534
545 ZyanUSize count);
546
555
564
565/* ---------------------------------------------------------------------------------------------- */
566/* Searching */
567/* ---------------------------------------------------------------------------------------------- */
568
582ZYCORE_EXPORT ZyanStatus ZyanVectorFind(const ZyanVector* vector, const void* element,
583 ZyanISize* found_index, ZyanEqualityComparison comparison);
584
600ZYCORE_EXPORT ZyanStatus ZyanVectorFindEx(const ZyanVector* vector, const void* element,
601 ZyanISize* found_index, ZyanEqualityComparison comparison, ZyanUSize index, ZyanUSize count);
602
621 ZyanUSize* found_index, ZyanComparison comparison);
622
643 ZyanUSize* found_index, ZyanComparison comparison, ZyanUSize index, ZyanUSize count);
644
645/* ---------------------------------------------------------------------------------------------- */
646/* Memory management */
647/* ---------------------------------------------------------------------------------------------- */
648
658
669 const void* initializer);
670
680
689
690/* ---------------------------------------------------------------------------------------------- */
691/* Information */
692/* ---------------------------------------------------------------------------------------------- */
693
702ZYCORE_EXPORT ZyanStatus ZyanVectorGetCapacity(const ZyanVector* vector, ZyanUSize* capacity);
703
712ZYCORE_EXPORT ZyanStatus ZyanVectorGetSize(const ZyanVector* vector, ZyanUSize* size);
713
714/* ---------------------------------------------------------------------------------------------- */
715
716/* ============================================================================================== */
717
718#ifdef __cplusplus
719}
720#endif
721
722#endif /* ZYCORE_VECTOR_H */
ZyanI32(* ZyanComparison)(const void *left, const void *right)
Definition Comparison.h:68
ZyanBool(* ZyanEqualityComparison)(const void *left, const void *right)
Definition Comparison.h:55
#define ZYAN_REQUIRES_LIBC
Definition Defines.h:366
#define ZYCORE_EXPORT
Definition Defines.h:235
void(* ZyanMemberProcedure)(void *object)
Definition Object.h:51
ZyanStatus(* ZyanMemberFunction)(void *object)
Definition Object.h:67
ZyanU32 ZyanStatus
Definition Status.h:48
ZYCORE_EXPORT ZyanStatus ZyanVectorDeleteRange(ZyanVector *vector, ZyanUSize index, ZyanUSize count)
ZYCORE_EXPORT ZyanStatus ZyanVectorEmplace(ZyanVector *vector, void **element, ZyanMemberFunction constructor)
ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateEx(ZyanVector *destination, const ZyanVector *source, ZyanUSize capacity, ZyanAllocator *allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold)
ZYCORE_EXPORT ZyanStatus ZyanVectorInitEx(ZyanVector *vector, ZyanUSize element_size, ZyanUSize capacity, ZyanMemberProcedure destructor, ZyanAllocator *allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold)
ZYCORE_EXPORT ZyanStatus ZyanVectorSwapElements(ZyanVector *vector, ZyanUSize index_first, ZyanUSize index_second)
ZYCORE_EXPORT ZyanStatus ZyanVectorPopBack(ZyanVector *vector)
ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointerMutable(const ZyanVector *vector, ZyanUSize index, void **value)
ZYCORE_EXPORT const void * ZyanVectorGet(const ZyanVector *vector, ZyanUSize index)
ZYCORE_EXPORT ZyanStatus ZyanVectorInsertRange(ZyanVector *vector, ZyanUSize index, const void *elements, ZyanUSize count)
ZYCORE_EXPORT ZyanStatus ZyanVectorSet(ZyanVector *vector, ZyanUSize index, const void *value)
ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointer(const ZyanVector *vector, ZyanUSize index, const void **value)
ZYCORE_EXPORT ZyanStatus ZyanVectorFind(const ZyanVector *vector, const void *element, ZyanISize *found_index, ZyanEqualityComparison comparison)
ZYCORE_EXPORT ZyanStatus ZyanVectorGetCapacity(const ZyanVector *vector, ZyanUSize *capacity)
ZYCORE_EXPORT ZyanStatus ZyanVectorResize(ZyanVector *vector, ZyanUSize size)
ZYCORE_EXPORT void * ZyanVectorGetMutable(const ZyanVector *vector, ZyanUSize index)
ZYCORE_EXPORT ZyanStatus ZyanVectorPushBack(ZyanVector *vector, const void *element)
ZYCORE_EXPORT ZyanStatus ZyanVectorInitCustomBuffer(ZyanVector *vector, ZyanUSize element_size, void *buffer, ZyanUSize capacity, ZyanMemberProcedure destructor)
ZYCORE_EXPORT ZyanStatus ZyanVectorFindEx(const ZyanVector *vector, const void *element, ZyanISize *found_index, ZyanEqualityComparison comparison, ZyanUSize index, ZyanUSize count)
ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearch(const ZyanVector *vector, const void *element, ZyanUSize *found_index, ZyanComparison comparison)
ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearchEx(const ZyanVector *vector, const void *element, ZyanUSize *found_index, ZyanComparison comparison, ZyanUSize index, ZyanUSize count)
ZYCORE_EXPORT ZyanStatus ZyanVectorInsert(ZyanVector *vector, ZyanUSize index, const void *element)
ZYCORE_EXPORT ZyanStatus ZyanVectorDestroy(ZyanVector *vector)
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorDuplicate(ZyanVector *destination, const ZyanVector *source, ZyanUSize capacity)
ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorInit(ZyanVector *vector, ZyanUSize element_size, ZyanUSize capacity, ZyanMemberProcedure destructor)
ZYCORE_EXPORT ZyanStatus ZyanVectorEmplaceEx(ZyanVector *vector, ZyanUSize index, void **element, ZyanMemberFunction constructor)
ZYCORE_EXPORT ZyanStatus ZyanVectorReserve(ZyanVector *vector, ZyanUSize capacity)
ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateCustomBuffer(ZyanVector *destination, const ZyanVector *source, void *buffer, ZyanUSize capacity)
ZYCORE_EXPORT ZyanStatus ZyanVectorClear(ZyanVector *vector)
ZYCORE_EXPORT ZyanStatus ZyanVectorShrinkToFit(ZyanVector *vector)
struct ZyanVector_ ZyanVector
ZYCORE_EXPORT ZyanStatus ZyanVectorDelete(ZyanVector *vector, ZyanUSize index)
ZYCORE_EXPORT ZyanStatus ZyanVectorResizeEx(ZyanVector *vector, ZyanUSize size, const void *initializer)
ZYCORE_EXPORT ZyanStatus ZyanVectorGetSize(const ZyanVector *vector, ZyanUSize *size)
Definition Allocator.h:89
Definition Vector.h:76
ZyanUSize size
Definition Vector.h:92
ZyanU8 shrink_threshold
Definition Vector.h:88
ZyanUSize element_size
Definition Vector.h:100
ZyanUSize capacity
Definition Vector.h:96
void * data
Definition Vector.h:108
ZyanMemberProcedure destructor
Definition Vector.h:104
ZyanAllocator * allocator
Definition Vector.h:80
ZyanU8 growth_factor
Definition Vector.h:84