Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
cosmetics, and make two different error messages look different
[simgrid.git] / src / xbt / dynar.c
index b964885..0987609 100644 (file)
@@ -11,6 +11,7 @@
 #include "xbt/misc.h"
 #include "xbt/sysdep.h"
 #include "xbt/log.h"
+#include "xbt/ex.h"
 #include "xbt/dynar.h"
 #include <sys/types.h>
 
@@ -33,7 +34,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(dynar,xbt,"Dynamic arrays");
                        (int) (idx), (unsigned long) dynar->used)
 #define __check_sloppy_inbound_idx(dynar, idx)                                         \
            xbt_assert2(idx <= dynar->used,                                            \
-                       "dynar is not that long. You asked %d, but it's only %lu long", \
+                       "dynar is not that long. You asked %d, but it's only %lu long (could have been equal to it)", \
                        (int) (idx), (unsigned long) dynar->used)
 #define __check_populated_dynar(dynar)            \
            xbt_assert1(dynar->used,              \
@@ -95,9 +96,8 @@ _xbt_dynar_get_elm(void  * const       dst,
                     const xbt_dynar_t  dynar,
                     const unsigned long idx) {
   void * const elm     = _xbt_dynar_elm(dynar, idx);
-  const unsigned long elmsize = dynar->elmsize;
 
-  memcpy(dst, elm, elmsize);
+  memcpy(dst, elm, dynar->elmsize);
 }
 
 static _XBT_INLINE
@@ -243,8 +243,7 @@ xbt_dynar_get_cpy(const xbt_dynar_t dynar,
  * Make a copy before fooling with it.
  */
 void*
-xbt_dynar_get_ptr(const xbt_dynar_t dynar,
-          const int          idx) {
+xbt_dynar_get_ptr(const xbt_dynar_t dynar, const int idx) {
 
   __sanity_check_dynar(dynar);
   __sanity_check_idx(idx);
@@ -390,6 +389,41 @@ xbt_dynar_remove_at(xbt_dynar_t  const dynar,
   dynar->used--;
 }
 
+/** @brief Returns the position of the element in the dynar
+ *
+ * Raises not_found_error if not found.
+ */
+int
+xbt_dynar_search(xbt_dynar_t  const dynar,
+                void        *const elem) {
+  int it;
+   
+  for (it=0; it< dynar->size; it++) 
+    if (!memcmp(_xbt_dynar_elm(dynar, it),elem,dynar->elmsize))
+      return it;
+
+  THROW2(not_found_error,0,"Element %p not part of dynar %p",elem,dynar);
+}
+
+/** @brief Returns a boolean indicating whether the element is part of the dynar */
+int
+xbt_dynar_member(xbt_dynar_t  const dynar,
+                void        *const elem) {
+
+  xbt_ex_t e;
+   
+  TRY {
+     xbt_dynar_search(dynar,elem);
+  } CATCH(e) {
+     if (e.category == not_found_error) {
+       xbt_ex_free(e);
+       return 0;
+     }
+     RETHROW;
+  }
+  return 1;
+}
+
 /** @brief Make room at the end of the dynar for a new element, and return a pointer to it.
  *
  * You can then use regular affectation to set its value instead of relying