/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
+#include "portable.h" /* SIZEOF_MAX */
#include "xbt/misc.h"
#include "xbt/sysdep.h"
#include "xbt/log.h"
#include "xbt/dynar.h"
#include <sys/types.h>
-
+#include "xbt/dynar_private.h" /* type definition, which we share with the
+ code in charge of sending this across the net */
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dynar,xbt,"Dynamic arrays");
-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;
#define __sanity_check_dynar(dynar) \
xbt_assert0(dynar, \
if (old_data) {
memcpy(new_data, old_data, used_length);
_xbt_clear_mem(old_data, old_length);
- xbt_free(old_data);
+ free(old_data);
}
_xbt_clear_mem(new_data + used_length, new_length - used_length);
memcpy(elm, src, elmsize);
}
+void
+xbt_dynar_dump(xbt_dynar_t dynar) {
+ INFO5("Dynar dump: size=%lu; used=%lu; elmsize=%lu; data=%p; free_f=%p",
+ dynar->size, dynar->used, dynar->elmsize, dynar->data, dynar->free_f);
+}
+
/** @brief Constructor
*
* \param elmsize size of each element in the dynar
if ((*dynar)->data) {
_xbt_clear_mem((*dynar)->data, (*dynar)->size);
- xbt_free((*dynar)->data);
+ free((*dynar)->data);
}
_xbt_clear_mem(*dynar, sizeof(s_xbt_dynar_t));
- xbt_free(*dynar);
+ free(*dynar);
*dynar=NULL;
}
}
}
if (dynar->data)
- xbt_free(dynar->data);
+ free(dynar->data);
dynar->size = 0;
dynar->used = 0;
*/
void*
xbt_dynar_get_ptr(const xbt_dynar_t dynar,
- const int idx) {
+ const int idx) {
__sanity_check_dynar(dynar);
__sanity_check_idx(idx);
const int idx,
void * const object) {
+ unsigned long nb_shift;
+ unsigned long offset;
+
__sanity_check_dynar(dynar);
__sanity_check_idx(idx);
__check_inbound_idx(dynar, idx);
- if (object)
+ if (object) {
_xbt_dynar_get_elm(object, dynar, idx);
+ } else if (dynar->free_f) {
+ char elm[SIZEOF_MAX];
+ _xbt_dynar_get_elm(elm, dynar, idx);
+ (*dynar->free_f)(elm);
+ }
- {
- const unsigned long old_used = dynar->used;
- const unsigned long new_used = old_used - 1;
-
- const unsigned long nb_shift = old_used-1 - idx;
- const unsigned long elmsize = dynar->elmsize;
-
- const unsigned long offset = nb_shift*elmsize;
-
- void * const elm_src = _xbt_dynar_elm(dynar, idx+1);
- void * const elm_dst = _xbt_dynar_elm(dynar, idx);
+ nb_shift = dynar->used-1 - idx;
+ offset = nb_shift * dynar->elmsize;
- memmove(elm_dst, elm_src, offset);
+ memmove(_xbt_dynar_elm(dynar, idx),
+ _xbt_dynar_elm(dynar, idx+1),
+ offset);
- dynar->used = new_used;
- }
+ dynar->used--;
}
/** @brief Make room at the end of the dynar for a new element, and return a pointer to it.
__sanity_check_dynar(dynar);
{
- char elm[64];
+ char elm[SIZEOF_MAX];
const unsigned long used = dynar->used;
unsigned long i = 0;
dst=xbt_malloc(dynar->elmsize);
xbt_dynar_remove_at(dynar,(*cursor)--,dst);
(dynar->free_f)(dst);
- xbt_free(dst);
+ free(dst);
} else {
DEBUG0("Ok, we dont care about the element without free function");
xbt_dynar_remove_at(dynar,(*cursor)--,NULL);