1/*
2 * Copyright (C) 2020-2022 The opuntiaOS Project Authors.
3 * + Contributed by Nikita Melekhin <nimelehin@gmail.com>
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef _KERNEL_ALGO_DYNAMIC_ARRAY_H
10#define _KERNEL_ALGO_DYNAMIC_ARRAY_H
11
12#include <libkern/types.h>
13
14// TODO: Speed up bucket search using binary jumps.
15struct dynamic_array_bucket {
16 void* data;
17 struct dynamic_array_bucket* next;
18 size_t capacity;
19 size_t size;
20};
21typedef struct dynamic_array_bucket dynamic_array_bucket_t;
22
23struct dynamic_array {
24 dynamic_array_bucket_t* head;
25 dynamic_array_bucket_t* tail;
26 size_t size; /* number of elements in vector */
27 size_t element_size; /* size of elements in bytes */
28};
29typedef struct dynamic_array dynamic_array_t;
30
31#define dynarr_init(type, v) dynarr_init_of_size_impl(v, sizeof(type), 8)
32#define dynarr_init_of_size(type, v, cap) dynarr_init_of_size_impl(v, sizeof(type), cap)
33
34int dynarr_init_of_size_impl(dynamic_array_t* v, size_t element_size, size_t capacity);
35int dynarr_free(dynamic_array_t* v);
36
37void* dynarr_get(dynamic_array_t* v, int index);
38void* dynarr_push(dynamic_array_t* v, void* element);
39int dynarr_pop(dynamic_array_t* v);
40int dynarr_clear(dynamic_array_t* v);
41
42#endif // _KERNEL_ALGO_DYNAMIC_ARRAY_H