Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Acknoledge that some datasets are not regenerated yet, and deal with it
[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 /** \brief Dictionnary data type 
18     \ingroup XBT_dynar
19 */
20 typedef struct xbt_dynar_s *xbt_dynar_t;
21
22 xbt_dynar_t  xbt_dynar_new(unsigned long elm_size, 
23                              void_f_pvoid_t *free_func);
24 void          xbt_dynar_free(xbt_dynar_t *dynar);
25 void          xbt_dynar_free_container(xbt_dynar_t *dynar);
26
27 unsigned long xbt_dynar_length(const xbt_dynar_t dynar);
28 void          xbt_dynar_reset(xbt_dynar_t dynar);
29
30
31 /* regular array functions */
32 void xbt_dynar_get_cpy(const xbt_dynar_t dynar, int idx, void *const dst);
33 void *xbt_dynar_get_ptr(const xbt_dynar_t dynar,
34                          const int          idx);
35
36 #define xbt_dynar_get_as(dynar,idx,type) *(type*)xbt_dynar_get_ptr(dynar,idx)
37   
38 void xbt_dynar_set(xbt_dynar_t dynar, int  idx, const void *src);
39 void xbt_dynar_replace(xbt_dynar_t dynar,
40                         int idx, const void *object);
41
42 /* perl array function */
43
44 void xbt_dynar_insert_at(xbt_dynar_t dynar,
45                           int  idx, const void *src);
46 void xbt_dynar_remove_at(xbt_dynar_t dynar,
47                           int  idx, void *object);
48 void xbt_dynar_push     (xbt_dynar_t dynar, const void *src);
49 void xbt_dynar_pop      (xbt_dynar_t dynar, void *const dst);
50 void xbt_dynar_unshift  (xbt_dynar_t dynar, const void *src);
51 void xbt_dynar_shift    (xbt_dynar_t dynar, void *const dst);
52 void xbt_dynar_map      (const xbt_dynar_t dynar, void_f_pvoid_t *operator);
53
54 /* speed-optimized versions */
55 void *xbt_dynar_insert_at_ptr(xbt_dynar_t const dynar,
56                                const int          idx);
57 void *xbt_dynar_push_ptr(xbt_dynar_t dynar);
58 void *xbt_dynar_pop_ptr(xbt_dynar_t dynar);
59
60 #define xbt_dynar_insert_at_as(dynar,idx,type,value) *(type*)xbt_dynar_insert_at_ptr(dynar,idx)=value
61 #define xbt_dynar_push_as(dynar,type,value) *(type*)xbt_dynar_push_ptr(dynar)=value
62 #define xbt_dynar_pop_as(dynar,type) *(type*)xbt_dynar_pop_ptr(dynar)
63
64
65 /* cursor functions */
66 void xbt_dynar_cursor_first (const xbt_dynar_t dynar, int *cursor);
67 void xbt_dynar_cursor_step  (const xbt_dynar_t dynar, int *cursor);
68 int  xbt_dynar_cursor_get   (const xbt_dynar_t dynar, int *cursor, void *whereto);
69
70
71 /**
72  \brief Dynar iterator
73  \ingroup XBT_dynar
74  * xbt_dynar_foreach:
75  * \param _dynar what to iterate over
76  * \param _cursor an integer used as cursor
77  * \param _data
78  *
79  * Iterates over the whole dynar. 
80  * \note An example of usage:
81  * \code
82 xbt_dynar_t dyn;
83 int cpt;
84 string *str;
85 xbt_dynar_foreach (dyn,cpt,str) {
86   printf("Seen %s\n",str);
87 }
88 \endcode
89  */
90 #define xbt_dynar_foreach(_dynar,_cursor,_data) \
91        for (xbt_dynar_cursor_first(_dynar,&(_cursor))      ; \
92             xbt_dynar_cursor_get(_dynar,&(_cursor),&_data) ; \
93             xbt_dynar_cursor_step(_dynar,&(_cursor))         )
94 /*
95        for (xbt_dynar_length(_dynar) && (_xbt_dynar_cursor_first(_dynar,&_cursor),      \
96                                           1);     \
97             xbt_dynar_length(_dynar) && xbt_dynar_cursor_get(_dynar,&_cursor,&_data); \
98             xbt_dynar_cursor_step(_dynar,&_cursor))
99 */
100 void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
101                           int          *const cursor);
102
103 END_DECL()
104 #endif /* _XBT_DYNAR_H */