aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Grids/GridRefManager.h10
-rw-r--r--src/server/game/Grids/GridReference.h12
-rw-r--r--src/server/game/Groups/GroupInstanceRefManager.h17
-rw-r--r--src/server/game/Groups/GroupInstanceReference.h13
-rw-r--r--src/server/game/Groups/GroupRefManager.h8
-rw-r--r--src/server/game/Groups/GroupReference.h14
-rw-r--r--src/server/game/Maps/MapRefManager.h14
-rw-r--r--src/server/game/Maps/MapReference.h15
-rw-r--r--src/server/shared/Dynamic/LinkedList.h2
-rw-r--r--src/server/shared/Dynamic/LinkedReference/RefManager.h12
-rw-r--r--src/server/shared/Dynamic/LinkedReference/Reference.h33
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; }