- void xbt_dynar_cursor_first (const xbt_dynar_t dynar, int *cursor);
- void xbt_dynar_cursor_step (const xbt_dynar_t dynar, int *cursor);
- int xbt_dynar_cursor_get (const xbt_dynar_t dynar, int *cursor,
- void *whereto);
- void xbt_dynar_cursor_rm(xbt_dynar_t dynar,
- int *const cursor);
+XBT_PUBLIC(void) xbt_dynar_cursor_rm(xbt_dynar_t dynar,
+ unsigned int *const cursor);
+XBT_PUBLIC(void) xbt_dynar_cursor_unlock(xbt_dynar_t dynar);
+
+/* do not use this structure internals directly, but use the public interface
+ * This was made public to allow:
+ * - the inlining of the foreach elements
+ * - sending such beasts over the network
+ */
+
+#include "xbt/synchro_core.h"
+typedef struct xbt_dynar_s {
+ unsigned long size;
+ unsigned long used;
+ unsigned long elmsize;
+ void *data;
+ void_f_pvoid_t free_f;
+} s_xbt_dynar_t;
+
+static XBT_INLINE void
+_xbt_dynar_cursor_first(const xbt_dynar_t dynar,
+ unsigned int *const cursor)
+{
+ /* iterating over a NULL dynar is a no-op (but we don't want to have uninitialized counters) */
+
+ //XBT_DEBUG("Set cursor on %p to the first position", (void *) dynar);
+ *cursor = 0;
+}
+
+static XBT_INLINE int
+_xbt_dynar_cursor_get(const xbt_dynar_t dynar,
+ unsigned int idx, void *const dst)
+{
+ if (!dynar) /* iterating over a NULL dynar is a no-op */
+ return FALSE;
+
+ if (idx >= dynar->used) {
+ //XBT_DEBUG("Cursor on %p already on last elem", (void *) dynar);
+ return FALSE;
+ }
+ // XBT_DEBUG("Cash out cursor on %p at %u", (void *) dynar, *idx);
+
+ memcpy(dst, ((char *) dynar->data) + idx * dynar->elmsize,
+ dynar->elmsize);
+
+ return TRUE;
+}
+