+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 (list->count <= offset_end) {
+ offset_end = list->count - 1;
+ }
+ if (offset_end >= offset_start) {
+ num_eles = 1 + offset_end - offset_start;
+
+ 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);
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+struct psi_plist *psi_plist_ins(struct psi_plist *list, size_t index, void *ptr) {
+ size_t new_count;
+
+ if (list) {
+ 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_r(struct psi_plist *list, size_t offset_start, size_t num_eles, void **eles) {
+ size_t new_count;
+
+ if (list) {
+ 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]);
+ }
+ list->count = new_count;
+ }
+ }
+ return list;
+}
+