From 5fcf57739e68a8b5053e03778aaee0eed445babd Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Thu, 11 Mar 2021 22:00:22 -0500 Subject: settings editor, and lots of changes in service of that --- src/user/include/cxx/structs/dllist.h | 38 ++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'src/user/include/cxx/structs/dllist.h') diff --git a/src/user/include/cxx/structs/dllist.h b/src/user/include/cxx/structs/dllist.h index 5783364..91b0369 100644 --- a/src/user/include/cxx/structs/dllist.h +++ b/src/user/include/cxx/structs/dllist.h @@ -1,6 +1,8 @@ #ifndef STRUCTS_DLLIST_H #define STRUCTS_DLLIST_H +#include + template class dllist { public: @@ -13,20 +15,34 @@ public: : next(next), prev(prev), d(d) {} }; node *first; + node *last; - dllist() : first(0) {} + dllist() : first(0), last(0) {} void add_front(data d) { node *const n = new node(first, 0, d); if (first) first->prev = n; first = n; + if (!last) + last = n; + } + + void add_back(data d) { + node *const n = new node(0, last, d); + if (last) + last->next = n; + last = n; + if (!first) + first = n; } //return previous, or zero if this is the first node *remove_in_place(node *n) { if (n == first) first = n->next; + if (n == last) + last = n->prev; if (n->next) n->next->prev = n->prev; if (n->prev) @@ -34,6 +50,26 @@ public: delete n; return n->prev; } + + bool try_remove_by_ref(data d) { + for (node *n = first; n; n = n->next) + if (&n->d == &d) { + remove_in_place(n); + return true; + } + return false; + } + + //returns -1 if it isn't found + uint32_t index_of(data d) { + uint32_t i = 0; + for (const node *n = first; n; n = n->next) + if (d == n->d) + return i; + else + ++i; + return -1; + } }; #endif \ No newline at end of file -- cgit v1.2.3