From 99be0f51c5f34b9b744c8f84080bdc191d3d7e18 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Mon, 4 Dec 2023 12:34:52 -0500 Subject: [PATCH] Fixes for JGadget/linklist --- include/JSystem/JGadget/linklist.h | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/include/JSystem/JGadget/linklist.h b/include/JSystem/JGadget/linklist.h index aed8e8a3..ac44fba0 100644 --- a/include/JSystem/JGadget/linklist.h +++ b/include/JSystem/JGadget/linklist.h @@ -8,6 +8,10 @@ namespace JGadget { +#define NEGATIVE_OFFSETOF(TYPE, MEMBER) (-static_cast(offsetof(TYPE, MEMBER))) +#define TLINKLIST_NODE_OFS(TYPE) (NEGATIVE_OFFSETOF(TYPE, mNode)) +#define TLinkList(TYPE) TLinkList + namespace { template @@ -172,14 +176,22 @@ inline bool operator!=(TNodeLinkList::const_iterator lhs, TNodeLinkList::const_i /* TODO: TLinkList has not been matched and should be verified */ +template +class TLinkList; + +template +bool operator==(typename TLinkList::iterator lhs, typename TLinkList::iterator rhs); + template class TLinkList : public TNodeLinkList { +public: class iterator { public: iterator(TNodeLinkList::iterator it) : mIt(it) { } - bool operator==(iterator other) { return (mIt == other.mIt); } - bool operator!=(iterator other) { return !(*this == other); } + friend bool operator==(iterator lhs, iterator rhs) { return (lhs.mIt == rhs.mIt); } + friend bool operator!=(iterator lhs, iterator rhs) { return !(lhs == rhs); } + iterator& operator++() { ++mIt; return *this; @@ -205,8 +217,9 @@ class TLinkList : public TNodeLinkList { public: const_iterator(TNodeLinkList::const_iterator it) : mIt(it) { } - bool operator==(const_iterator other) { return (mIt == other.mIt); } - bool operator!=(const_iterator other) { return !(*this == other); } + friend bool operator== (const_iterator lhs, const_iterator rhs) { return (lhs.mIt == rhs.mIt); } + friend bool operator!= (const_iterator lhs, const_iterator rhs) { return !(lhs == rhs); } + const_iterator& operator++() { ++mIt; return *this; @@ -230,7 +243,7 @@ class TLinkList : public TNodeLinkList { iterator Find(const T* p) { return TNodeLinkList::Find(TLinkList::Element_toNode(p)); } iterator Erase( T* p) { return TNodeLinkList::Erase(Element_toNode(p)); } - iterator Insert(iterator it, T* p) { return TNodeLinkList::Insert(it, Element_toNode(p)); } + iterator Insert(iterator it, T* p) { return TNodeLinkList::Insert(it.mIt, Element_toNode(p)); } void Remove(T* p) { TNodeLinkList::Remove(TLinkList::Element_toNode(p)); } void Push_front(T* p) { Insert(begin(), p); } void Push_back(T* p) { Insert(end(), p); }