Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
64136a4c3d90c4d377dba2847491f8d0656e9eae
[simgrid.git] / include / xbt / dynar.h
1 /* $Id$ */
2
3 /* dynar - a generic dynamic array                                          */
4
5 /* Copyright (c) 2003, 2004 Martin Quinson. All rights reserved.            */
6
7 /* This program is free software; you can redistribute it and/or modify it
8  * under the terms of the license (GNU LGPL) which comes with this package. */
9
10 #ifndef _XBT_DYNAR_H
11 #define _XBT_DYNAR_H
12
13 #include "xbt/misc.h" /* BEGIN_DECL */
14
15 BEGIN_DECL
16
17 typedef struct xbt_dynar_s *xbt_dynar_t;
18
19 xbt_dynar_t  xbt_dynar_new(unsigned long elm_size, 
20                              void_f_pvoid_t *free_func);
21 void          xbt_dynar_free(xbt_dynar_t *dynar);
22 void          xbt_dynar_free_container(xbt_dynar_t *dynar);
23
24 unsigned long xbt_dynar_length(const xbt_dynar_t dynar);
25 void          xbt_dynar_reset(xbt_dynar_t dynar);
26
27
28 /* regular array functions */
29 void xbt_dynar_get_cpy(const xbt_dynar_t dynar, int idx, void *const dst);
30 void *xbt_dynar_get_ptr(const xbt_dynar_t dynar,
31                          const int          idx);
32
33 #define xbt_dynar_get_as(dynar,idx,type) *(type*)xbt_dynar_get_ptr(dynar,idx)
34   
35 void xbt_dynar_set(xbt_dynar_t dynar, int  idx, const void *src);
36 void xbt_dynar_replace(xbt_dynar_t dynar,
37                         int idx, const void *object);
38
39 /* perl array function */
40
41 void xbt_dynar_insert_at(xbt_dynar_t dynar,
42                           int  idx, const void *src);
43 void xbt_dynar_remove_at(xbt_dynar_t dynar,
44                           int  idx, void *object);
45 void xbt_dynar_push     (xbt_dynar_t dynar, const void *src);
46 void xbt_dynar_pop      (xbt_dynar_t dynar, void *const dst);
47 void xbt_dynar_unshift  (xbt_dynar_t dynar, const void *src);
48 void xbt_dynar_shift    (xbt_dynar_t dynar, void *const dst);
49 void xbt_dynar_map      (const xbt_dynar_t dynar, void_f_pvoid_t *operator);
50
51 /* speed-optimized versions */
52 void *xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar,
53                                const int          idx);
54 void *xbt_dynar_push_ptr(xbt_dynar_t dynar);
55 void *xbt_dynar_pop_ptr(xbt_dynar_t dynar);
56
57 #define xbt_dynar_insert_at_as(dynar,idx,type,value) *(type*)xbt_dynar_insert_at_ptr(dynar,idx)=value
58 #define xbt_dynar_push_as(dynar,type,value) *(type*)xbt_dynar_push_ptr(dynar)=value
59 #define xbt_dynar_pop_as(dynar,type) *(type*)xbt_dynar_pop_ptr(dynar)
60
61
62 /* cursor functions */
63 void xbt_dynar_cursor_first (const xbt_dynar_t dynar, int *cursor);
64 void xbt_dynar_cursor_step  (const xbt_dynar_t dynar, int *cursor);
65 int  xbt_dynar_cursor_get   (const xbt_dynar_t dynar, int *cursor, void *whereto);
66
67 /**
68  * xbt_dynar_foreach:
69  * @_dynar: what to iterate over
70  * @_cursor: an integer used as cursor
71  * @_data:
72  *
73  * Iterates over the whole dynar. Example:
74  *
75  * <programlisting>
76  * xbt_dynar_t dyn;
77  * int cpt;
78  * string *str;
79  * xbt_dynar_foreach (dyn,cpt,str) {
80  *   printf("Seen %s\n",str);
81  * }</programlisting>
82  */
83 #define xbt_dynar_foreach(_dynar,_cursor,_data) \
84        for (xbt_dynar_cursor_first(_dynar,&(_cursor))      ; \
85             xbt_dynar_cursor_get(_dynar,&(_cursor),&_data) ; \
86             xbt_dynar_cursor_step(_dynar,&(_cursor))         )
87 /*
88        for (xbt_dynar_length(_dynar) && (_xbt_dynar_cursor_first(_dynar,&_cursor),      \
89                                           1);     \
90             xbt_dynar_length(_dynar) && xbt_dynar_cursor_get(_dynar,&_cursor,&_data); \
91             xbt_dynar_cursor_step(_dynar,&_cursor))
92 */
93 void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
94                           int          *const cursor);
95
96 END_DECL
97 #endif /* _XBT_DYNAR_H */