multipathd: fix reservation_key check
[multipath-tools/.git] / libmultipath / vector.h
1 /*
2  * Soft:        Keepalived is a failover program for the LVS project
3  *              <www.linuxvirtualserver.org>. It monitor & manipulate
4  *              a loadbalanced server pool using multi-layer checks.
5  *
6  * Part:        vector.c include file.
7  *
8  * Version:     $Id: vector.h,v 1.0.3 2003/05/11 02:28:03 acassen Exp $
9  *
10  * Author:      Alexandre Cassen, <acassen@linux-vs.org>
11  *
12  *              This program is distributed in the hope that it will be useful,
13  *              but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *              MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15  *              See the GNU General Public License for more details.
16  *
17  *              This program is free software; you can redistribute it and/or
18  *              modify it under the terms of the GNU General Public License
19  *              as published by the Free Software Foundation; either version
20  *              2 of the License, or (at your option) any later version.
21  */
22
23 #ifndef _VECTOR_H
24 #define _VECTOR_H
25
26 /* vector definition */
27 struct _vector {
28         int allocated;
29         void **slot;
30 };
31 typedef struct _vector *vector;
32
33 #define VECTOR_DEFAULT_SIZE 1
34 #define VECTOR_SIZE(V)   ((V) ? ((V)->allocated) / VECTOR_DEFAULT_SIZE : 0)
35 #define VECTOR_SLOT(V,E) (((V) && (E) < VECTOR_SIZE(V)) ? (V)->slot[(E)] : NULL)
36 #define VECTOR_LAST_SLOT(V)   (((V) && VECTOR_SIZE(V) > 0) ? (V)->slot[(VECTOR_SIZE(V) - 1)] : NULL)
37
38 #define vector_foreach_slot(v,p,i) \
39         for (i = 0; (v) && i < VECTOR_SIZE(v) && ((p) = (v)->slot[i]); i++)
40 #define vector_foreach_slot_after(v,p,i) \
41         for (; (v) && i < VECTOR_SIZE(v) && ((p) = (v)->slot[i]); i++)
42 #define vector_foreach_slot_backwards(v,p,i) \
43         for (i = VECTOR_SIZE(v); i > 0 && ((p) = (v)->slot[i-1]); i--)
44
45 #define identity(x) (x)
46 /*
47  * Given a vector vec with elements of given type,
48  * return a newly allocated vector with elements conv(e) for each element
49  * e in vec. "conv" may be a macro or a function.
50  * Use "identity" for a simple copy.
51  */
52 #define vector_convert(new, vec, type, conv)                            \
53         ({                                                              \
54                 const struct _vector *__v = (vec);                      \
55                 vector __t = (new);                                     \
56                 type *__j;                                              \
57                 int __i;                                                \
58                                                                         \
59                 if (__t == NULL)                                        \
60                         __t = vector_alloc();                           \
61                 if (__t != NULL) {                                      \
62                         vector_foreach_slot(__v, __j, __i) {            \
63                                 if (vector_alloc_slot(__t) == NULL) {   \
64                                         vector_free(__t);               \
65                                         __t = NULL;                     \
66                                         break;                          \
67                                 }                                       \
68                                 vector_set_slot(__t, conv(__j));        \
69                         }                                               \
70                 }                                                       \
71                 __t;                                                    \
72         })
73
74 /* Prototypes */
75 extern vector vector_alloc(void);
76 extern void *vector_alloc_slot(vector v);
77 vector vector_reset(vector v);
78 extern void vector_free(vector v);
79 #define vector_free_const(x) vector_free((vector)(long)(x))
80 extern void free_strvec(vector strvec);
81 extern void vector_set_slot(vector v, void *value);
82 extern void vector_del_slot(vector v, int slot);
83 extern void *vector_insert_slot(vector v, int slot, void *value);
84 int find_slot(vector v, void * addr);
85 extern void vector_repack(vector v);
86 extern void vector_dump(vector v);
87 extern void dump_strvec(vector strvec);
88 extern int vector_move_up(vector v, int src, int dest);
89 #endif