diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Grids/GridRefManager.h | 10 | ||||
-rw-r--r-- | src/server/game/Grids/GridReference.h | 12 | ||||
-rw-r--r-- | src/server/game/Groups/GroupInstanceRefManager.h | 17 | ||||
-rw-r--r-- | src/server/game/Groups/GroupInstanceReference.h | 13 | ||||
-rw-r--r-- | src/server/game/Groups/GroupRefManager.h | 8 | ||||
-rw-r--r-- | src/server/game/Groups/GroupReference.h | 14 | ||||
-rw-r--r-- | src/server/game/Maps/MapRefManager.h | 14 | ||||
-rw-r--r-- | src/server/game/Maps/MapReference.h | 15 | ||||
-rw-r--r-- | src/server/shared/Dynamic/LinkedList.h | 2 | ||||
-rw-r--r-- | src/server/shared/Dynamic/LinkedReference/RefManager.h | 12 | ||||
-rw-r--r-- | src/server/shared/Dynamic/LinkedReference/Reference.h | 33 |
11 files changed, 53 insertions, 97 deletions
diff --git a/src/server/game/Grids/GridRefManager.h b/src/server/game/Grids/GridRefManager.h index fa2939b4ca7..44945e6c335 100644 --- a/src/server/game/Grids/GridRefManager.h +++ b/src/server/game/Grids/GridRefManager.h @@ -24,15 +24,7 @@ template<class OBJECT> class GridReference; template<class OBJECT> -class GridRefManager : public RefManager<GridRefManager<OBJECT>, OBJECT> +class GridRefManager : public RefManager<GridReference<OBJECT>> { - public: - typedef LinkedListHead::Iterator< GridReference<OBJECT> > iterator; - - GridReference<OBJECT>* getFirst() { return (GridReference<OBJECT>*)RefManager<GridRefManager<OBJECT>, OBJECT>::getFirst(); } - GridReference<OBJECT>* getLast() { return (GridReference<OBJECT>*)RefManager<GridRefManager<OBJECT>, OBJECT>::getLast(); } - - iterator begin() { return iterator(getFirst()); } - iterator end() { return iterator(nullptr); } }; #endif diff --git a/src/server/game/Grids/GridReference.h b/src/server/game/Grids/GridReference.h index e2ae18240e5..78d177addda 100644 --- a/src/server/game/Grids/GridReference.h +++ b/src/server/game/Grids/GridReference.h @@ -24,28 +24,28 @@ template<class OBJECT> class GridRefManager; template<class OBJECT> -class GridReference : public Reference<GridRefManager<OBJECT>, OBJECT> +class GridReference : public Reference<GridRefManager<OBJECT>, OBJECT, GridReference<OBJECT>> { protected: - void targetObjectBuildLink() override + friend Reference<GridRefManager<OBJECT>, OBJECT, GridReference<OBJECT>>; + void targetObjectBuildLink() { // called from link() this->getTarget()->insertFirst(this); this->getTarget()->incSize(); } - void targetObjectDestroyLink() override + void targetObjectDestroyLink() { // called from unlink() if (this->isValid()) this->getTarget()->decSize(); } - void sourceObjectDestroyLink() override + void sourceObjectDestroyLink() { // called from invalidate() this->getTarget()->decSize(); } public: - GridReference() : Reference<GridRefManager<OBJECT>, OBJECT>() { } + GridReference() = default; ~GridReference() { this->unlink(); } - GridReference* next() { return (GridReference*)Reference<GridRefManager<OBJECT>, OBJECT>::next(); } }; #endif diff --git a/src/server/game/Groups/GroupInstanceRefManager.h b/src/server/game/Groups/GroupInstanceRefManager.h index af6015f2355..9a48f34d8a2 100644 --- a/src/server/game/Groups/GroupInstanceRefManager.h +++ b/src/server/game/Groups/GroupInstanceRefManager.h @@ -21,23 +21,8 @@ #include "GroupInstanceReference.h" #include "RefManager.h" -class Group; -class InstanceMap; - -class GroupInstanceRefManager : public RefManager<Group, InstanceMap> +class GroupInstanceRefManager : public RefManager<GroupInstanceReference> { -public: - typedef LinkedListHead::Iterator<GroupInstanceReference> iterator; - typedef LinkedListHead::Iterator<GroupInstanceReference const> const_iterator; - - GroupInstanceReference* getFirst() { return ((GroupInstanceReference*)RefManager<Group, InstanceMap>::getFirst()); } - GroupInstanceReference const* getFirst() const { return ((GroupInstanceReference const*)RefManager<Group, InstanceMap>::getFirst()); } - - iterator begin() { return iterator(getFirst()); } - iterator end() { return iterator(nullptr); } - - const_iterator begin() const { return const_iterator(getFirst()); } - const_iterator end() const { return const_iterator(nullptr); } }; #endif // GroupInstanceRefManager_h__ diff --git a/src/server/game/Groups/GroupInstanceReference.h b/src/server/game/Groups/GroupInstanceReference.h index effe449d453..9dcb3f6ee99 100644 --- a/src/server/game/Groups/GroupInstanceReference.h +++ b/src/server/game/Groups/GroupInstanceReference.h @@ -23,18 +23,17 @@ class Group; class InstanceMap; -class TC_GAME_API GroupInstanceReference : public Reference<Group, InstanceMap> +class TC_GAME_API GroupInstanceReference : public Reference<Group, InstanceMap, GroupInstanceReference> { public: - GroupInstanceReference() : Reference<Group, InstanceMap>() { } + GroupInstanceReference() = default; ~GroupInstanceReference() { unlink(); } - GroupInstanceReference* next() { return (GroupInstanceReference*)Reference<Group, InstanceMap>::next(); } - GroupInstanceReference const* next() const { return (GroupInstanceReference const*)Reference<Group, InstanceMap>::next(); } protected: - void targetObjectBuildLink() override; - void targetObjectDestroyLink() override; - void sourceObjectDestroyLink() override; + friend Reference<Group, InstanceMap, GroupInstanceReference>; + void targetObjectBuildLink(); + void targetObjectDestroyLink(); + void sourceObjectDestroyLink(); }; #endif // GroupInstanceReference_h__ diff --git a/src/server/game/Groups/GroupRefManager.h b/src/server/game/Groups/GroupRefManager.h index acf4b7bb9d6..7acb10581b4 100644 --- a/src/server/game/Groups/GroupRefManager.h +++ b/src/server/game/Groups/GroupRefManager.h @@ -21,13 +21,7 @@ #include "GroupReference.h" #include "RefManager.h" -class Group; -class Player; - -class GroupRefManager : public RefManager<Group, Player> +class GroupRefManager : public RefManager<GroupReference> { - public: - GroupReference* getFirst() { return ((GroupReference*)RefManager<Group, Player>::getFirst()); } - GroupReference const* getFirst() const { return ((GroupReference const*)RefManager<Group, Player>::getFirst()); } }; #endif diff --git a/src/server/game/Groups/GroupReference.h b/src/server/game/Groups/GroupReference.h index f0075e7cd93..3880bfffce2 100644 --- a/src/server/game/Groups/GroupReference.h +++ b/src/server/game/Groups/GroupReference.h @@ -23,18 +23,18 @@ class Group; class Player; -class TC_GAME_API GroupReference : public Reference<Group, Player> +class TC_GAME_API GroupReference : public Reference<Group, Player, GroupReference> { protected: uint8 iSubGroup; - void targetObjectBuildLink() override; - void targetObjectDestroyLink() override; - void sourceObjectDestroyLink() override; + + friend Reference<Group, Player, GroupReference>; + void targetObjectBuildLink(); + void targetObjectDestroyLink(); + void sourceObjectDestroyLink(); public: - GroupReference() : Reference<Group, Player>(), iSubGroup(0) { } + GroupReference() : Reference(), iSubGroup(0) { } ~GroupReference() { unlink(); } - GroupReference* next() { return (GroupReference*)Reference<Group, Player>::next(); } - GroupReference const* next() const { return (GroupReference const*)Reference<Group, Player>::next(); } uint8 getSubGroup() const { return iSubGroup; } void setSubGroup(uint8 pSubGroup) { iSubGroup = pSubGroup; } }; diff --git a/src/server/game/Maps/MapRefManager.h b/src/server/game/Maps/MapRefManager.h index c312f95518a..503caf3acf9 100644 --- a/src/server/game/Maps/MapRefManager.h +++ b/src/server/game/Maps/MapRefManager.h @@ -22,19 +22,7 @@ class MapReference; -class MapRefManager : public RefManager<Map, Player> +class MapRefManager : public RefManager<MapReference> { - public: - typedef LinkedListHead::Iterator<MapReference> iterator; - typedef LinkedListHead::Iterator<MapReference const> const_iterator; - - MapReference* getFirst() { return (MapReference*)RefManager<Map, Player>::getFirst(); } - MapReference const* getFirst() const { return (MapReference const*)RefManager<Map, Player>::getFirst(); } - - iterator begin() { return iterator(getFirst()); } - iterator end() { return iterator(nullptr); } - - const_iterator begin() const { return const_iterator(getFirst()); } - const_iterator end() const { return const_iterator(nullptr); } }; #endif diff --git a/src/server/game/Maps/MapReference.h b/src/server/game/Maps/MapReference.h index 2a9074ac1cd..c674c9aa971 100644 --- a/src/server/game/Maps/MapReference.h +++ b/src/server/game/Maps/MapReference.h @@ -23,18 +23,15 @@ class Map; class Player; -class MapReference : public Reference<Map, Player> +class MapReference : public Reference<Map, Player, MapReference> { protected: - void targetObjectBuildLink() override; - void targetObjectDestroyLink() override; - void sourceObjectDestroyLink() override; + friend Reference<Map, Player, MapReference>; + void targetObjectBuildLink(); + void targetObjectDestroyLink(); + void sourceObjectDestroyLink(); public: - MapReference() : Reference<Map, Player>() { } + MapReference() = default; ~MapReference() { unlink(); } - MapReference* next() { return (MapReference*)Reference<Map, Player>::next(); } - MapReference const* next() const { return (MapReference const*)Reference<Map, Player>::next(); } - MapReference* nockeck_prev() { return (MapReference*)Reference<Map, Player>::nocheck_prev(); } - MapReference const* nocheck_prev() const { return (MapReference const*)Reference<Map, Player>::nocheck_prev(); } }; #endif diff --git a/src/server/shared/Dynamic/LinkedList.h b/src/server/shared/Dynamic/LinkedList.h index 8bfac0347a0..bc4a10da741 100644 --- a/src/server/shared/Dynamic/LinkedList.h +++ b/src/server/shared/Dynamic/LinkedList.h @@ -83,7 +83,7 @@ class LinkedListElement LinkedListElement& operator=(LinkedListElement&&) = delete; protected: - ~LinkedListElement() + virtual ~LinkedListElement() { delink(); } 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 <class TO, class FROM> +template <class ReferenceType> class RefManager : public LinkedListHead { public: - typedef LinkedListHead::Iterator<Reference<TO, FROM>> iterator; - typedef LinkedListHead::Iterator<Reference<TO, FROM> const> const_iterator; + typedef LinkedListHead::Iterator<ReferenceType> iterator; + typedef LinkedListHead::Iterator<ReferenceType const> const_iterator; RefManager() { } - Reference<TO, FROM>* getFirst() { return static_cast<Reference<TO, FROM>*>(LinkedListHead::getFirst()); } + ReferenceType* getFirst() { return static_cast<ReferenceType*>(LinkedListHead::getFirst()); } - Reference<TO, FROM> const* getFirst() const { return static_cast<Reference<TO, FROM> const*>(LinkedListHead::getFirst()); } + ReferenceType const* getFirst() const { return static_cast<ReferenceType const*>(LinkedListHead::getFirst()); } iterator begin() { return iterator(getFirst()); } iterator end() { return iterator(nullptr); } @@ -46,7 +46,7 @@ public: void clearReferences() { - while (Reference<TO, FROM>* 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 TO, class FROM> class Reference : public LinkedListElement +template <class TO, class FROM, class Derived> 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 TO, class FROM> class Reference : public LinkedListElement { iRefTo = toObj; iRefFrom = fromObj; - targetObjectBuildLink(); + static_cast<Derived*>(this)->targetObjectBuildLink(); } } @@ -60,7 +61,7 @@ template <class TO, class FROM> class Reference : public LinkedListElement // Tell our refTo object, that the link is cut void unlink() { - targetObjectDestroyLink(); + static_cast<Derived*>(this)->targetObjectDestroyLink(); delink(); iRefTo = nullptr; iRefFrom = nullptr; @@ -70,7 +71,7 @@ template <class TO, class FROM> class Reference : public LinkedListElement // Tell our refFrom object, that the link is cut void invalidate() // the iRefFrom MUST remain!! { - sourceObjectDestroyLink(); + static_cast<Derived*>(this)->sourceObjectDestroyLink(); delink(); iRefTo = nullptr; } @@ -80,15 +81,15 @@ template <class TO, class FROM> class Reference : public LinkedListElement return iRefTo != nullptr; } - Reference<TO, FROM> * next() { return((Reference<TO, FROM> *) LinkedListElement::next()); } - Reference<TO, FROM> const* next() const { return((Reference<TO, FROM> const*) LinkedListElement::next()); } - Reference<TO, FROM> * prev() { return((Reference<TO, FROM> *) LinkedListElement::prev()); } - Reference<TO, FROM> const* prev() const { return((Reference<TO, FROM> const*) LinkedListElement::prev()); } + Derived * next() { return static_cast<Derived*>(LinkedListElement::next()); } + Derived const* next() const { return static_cast<Derived const*>(LinkedListElement::next()); } + Derived * prev() { return static_cast<Derived*>(LinkedListElement::prev()); } + Derived const* prev() const { return static_cast<Derived const*>(LinkedListElement::prev()); } - Reference<TO, FROM> * nocheck_next() { return((Reference<TO, FROM> *) LinkedListElement::nocheck_next()); } - Reference<TO, FROM> const* nocheck_next() const { return((Reference<TO, FROM> const*) LinkedListElement::nocheck_next()); } - Reference<TO, FROM> * nocheck_prev() { return((Reference<TO, FROM> *) LinkedListElement::nocheck_prev()); } - Reference<TO, FROM> const* nocheck_prev() const { return((Reference<TO, FROM> const*) LinkedListElement::nocheck_prev()); } + Derived * nocheck_next() { return static_cast<Derived*>(LinkedListElement::nocheck_next()); } + Derived const* nocheck_next() const { return static_cast<Derived const*>(LinkedListElement::nocheck_next()); } + Derived * nocheck_prev() { return static_cast<Derived*>(LinkedListElement::nocheck_prev()); } + Derived const* nocheck_prev() const { return static_cast<Derived const*>(LinkedListElement::nocheck_prev()); } TO* operator->() const { return iRefTo; } TO* getTarget() const { return iRefTo; } |