diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:53:30 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 09:53:30 +0000 |
commit | 2c7cac91ed6e7db0f6937923d2b57f97dbdbc337 (patch) | |
tree | c05dc0f8e6aa3accc84e3e5cffc933ed94941383 /lib/vector.h | |
parent | Initial commit. (diff) | |
download | frr-upstream/8.4.4.tar.xz frr-upstream/8.4.4.zip |
Adding upstream version 8.4.4.upstream/8.4.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | lib/vector.h | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/lib/vector.h b/lib/vector.h new file mode 100644 index 0000000..71c497a --- /dev/null +++ b/lib/vector.h @@ -0,0 +1,80 @@ +/* + * Generic vector interface header. + * Copyright (C) 1997, 98 Kunihiro Ishiguro + * + * This file is part of GNU Zebra. + * + * GNU Zebra is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * GNU Zebra is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; see the file COPYING; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _ZEBRA_VECTOR_H +#define _ZEBRA_VECTOR_H + +#include "memory.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* struct for vector */ +struct _vector { + unsigned int active; /* number of active slots */ + unsigned int alloced; /* number of allocated slot */ + unsigned int count; + void **index; /* index to data */ +}; +typedef struct _vector *vector; + +#define VECTOR_MIN_SIZE 1 + +/* (Sometimes) usefull macros. This macro convert index expression to + array expression. */ +/* Reference slot at given index, caller must ensure slot is active */ +#define vector_slot(V,I) ((V)->index[(I)]) +/* Number of active slots. + * Note that this differs from vector_count() as it the count returned + * will include any empty slots + */ +#define vector_active(V) ((V)->active) + +/* Prototypes. */ +extern vector vector_init(unsigned int size); +extern void vector_ensure(vector v, unsigned int num); +extern int vector_empty_slot(vector v); +extern int vector_set(vector v, void *val); +extern int vector_set_index(vector v, unsigned int i, void *val); +extern void vector_unset(vector v, unsigned int i); +extern void vector_unset_value(vector v, void *val); +extern void vector_remove(vector v, unsigned int ix); +extern void vector_compact(vector v); + +static inline unsigned int vector_count(vector v) +{ + return v->count; +} + +extern void vector_free(vector v); +extern vector vector_copy(vector v); + +extern void *vector_lookup(vector, unsigned int); +extern void *vector_lookup_ensure(vector, unsigned int); +extern void vector_to_array(vector v, void ***dest, int *argc); +extern vector array_to_vector(void **src, int argc); + +#ifdef __cplusplus +} +#endif + +#endif /* _ZEBRA_VECTOR_H */ |