blob: e05175fed83f3178cfbc8c302d6334c3870384bb [file] [log] [blame]
Gavin Howard5715b042018-02-12 16:11:42 -07001/*
Gavin Howardb5904bf2018-02-20 13:28:18 -07002 * *****************************************************************************
Gavin Howard5715b042018-02-12 16:11:42 -07003 *
Gavin Howardb5904bf2018-02-20 13:28:18 -07004 * Copyright 2018 Gavin D. Howard
Gavin Howard5715b042018-02-12 16:11:42 -07005 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 *
Gavin Howardb5904bf2018-02-20 13:28:18 -070017 * *****************************************************************************
Gavin Howard5715b042018-02-12 16:11:42 -070018 *
19 * Definitions for bc vectors (resizable arrays).
20 *
21 */
22
Gavin Howard26a5aeb2018-02-05 14:33:40 -070023#ifndef BC_VECTOR_H
24#define BC_VECTOR_H
Gavin Howard8a596d42018-01-15 15:46:01 -070025
26#include <stdlib.h>
27#include <stdint.h>
28
Gavin Howard3ba6c8d2018-02-15 12:23:35 -070029#include <bc.h>
Gavin Howard8a596d42018-01-15 15:46:01 -070030
Gavin Howard26a5aeb2018-02-05 14:33:40 -070031#define BC_VEC_INITIAL_CAP (32)
Gavin Howard8a596d42018-01-15 15:46:01 -070032
Gavin Howardd96bcae2018-02-07 19:16:19 -070033typedef int (*BcVecCmpFunc)(void*, void*);
34
Gavin Howard26a5aeb2018-02-05 14:33:40 -070035typedef struct BcVec {
Gavin Howard8a596d42018-01-15 15:46:01 -070036
Gavin Howard26a5aeb2018-02-05 14:33:40 -070037 uint8_t* array;
Gavin Howard5a8949e2018-02-05 16:46:06 -070038 size_t len;
39 size_t cap;
Gavin Howard26a5aeb2018-02-05 14:33:40 -070040 size_t size;
Gavin Howard8a596d42018-01-15 15:46:01 -070041
Gavin Howard5a8949e2018-02-05 16:46:06 -070042 BcFreeFunc dtor;
Gavin Howard4dc42662018-01-17 15:17:47 -070043
Gavin Howard26a5aeb2018-02-05 14:33:40 -070044} BcVec;
Gavin Howard8a596d42018-01-15 15:46:01 -070045
Gavin Howard5a8949e2018-02-05 16:46:06 -070046BcStatus bc_vec_init(BcVec* vec, size_t esize, BcFreeFunc dtor);
Gavin Howard8a596d42018-01-15 15:46:01 -070047
Gavin Howard5a8949e2018-02-05 16:46:06 -070048BcStatus bc_vec_push(BcVec* vec, void* data);
Gavin Howard8a596d42018-01-15 15:46:01 -070049
Gavin Howard5a8949e2018-02-05 16:46:06 -070050BcStatus bc_vec_pushByte(BcVec* vec, uint8_t data);
Gavin Howard8a596d42018-01-15 15:46:01 -070051
Gavin Howard5a8949e2018-02-05 16:46:06 -070052BcStatus bc_vec_pushAt(BcVec* vec, void* data, size_t idx);
Gavin Howard8a596d42018-01-15 15:46:01 -070053
Gavin Howard5a8949e2018-02-05 16:46:06 -070054void* bc_vec_top(BcVec* vec);
Gavin Howard8a596d42018-01-15 15:46:01 -070055
Gavin Howard5a8949e2018-02-05 16:46:06 -070056void* bc_vec_item(BcVec* vec, size_t idx);
Gavin Howard8a596d42018-01-15 15:46:01 -070057
Gavin Howard9ea15062018-02-20 15:37:39 -070058void* bc_vec_item_rev(BcVec* vec, size_t idx);
59
Gavin Howard5a8949e2018-02-05 16:46:06 -070060BcStatus bc_vec_pop(BcVec* vec);
61
62void bc_vec_free(void* vec);
Gavin Howard26a5aeb2018-02-05 14:33:40 -070063
Gavin Howardd96bcae2018-02-07 19:16:19 -070064typedef struct BcVecO {
65
66 BcVec vec;
67 BcVecCmpFunc cmp;
68
69} BcVecO;
70
71BcStatus bc_veco_init(BcVecO* vec, size_t esize,
72 BcFreeFunc dtor, BcVecCmpFunc cmp);
73
Gavin Howardab67e7c2018-02-09 10:35:44 -070074BcStatus bc_veco_insert(BcVecO* vec, void* data, size_t* idx);
Gavin Howardd96bcae2018-02-07 19:16:19 -070075
76size_t bc_veco_index(BcVecO* vec, void* data);
77
78void* bc_veco_item(BcVecO* vec, size_t idx);
79
80void bc_veco_free(BcVecO* vec);
81
Gavin Howard26a5aeb2018-02-05 14:33:40 -070082#endif // BC_VECTOR_H