From 9242eda6c704ab5c10ab07763e662bb2c65b0396 Mon Sep 17 00:00:00 2001 From: Shauren Date: Mon, 29 Jul 2024 22:18:22 +0200 Subject: Core/Misc: Reduce amount of virtual functions and copypasting in Reference<> implementations --- .../shared/Dynamic/LinkedReference/RefManager.h | 12 ++++---- .../shared/Dynamic/LinkedReference/Reference.h | 33 +++++++++++----------- 2 files changed, 23 insertions(+), 22 deletions(-) (limited to 'src/server/shared/Dynamic/LinkedReference') diff --git a/src/server/shared/Dynamic/LinkedReference/RefManager.h b/src/server/shared/Dynamic/LinkedReference/RefManager.h index 5661b5dc95e..0c26d5d0d69 100644 --- a/src/server/shared/Dynamic/LinkedReference/RefManager.h +++ b/src/server/shared/Dynamic/LinkedReference/RefManager.h @@ -21,17 +21,17 @@ #include "Dynamic/LinkedList.h" #include "Dynamic/LinkedReference/Reference.h" -template +template class RefManager : public LinkedListHead { public: - typedef LinkedListHead::Iterator> iterator; - typedef LinkedListHead::Iterator const> const_iterator; + typedef LinkedListHead::Iterator iterator; + typedef LinkedListHead::Iterator const_iterator; RefManager() { } - Reference* getFirst() { return static_cast*>(LinkedListHead::getFirst()); } + ReferenceType* getFirst() { return static_cast(LinkedListHead::getFirst()); } - Reference const* getFirst() const { return static_cast const*>(LinkedListHead::getFirst()); } + ReferenceType const* getFirst() const { return static_cast(LinkedListHead::getFirst()); } iterator begin() { return iterator(getFirst()); } iterator end() { return iterator(nullptr); } @@ -46,7 +46,7 @@ public: void clearReferences() { - while (Reference* ref = getFirst()) + while (ReferenceType* ref = getFirst()) ref->invalidate(); } }; diff --git a/src/server/shared/Dynamic/LinkedReference/Reference.h b/src/server/shared/Dynamic/LinkedReference/Reference.h index 255a510f050..0c86386f5e2 100644 --- a/src/server/shared/Dynamic/LinkedReference/Reference.h +++ b/src/server/shared/Dynamic/LinkedReference/Reference.h @@ -23,24 +23,25 @@ //===================================================== -template class Reference : public LinkedListElement +template class Reference : public LinkedListElement { private: TO* iRefTo; FROM* iRefFrom; protected: + // Notification functions are found by CRTP // Tell our refTo (target) object that we have a link - virtual void targetObjectBuildLink() = 0; + //virtual void targetObjectBuildLink() = 0; // Tell our refTo (taget) object, that the link is cut - virtual void targetObjectDestroyLink() = 0; + //virtual void targetObjectDestroyLink() = 0; // Tell our refFrom (source) object, that the link is cut (Target destroyed) - virtual void sourceObjectDestroyLink() = 0; + //virtual void sourceObjectDestroyLink() = 0; public: Reference() { iRefTo = nullptr; iRefFrom = nullptr; } - virtual ~Reference() { } + ~Reference() { } // Create new link void link(TO* toObj, FROM* fromObj) @@ -52,7 +53,7 @@ template class Reference : public LinkedListElement { iRefTo = toObj; iRefFrom = fromObj; - targetObjectBuildLink(); + static_cast(this)->targetObjectBuildLink(); } } @@ -60,7 +61,7 @@ template class Reference : public LinkedListElement // Tell our refTo object, that the link is cut void unlink() { - targetObjectDestroyLink(); + static_cast(this)->targetObjectDestroyLink(); delink(); iRefTo = nullptr; iRefFrom = nullptr; @@ -70,7 +71,7 @@ template class Reference : public LinkedListElement // Tell our refFrom object, that the link is cut void invalidate() // the iRefFrom MUST remain!! { - sourceObjectDestroyLink(); + static_cast(this)->sourceObjectDestroyLink(); delink(); iRefTo = nullptr; } @@ -80,15 +81,15 @@ template class Reference : public LinkedListElement return iRefTo != nullptr; } - Reference * next() { return((Reference *) LinkedListElement::next()); } - Reference const* next() const { return((Reference const*) LinkedListElement::next()); } - Reference * prev() { return((Reference *) LinkedListElement::prev()); } - Reference const* prev() const { return((Reference const*) LinkedListElement::prev()); } + Derived * next() { return static_cast(LinkedListElement::next()); } + Derived const* next() const { return static_cast(LinkedListElement::next()); } + Derived * prev() { return static_cast(LinkedListElement::prev()); } + Derived const* prev() const { return static_cast(LinkedListElement::prev()); } - Reference * nocheck_next() { return((Reference *) LinkedListElement::nocheck_next()); } - Reference const* nocheck_next() const { return((Reference const*) LinkedListElement::nocheck_next()); } - Reference * nocheck_prev() { return((Reference *) LinkedListElement::nocheck_prev()); } - Reference const* nocheck_prev() const { return((Reference const*) LinkedListElement::nocheck_prev()); } + Derived * nocheck_next() { return static_cast(LinkedListElement::nocheck_next()); } + Derived const* nocheck_next() const { return static_cast(LinkedListElement::nocheck_next()); } + Derived * nocheck_prev() { return static_cast(LinkedListElement::nocheck_prev()); } + Derived const* nocheck_prev() const { return static_cast(LinkedListElement::nocheck_prev()); } TO* operator->() const { return iRefTo; } TO* getTarget() const { return iRefTo; } -- cgit v1.2.3