Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'master' of git+ssh://scm.gforge.inria.fr//gitroot//simgrid/simgrid
[simgrid.git] / include / xbt / lib.h
1 #ifndef _XBT_LIB_H
2 #define _XBT_LIB_H
3
4 #define MAX_FILL_PERCENT 80
5
6 SG_BEGIN_DECL()
7
8 typedef struct xbt_lib_ *xbt_lib_t;
9 typedef struct xbt_libelm_ *xbt_libelm_t;
10 typedef struct xbt_lib_cursor_ *xbt_lib_cursor_t;
11 typedef struct xbt_lib_cursor_ s_xbt_lib_cursor_t;
12
13 struct xbt_lib_cursor_ {
14   xbt_libelm_t current;
15   int line;
16   xbt_lib_t lib;
17 };
18
19 typedef struct xbt_libelm_ {
20   char *key;
21   int key_len;
22   unsigned int hash_code;
23   xbt_libelm_t next;
24   void *content;
25 } s_xbt_libelm_t;
26
27 typedef struct xbt_lib_ {
28   int table_size;
29   int count;
30   int fill;
31   int levels;
32   void_f_pvoid_t *free_f; // This is actually a table
33   xbt_libelm_t *table;    // This is actually a table
34 } s_xbt_lib_t;
35
36
37 /*####[ Prototypes ]#################################################*/
38 XBT_PUBLIC(void) xbt_lib_preinit(void);
39 XBT_PUBLIC(void) xbt_lib_postexit(void);
40 XBT_PUBLIC(xbt_lib_t) xbt_lib_new(void);
41 XBT_PUBLIC(void) xbt_lib_free(xbt_lib_t * lib);
42 XBT_PUBLIC(int) xbt_lib_add_level(xbt_lib_t lib, void_f_pvoid_t free_f); // Une fois qu'on a inséré un objet, on ne peut plus ajouter de niveau
43 XBT_PUBLIC(void) xbt_lib_set(xbt_lib_t lib, const char *name, int level, void *obj);
44 XBT_PUBLIC(void *) xbt_lib_get_or_null(xbt_lib_t lib, const char *name, int level);
45 XBT_PUBLIC(int) xbt_lib_length(xbt_lib_t lib);
46 XBT_PUBLIC(void) xbt_lib_reset(xbt_lib_t *lib);
47 XBT_PUBLIC(void) xbt_lib_cursor_step(xbt_lib_cursor_t cursor);
48 XBT_PUBLIC(int) xbt_lib_cursor_get_or_free(xbt_lib_cursor_t * cursor, char **key, void **data);
49 XBT_PUBLIC(void) xbt_lib_cursor_first(const xbt_lib_t lib, xbt_lib_cursor_t * cursor);
50 XBT_PUBLIC(unsigned int) xbt_lib_size(xbt_lib_t lib);
51
52 /** @def xbt_lib_foreach
53     @hideinitializer */
54 #define xbt_lib_foreach(lib,cursor,key,data)                       \
55   for (cursor=NULL, xbt_lib_cursor_first((lib),&(cursor)) ;        \
56        xbt_lib_cursor_get_or_free(&(cursor),(char**)&(key),(void**)(&data));\
57        xbt_lib_cursor_step(cursor) )
58
59 SG_END_DECL()
60 #endif                          /* _XBT_LIB_H */