cpp: avoid a gazillion calls to memcpy/memmove
[m6w6/ext-psi] / src / plist.c
index 38cde5b435c3d1b7e6d16ff844ca4b180c735482..699db2c6dbc7b454cae187624fec109887a09412 100644 (file)
@@ -42,6 +42,7 @@ struct psi_plist {
                memcpy(dest, src, list->size); \
        } \
 } while (0)
+#define PLIST_CPY_R(list, dest, src, num) memcpy((dest), (src), (num) * (list)->size)
 /* !!! adjust list->count prior reduction */
 #define PLIST_MOV_REDUCE(l, i) PLIST_MOV_REDUCE_EX(l, i, 1)
 #define PLIST_MOV_REDUCE_EX(l, i, n) memmove(PLIST_ELE(l, i), PLIST_ELE(l, (i) + (n)), (l)->size * ((l)->count - (i)))
@@ -139,6 +140,14 @@ bool psi_plist_get(struct psi_plist *list, size_t index, void *ptr) {
        return false;
 }
 
+bool psi_plist_unset(struct psi_plist *list, size_t index) {
+       if (list && list->count > index) {
+               memset(PLIST_ELE(list, index), 0, list->size);
+               return true;
+       }
+       return false;
+}
+
 bool psi_plist_del(struct psi_plist *list, size_t index, void *ptr) {
        if (list && list->count > index) {
                if (ptr) {
@@ -204,9 +213,7 @@ struct psi_plist *psi_plist_ins_r(struct psi_plist *list, size_t offset_start, s
                        size_t e;
 
                        PLIST_MOV_EXPAND_EX(list, offset_start, num_eles);
-                       for (e = 0; e < num_eles; ++e) {
-                               PLIST_CPY(list, PLIST_ELE(list, offset_start + e), &eles[e]);
-                       }
+                       PLIST_CPY_R(list, PLIST_ELE(list, offset_start), eles, num_eles);
                        list->count = new_count;
                }
        }