Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Rationalize iterators over dict (using the ones over dynars)
authormquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 28 Jan 2004 19:14:26 +0000 (19:14 +0000)
committermquinson <mquinson@48e7efb5-ca39-0410-a469-dd3cf9ba447f>
Wed, 28 Jan 2004 19:14:26 +0000 (19:14 +0000)
git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@11 48e7efb5-ca39-0410-a469-dd3cf9ba447f

include/dict.h

index fd43487..f6e70b0 100644 (file)
@@ -118,27 +118,31 @@ gras_error_t gras_multidict_remove_ext(gras_dict_t *head,
 /*###########################################################################*/
 typedef struct gras_dict_cursor_ gras_dict_cursor_t;
 /* creator/destructor */
-gras_error_t gras_dict_cursor_new(gras_dict_t *head,
+gras_error_t gras_dict_cursor_new(const gras_dict_t *head,
                                  /*OUT*/gras_dict_cursor_t **cursor);
 void         gras_dict_cursor_free(gras_dict_cursor_t *cursor);
 
-/* next element. Returns true if ok, and false on last entry */
-gras_error_t gras_dict_cursor_next(gras_dict_cursor_t *cursor);
 /* back to first element 
    it is not enough to reinit the cache after an add/remove in cache*/
 gras_error_t gras_dict_cursor_rewind(gras_dict_cursor_t *cursor);
 
-/* Get current element. The key will be overwriten over calls */
-gras_error_t gras_dict_cursor_get_key(gras_dict_cursor_t *cursor,
-                                     /*OUT*/char **key);
-gras_error_t gras_dict_cursor_get_data(gras_dict_cursor_t *cursor,
-                                      /*OUT*/void **data);
-
-#define gras_dict_foreach(dict,cursor) \
-  for (cursor = NULL; \
-       ( cursor || gras_dict_cursor_new((dict),&(cursor)) == no_error )         && \
-       ( gras_dict_cursor_next(cursor) || (gras_dict_cursor_free(cursor), 0) ) ; \
-      )
+
+gras_error_t gras_dict_cursor_get_key     (gras_dict_cursor_t *cursor,
+                                          /*OUT*/char **key);
+gras_error_t gras_dict_cursor_get_data    (gras_dict_cursor_t *cursor,
+                                          /*OUT*/void **data);
+
+
+void         gras_dict_cursor_first       (const gras_dict_t   *dict,
+                                          gras_dict_cursor_t **cursor);
+void         gras_dict_cursor_step        (gras_dict_cursor_t  *cursor);
+int          gras_dict_cursor_get_or_free (gras_dict_cursor_t **cursor,
+                                          char               **key,
+                                          void               **data);
+#define gras_dict_foreach(dict,cursor,key,data)                \
+  for (gras_dict_cursor_first((dict),&(cursor)) ;              \
+       gras_dict_cursor_get_or_free(&(cursor),&(key),(void**)(&data)); \
+       gras_dict_cursor_step(cursor) )
 
 #ifdef  __cplusplus
 }