4template <
typename CONTAINER,
typename LIST_ITEM >
5void list_predicateicate_add(CONTAINER& a, LIST_ITEM&& pitem)
8 list_predicate(pitem, [&a](
auto& p) { a.add(p); });
13template <
typename LIST_ITEM >
14::collection::count list_erase_all(LIST_ITEM&& pitem)
16 ::collection::count c = 0;
18 auto pprevious = pitem->m_phead;
23 for (
auto p = pprevious->m_pnext; ::is_set(p); p = p->m_pnext, c++)
26 pprevious->m_pnext =
nullptr;
28 p->m_pprevious =
nullptr;
34 pitem->m_phead =
nullptr;
36 pitem->m_ptail =
nullptr;
43template <
typename LIST_ITEM >
44::collection::count list_count(LIST_ITEM&& pitem)
47 ::collection::count c = 0;
49 for (
auto p = pitem->m_phead; ::is_set(p); p = p->m_pnext, c++);
56template <
typename LIST_ITEM,
typename PRED >
57LIST_ITEM list_predicateicate_find(LIST_ITEM&& plist, PRED pred)
60 for (
auto p = plist->m_phead; ::is_set(p); p = p->m_pnext)
77template <
typename LIST_ITEM,
typename LIST_ITEM2 >
78bool list_contains_item(LIST_ITEM && pitem, LIST_ITEM2 && pitemItem)
81 for (
auto p = pitem->m_phead; ::is_set(p); p = p->m_pnext)
98template <
typename LIST_ITEM,
typename LIST_ITEM2 >
99::collection::index list_item_index(LIST_ITEM&& pitem, LIST_ITEM2&& pitemItem)
102 ::collection::index i = 0;
104 for (
auto p = pitem->m_phead; ::is_set(p); p = p->m_pnext, i++)
132template <
typename LIST_ITEM,
typename LIST_ITEM2,
typename LIST_ITEM3 >
133void list_insert_before(LIST_ITEM&& plist, LIST_ITEM2&& pitem, LIST_ITEM3&& pitemBefore)
136 if (plist->m_phead == pitem)
139 pitem->m_phead = pitemBefore;
143 pitemBefore->m_pprevious = pitem->m_pprevious;
145 pitem->m_pprevious = pitemBefore;
147 pitemBefore->m_pnext = pitem;
152template <
typename LIST_ITEM,
typename LIST_ITEM2,
typename LIST_ITEM3 >
153void list_insert_after(LIST_ITEM&& plist, LIST_ITEM2&& pitem, LIST_ITEM3&& pitemAfter)
156 if (plist->m_ptail == pitem)
159 pitem->m_ptail = pitemAfter;
163 pitemAfter->m_pnext = pitem->m_pnext;
165 pitem->m_pnext = pitemAfter;
167 pitemAfter->m_pprevious = pitem;
172template <
typename LIST_ITEM,
typename LIST_ITEM2,
typename LIST_ITEM3 >
173void list_replace_item(LIST_ITEM&& plist, LIST_ITEM2&& pitem, LIST_ITEM3&& pitemNew)
176 if (plist->m_phead == pitem)
179 pitem->m_phead = pitemNew;
183 if (plist->m_ptail == pitem)
186 pitem->m_ptail = pitemNew;
190 pitemNew->m_pprevious = pitem->m_pprevious;
192 pitemNew->m_pnext = pitem->m_pnext;
194 pitem->m_pprevious =
nullptr;
196 pitem->m_pnext =
nullptr;
198 if (pitemNew->m_pnext)
201 pitemNew->m_pnext->m_pprevious = pitemNew;
205 if (pitemNew->m_pprevious)
208 pitemNew->m_pprevious->m_pnext = pitemNew;
218template <
typename LIST_ITEM,
typename LIST_ITEM2 >
219void list_add(LIST_ITEM&& plist, LIST_ITEM2&& pitemAdd)
225 plist->m_ptail->m_pnext = pitemAdd;
229 pitemAdd->m_pnext =
nullptr;
231 pitemAdd->m_pprevious = plist->m_ptail;
233 plist->m_ptail = pitemAdd;
238 plist->m_phead = plist->m_ptail;
245template <
typename LIST_ITEM,
typename LIST_ITEM2 >
246void list_add_head(LIST_ITEM&& plist, LIST_ITEM2&& pitemAdd)
252 plist->m_phead->m_pprevious = pitemAdd;
256 pitemAdd->m_pprevious =
nullptr;
258 pitemAdd->m_pnext = plist->m_phead;
260 plist->m_phead = pitemAdd;
265 plist->m_ptail = plist->m_phead;
272template <
typename LIST_ITEM,
typename LIST_ITEM2 >
273void list_erase(LIST_ITEM&& pitem, LIST_ITEM2&& pitemRemove)
276 if (pitem->m_phead == pitemRemove)
279 pitem->m_phead = pitemRemove->m_pnext;
283 if (pitem->m_ptail == pitemRemove)
286 pitem->m_ptail = pitemRemove->m_pprevious;
290 if (pitemRemove->m_pnext)
293 pitemRemove->m_pnext->m_pprevious = pitemRemove->m_pprevious;
297 if (pitemRemove->m_pprevious)
300 pitemRemove->m_pprevious->m_pnext = pitemRemove->m_pnext;
308template <
typename LIST_ITEM,
typename PRED >
309void list_predicate(LIST_ITEM* pitem, PRED pred)
312 for (
auto p = pitem->m_phead; ::is_set(p); p = p->m_pnext)
321template <
typename LIST_ITEM,
typename PRED >
322void list_predicateicate_with_index(LIST_ITEM* pitem, PRED pred)
325 ::collection::index i = 0;
327 for (
auto p = pitem->m_phead; ::is_set(p); p = p->m_pnext, i++)
338template <
typename TREE_ITEM,
typename PRED >
339void tree_sort(TREE_ITEM* pitem, PRED pred)
344 list_predicate(pitem, [pred](
auto p) {tree_sort(p, pred); });