Line data Source code
1 : /*
2 : * Generic vector interface header.
3 : * Copyright (C) 1997, 98 Kunihiro Ishiguro
4 : *
5 : * This file is part of GNU Zebra.
6 : *
7 : * GNU Zebra is free software; you can redistribute it and/or modify it
8 : * under the terms of the GNU General Public License as published by the
9 : * Free Software Foundation; either version 2, or (at your option) any
10 : * later version.
11 : *
12 : * GNU Zebra is distributed in the hope that it will be useful, but
13 : * WITHOUT ANY WARRANTY; without even the implied warranty of
14 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 : * General Public License for more details.
16 : *
17 : * You should have received a copy of the GNU General Public License along
18 : * with this program; see the file COPYING; if not, write to the Free Software
19 : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 : */
21 :
22 : #ifndef _ZEBRA_VECTOR_H
23 : #define _ZEBRA_VECTOR_H
24 :
25 : #include "memory.h"
26 :
27 : #ifdef __cplusplus
28 : extern "C" {
29 : #endif
30 :
31 : /* struct for vector */
32 : struct _vector {
33 : unsigned int active; /* number of active slots */
34 : unsigned int alloced; /* number of allocated slot */
35 : unsigned int count;
36 : void **index; /* index to data */
37 : };
38 : typedef struct _vector *vector;
39 :
40 : #define VECTOR_MIN_SIZE 1
41 :
42 : /* (Sometimes) usefull macros. This macro convert index expression to
43 : array expression. */
44 : /* Reference slot at given index, caller must ensure slot is active */
45 : #define vector_slot(V,I) ((V)->index[(I)])
46 : /* Number of active slots.
47 : * Note that this differs from vector_count() as it the count returned
48 : * will include any empty slots
49 : */
50 : #define vector_active(V) ((V)->active)
51 :
52 : /* Prototypes. */
53 : extern vector vector_init(unsigned int size);
54 : extern void vector_ensure(vector v, unsigned int num);
55 : extern int vector_empty_slot(vector v);
56 : extern int vector_set(vector v, void *val);
57 : extern int vector_set_index(vector v, unsigned int i, void *val);
58 : extern void vector_unset(vector v, unsigned int i);
59 : extern void vector_unset_value(vector v, void *val);
60 : extern void vector_remove(vector v, unsigned int ix);
61 : extern void vector_compact(vector v);
62 :
63 0 : static inline unsigned int vector_count(vector v)
64 : {
65 0 : return v->count;
66 : }
67 :
68 : extern void vector_free(vector v);
69 : extern vector vector_copy(vector v);
70 :
71 : extern void *vector_lookup(vector, unsigned int);
72 : extern void *vector_lookup_ensure(vector, unsigned int);
73 : extern void vector_to_array(vector v, void ***dest, int *argc);
74 : extern vector array_to_vector(void **src, int argc);
75 :
76 : #ifdef __cplusplus
77 : }
78 : #endif
79 :
80 : #endif /* _ZEBRA_VECTOR_H */
|