blob: ab396ab230944f6a7544abf65efd13b06edac196 [file] [log] [blame]
Gavin Howard5715b042018-02-12 16:11:42 -07001/*
2 * Copyright 2018 Contributors
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13
14 * 3. Neither the name of the copyright holder nor the names of its contributors
15 * may be used to endorse or promote products derived from this software without
16 * specific prior written permission.
17
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 *
30 *******************************************************************************
31 *
Gavin Howard0dbafb52018-02-15 10:03:30 -070032 * A special license exemption is granted to the Toybox project to use this
33 * source under the following BSD 0-Clause License:
Gavin Howard5715b042018-02-12 16:11:42 -070034 *
35 * Permission to use, copy, modify, and/or distribute this software for any
36 * purpose with or without fee is hereby granted.
37 *
38 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
39 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
40 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
41 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
42 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
43 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
44 * PERFORMANCE OF THIS SOFTWARE.
45 *
46 *******************************************************************************
47 *
48 * Definitions for bc vectors (resizable arrays).
49 *
50 */
51
Gavin Howard26a5aeb2018-02-05 14:33:40 -070052#ifndef BC_VECTOR_H
53#define BC_VECTOR_H
Gavin Howard8a596d42018-01-15 15:46:01 -070054
55#include <stdlib.h>
56#include <stdint.h>
57
Gavin Howard3ba6c8d2018-02-15 12:23:35 -070058#include <bc.h>
Gavin Howard8a596d42018-01-15 15:46:01 -070059
Gavin Howard26a5aeb2018-02-05 14:33:40 -070060#define BC_VEC_INITIAL_CAP (32)
Gavin Howard8a596d42018-01-15 15:46:01 -070061
Gavin Howardd96bcae2018-02-07 19:16:19 -070062typedef int (*BcVecCmpFunc)(void*, void*);
63
Gavin Howard26a5aeb2018-02-05 14:33:40 -070064typedef struct BcVec {
Gavin Howard8a596d42018-01-15 15:46:01 -070065
Gavin Howard26a5aeb2018-02-05 14:33:40 -070066 uint8_t* array;
Gavin Howard5a8949e2018-02-05 16:46:06 -070067 size_t len;
68 size_t cap;
Gavin Howard26a5aeb2018-02-05 14:33:40 -070069 size_t size;
Gavin Howard8a596d42018-01-15 15:46:01 -070070
Gavin Howard5a8949e2018-02-05 16:46:06 -070071 BcFreeFunc dtor;
Gavin Howard4dc42662018-01-17 15:17:47 -070072
Gavin Howard26a5aeb2018-02-05 14:33:40 -070073} BcVec;
Gavin Howard8a596d42018-01-15 15:46:01 -070074
Gavin Howard5a8949e2018-02-05 16:46:06 -070075BcStatus bc_vec_init(BcVec* vec, size_t esize, BcFreeFunc dtor);
Gavin Howard8a596d42018-01-15 15:46:01 -070076
Gavin Howard5a8949e2018-02-05 16:46:06 -070077BcStatus bc_vec_push(BcVec* vec, void* data);
Gavin Howard8a596d42018-01-15 15:46:01 -070078
Gavin Howard5a8949e2018-02-05 16:46:06 -070079BcStatus bc_vec_pushByte(BcVec* vec, uint8_t data);
Gavin Howard8a596d42018-01-15 15:46:01 -070080
Gavin Howard5a8949e2018-02-05 16:46:06 -070081BcStatus bc_vec_pushAt(BcVec* vec, void* data, size_t idx);
Gavin Howard8a596d42018-01-15 15:46:01 -070082
Gavin Howard5a8949e2018-02-05 16:46:06 -070083void* bc_vec_top(BcVec* vec);
Gavin Howard8a596d42018-01-15 15:46:01 -070084
Gavin Howard5a8949e2018-02-05 16:46:06 -070085void* bc_vec_item(BcVec* vec, size_t idx);
Gavin Howard8a596d42018-01-15 15:46:01 -070086
Gavin Howard5a8949e2018-02-05 16:46:06 -070087BcStatus bc_vec_pop(BcVec* vec);
88
89void bc_vec_free(void* vec);
Gavin Howard26a5aeb2018-02-05 14:33:40 -070090
Gavin Howardd96bcae2018-02-07 19:16:19 -070091typedef struct BcVecO {
92
93 BcVec vec;
94 BcVecCmpFunc cmp;
95
96} BcVecO;
97
98BcStatus bc_veco_init(BcVecO* vec, size_t esize,
99 BcFreeFunc dtor, BcVecCmpFunc cmp);
100
Gavin Howardab67e7c2018-02-09 10:35:44 -0700101BcStatus bc_veco_insert(BcVecO* vec, void* data, size_t* idx);
Gavin Howardd96bcae2018-02-07 19:16:19 -0700102
103size_t bc_veco_index(BcVecO* vec, void* data);
104
105void* bc_veco_item(BcVecO* vec, size_t idx);
106
107void bc_veco_free(BcVecO* vec);
108
Gavin Howard26a5aeb2018-02-05 14:33:40 -0700109#endif // BC_VECTOR_H