From 9006386cf22dbd462e75a8db6bf2a7353081e40b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 21 Jan 2024 18:40:27 +0100 Subject: [PATCH] Extend LList (#20555) --- lib/default/TasmotaLList/src/LList.h | 33 +++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/default/TasmotaLList/src/LList.h b/lib/default/TasmotaLList/src/LList.h index 82653448b..4af512b93 100644 --- a/lib/default/TasmotaLList/src/LList.h +++ b/lib/default/TasmotaLList/src/LList.h @@ -59,9 +59,9 @@ public: ~LList() { reset(); } // remove elements - void removeHead(void); // remove first element + T * removeHead(void); // remove first element void reset(void); // remove all elements - void remove(const T * val); + const T * remove(const T * val); // read the list inline bool isEmpty(void) const { return (_head == nullptr) ? true : false; } @@ -77,6 +77,7 @@ public: T & addHead(void); T & addHead(const T &val); T & addToLast(void); + T & insertAt(size_t index); // add an element allocated externally // memory is free by us now -- don't free it! T & addHead(LList_elt * elt); @@ -142,17 +143,21 @@ void LList::reset(void) { } template -void LList::removeHead(void) { +T * LList::removeHead(void) { if (_head) { + T & orginal_head = _head.val; LList_elt * next = _head->next(); delete _head; _head = next; + return orginal_head; + } else { + return nullptr; } } template -void LList::remove(const T * val) { - if (nullptr == val) { return; } +const T * LList::remove(const T * val) { + if (nullptr == val) { return val; } // find element in chain and find pointer before LList_elt **curr_ptr = &_head; while (*curr_ptr) { @@ -164,6 +169,7 @@ void LList::remove(const T * val) { } curr_ptr = &((*curr_ptr)->_next); // move to next element } + return val; } template @@ -201,6 +207,23 @@ T & LList::addToLast(void) { return elt->_val; } +template +T & LList::insertAt(size_t index) { + LList_elt **curr_ptr = &_head; + size_t count = 0; + while (*curr_ptr) { + if (count == index) { + LList_elt * elt = new LList_elt(); // create element + elt->next((*curr_ptr)->next()); + (*curr_ptr)->next(elt); + return elt->_val; + } + curr_ptr = &((*curr_ptr)->_next); + count++; + } + return addToLast(); +} + template T & LList::addToLast(LList_elt * elt) { LList_elt **curr_ptr = &_head;