- 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);
+
+/*
+ * \warning DO NOT USE THIS STRUCTURE DIRECTLY! Instead, use the public interface:
+ * This was made public to allow:
+ * - the inlining of the foreach elements
+ * - sending such beasts over the network
+ *
+ * \see xbt_dynar_length()
+ */
+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 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);