} while (0)
/* !!! 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))
+#define PLIST_MOV_REDUCE_EX(l, i, n) memmove(PLIST_ELE(l, i), PLIST_ELE(l, (i) + (n)), (l)->size * ((l)->count - (i)))
/* !!! adjust list->count after expansion */
#define PLIST_MOV_EXPAND(l, i) PLIST_MOV_EXPAND_EX(l, i, 1)
-#define PLIST_MOV_EXPAND_EX(l, i, n) memmove(PLIST_ELE(l, i + n), PLIST_ELE(l, i), (l)->size * ((l)->count - i))
+#define PLIST_MOV_EXPAND_EX(l, i, n) memmove(PLIST_ELE(l, (i) + (n)), PLIST_ELE(l, i), (l)->size * ((l)->count - (i)))
struct psi_plist *psi_plist_init(void (*dtor)(void *)) {
return psi_plist_init_ex(0, dtor);
return list;
}
-void psi_plist_free(struct psi_plist *list) {
+void psi_plist_clean(struct psi_plist *list) {
size_t i;
if (list->dtor) for (i = 0; i < list->count; ++i) {
list->dtor(PLIST_ELE(list, i));
}
+ list->count = 0;
+}
+
+void psi_plist_free(struct psi_plist *list) {
+ psi_plist_clean(list);
free(list);
}
return list;
}
+struct psi_plist *psi_plist_add_r(struct psi_plist *list, size_t num_eles, void **eles) {
+ if (list && list->count) {
+ list = realloc(list, sizeof(*list) + list->size + (num_eles + list->count) * list->size);
+ }
+ if (list) {
+ memcpy(PLIST_ELE(list, list->count), eles, num_eles * list->size);
+ list->count += num_eles;
+ }
+ return list;
+}
+
bool psi_plist_get(struct psi_plist *list, size_t index, void *ptr) {
if (list && list->count > index) {
PLIST_CPY(list, ptr, PLIST_ELE(list, index));
return false;
}
-bool psi_plist_del_range(struct psi_plist *list, size_t offset_start, size_t num_eles, void **eles) {
+bool psi_plist_del_r(struct psi_plist *list, size_t offset_start, size_t num_eles, void **eles) {
if (list) {
size_t offset_end = offset_start + num_eles - 1;
if (eles) {
memcpy(eles, PLIST_ELE(list, offset_start), num_eles * list->size);
}
-
+ assert(list->count >= num_eles);
if ((list->count -= num_eles)) {
PLIST_MOV_REDUCE_EX(list, offset_start, num_eles);
}
}
struct psi_plist *psi_plist_ins(struct psi_plist *list, size_t index, void *ptr) {
- size_t new_count = MAX(list->count + 1, index);
+ size_t new_count;
- if (list && new_count) {
- list = realloc(list, sizeof(*list) + list->size + new_count * list->size);
- }
if (list) {
- PLIST_MOV_EXPAND(list, index);
- PLIST_CPY(list, PLIST_ELE(list, index), ptr);
- list->count = new_count;
+ new_count = MAX(list->count + 1, index);
+ if (new_count) {
+ list = realloc(list, sizeof(*list) + list->size + new_count * list->size);
+ }
+ if (list) {
+ PLIST_MOV_EXPAND(list, index);
+ PLIST_CPY(list, PLIST_ELE(list, index), ptr);
+ list->count = new_count;
+ }
}
return list;
}
-struct psi_plist *psi_plist_ins_range(struct psi_plist *list, size_t offset_start, size_t num_eles, void **eles) {
- size_t new_count = MAX(offset_start, list->count) + num_eles;
+struct psi_plist *psi_plist_ins_r(struct psi_plist *list, size_t offset_start, size_t num_eles, void **eles) {
+ size_t new_count;
- if (list && new_count) {
- list = realloc(list, sizeof(*list) + list->size + new_count * list->size);
- }
if (list) {
- size_t e;
+ new_count = MAX(offset_start, list->count) + num_eles;
+ if (new_count) {
+ list = realloc(list, sizeof(*list) + list->size + new_count * list->size);
+ }
+ if (list) {
+ 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_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]);
+ }
+ list->count = new_count;
}
- list->count = new_count;
}
return list;
}