Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Factorize code for xbt_dynar_set/xbt_dynar_set_at_ptr.
authorArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Wed, 23 Nov 2011 12:37:32 +0000 (13:37 +0100)
committerArnaud Giersch <arnaud.giersch@iut-bm.univ-fcomte.fr>
Mon, 28 Nov 2011 10:21:31 +0000 (11:21 +0100)
src/xbt/dynar.c

index 7ac54dd..02392be 100644 (file)
@@ -374,12 +374,10 @@ XBT_INLINE void *xbt_dynar_get_ptr(const xbt_dynar_t dynar,
   return res;
 }
 
   return res;
 }
 
-XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
-                                      const unsigned long idx)
+/* not synchronized */
+static XBT_INLINE void *_xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
+                                              const unsigned long idx)
 {
 {
-
-  void *res;
-  _dynar_lock(dynar);
   _sanity_check_dynar(dynar);
 
   if (idx >= dynar->used) {
   _sanity_check_dynar(dynar);
 
   if (idx >= dynar->used) {
@@ -388,10 +386,16 @@ XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
                    (idx + 1 - dynar->used)*dynar->elmsize);
     dynar->used = idx + 1;
   }
                    (idx + 1 - dynar->used)*dynar->elmsize);
     dynar->used = idx + 1;
   }
-  res = _xbt_dynar_elm(dynar, idx);
+  return _xbt_dynar_elm(dynar, idx);
+}
 
 
+XBT_INLINE void *xbt_dynar_set_at_ptr(const xbt_dynar_t dynar,
+                                      const unsigned long idx)
+{
+  void *res;
+  _dynar_lock(dynar);
+  res = _xbt_dynar_set_at_ptr(dynar, idx);
   _dynar_unlock(dynar);
   _dynar_unlock(dynar);
-
   return res;
 }
 
   return res;
 }
 
@@ -399,17 +403,7 @@ static void XBT_INLINE          /* not synchronized */
 _xbt_dynar_set(xbt_dynar_t dynar,
                const unsigned long idx, const void *const src)
 {
 _xbt_dynar_set(xbt_dynar_t dynar,
                const unsigned long idx, const void *const src)
 {
-
-  _sanity_check_dynar(dynar);
-
-  if (idx >= dynar->used) {
-    _xbt_dynar_expand(dynar, idx + 1);
-    _xbt_clear_mem(((char * const)dynar->data) + dynar->used * dynar->elmsize,
-                   (idx + 1 - dynar->used)*dynar->elmsize);
-    dynar->used = idx + 1;
-  }
-
-  _xbt_dynar_put_elm(dynar, idx, src);
+  memcpy(_xbt_dynar_set_at_ptr(dynar, idx), src, dynar->elmsize);
 }
 
 /** @brief Set the Nth element of a dynar (expanded if needed). Previous value at this position is NOT freed
 }
 
 /** @brief Set the Nth element of a dynar (expanded if needed). Previous value at this position is NOT freed