aboutsummaryrefslogtreecommitdiff
path: root/src/server/shared/Dynamic
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/shared/Dynamic')
-rw-r--r--src/server/shared/Dynamic/CountedReference/Reference.h100
-rw-r--r--src/server/shared/Dynamic/CountedReference/ReferenceHolder.h42
-rw-r--r--src/server/shared/Dynamic/CountedReference/ReferenceImpl.h133
-rw-r--r--src/server/shared/Dynamic/FactoryHolder.h63
-rw-r--r--src/server/shared/Dynamic/LinkedList.h247
-rw-r--r--src/server/shared/Dynamic/LinkedReference/RefManager.h58
-rw-r--r--src/server/shared/Dynamic/LinkedReference/Reference.h94
-rw-r--r--src/server/shared/Dynamic/ObjectRegistry.h111
-rw-r--r--src/server/shared/Dynamic/TypeContainer.h126
-rw-r--r--src/server/shared/Dynamic/TypeContainerFunctions.h116
-rw-r--r--src/server/shared/Dynamic/TypeContainerFunctionsPtr.h170
-rw-r--r--src/server/shared/Dynamic/TypeContainerVisitor.h119
-rw-r--r--src/server/shared/Dynamic/TypeList.h46
-rw-r--r--src/server/shared/Dynamic/UnorderedMap.h73
14 files changed, 1498 insertions, 0 deletions
diff --git a/src/server/shared/Dynamic/CountedReference/Reference.h b/src/server/shared/Dynamic/CountedReference/Reference.h
new file mode 100644
index 00000000000..d3cfe55ffc0
--- /dev/null
+++ b/src/server/shared/Dynamic/CountedReference/Reference.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_REFERENCE_H
+#define TRINITY_REFERENCE_H
+
+/**
+ * Referencer<T>
+ * Referencer is an object that holds a reference holder that hold a reference
+ * counted object. When an object's reference count drop to zero, it removes
+ * the object. This is a non intrusive mechanism and any object at any point
+ * in time can be referenced. When and object is reference counted, do not
+ * pass the object directly to other methods but rather, pass its
+ * reference around. Objects can be reference counted in both single threaded
+ * model and multi-threaded model
+ */
+
+#include <stdexcept>
+#include "Platform/Define.h"
+#include "Policies/ThreadingModel.h"
+#include "ReferenceHolder.h"
+
+template
+<
+typename T,
+class THREADING_MODEL = Trinity::SingleThreaded<T>
+>
+class Referencer
+{
+ typedef typename THREADING_MODEL::Lock Lock;
+ typedef ReferenceHolder<T, THREADING_MODEL> ReferenceeHolder;
+ public:
+
+ /// Constructs a referencer.
+ Referencer(T *ref = NULL);
+
+ /// Copy constructor
+ Referencer(const Referencer &obj) : i_holder(NULL) { *this = obj; }
+
+ /// Destructor
+ ~Referencer();
+
+ /// Referencee accessor
+ T* referencee(void) { return (i_holder == NULL ? NULL : i_holder->i_referencee); }
+ const T* referencee(void) const { return (i_holder == NULL ? NULL : i_holder->i_referencee); }
+
+ //T& referencee(void){ return _referencee(); }
+ //const T& referencee(void) const { return const_cast<Referencer *>(this)->_referencee(); }
+ operator T&(void) { return _referencee(); }
+ operator const T&(void) const { return *const_cast<Referencer *>(this)->_referencee(); }
+
+ /// cast operators
+ T* operator*() { return (i_holder == NULL ? NULL : i_holder->i_referencee); }
+ T const * operator*() const { return (i_holder == NULL ? NULL : i_holder->i_referencee); }
+
+ /// overload operators
+ T* operator->() { return (i_holder == NULL ? NULL : i_holder->i_referencee); }
+ const T * operator->() const { return (i_holder == NULL ? NULL : i_holder->i_referencee); }
+
+ /// operator =
+ Referencer& operator=(const Referencer &obj);
+ Referencer& operator=(T *);
+
+ /// returns true if i_referencee is null
+ bool isNull(void) const { return i_holder == NULL; }
+
+ private:
+
+ T& _referencee(void)
+ {
+ if( i_holder == NULL )
+ throw std::runtime_error("Invalid access to null pointer");
+ return *i_holder->i_referencee;
+ }
+
+ void deReference(ReferenceeHolder *);
+ void addReference(ReferenceeHolder *);
+
+ // private data
+ ReferenceeHolder *i_holder;
+};
+#endif
+
diff --git a/src/server/shared/Dynamic/CountedReference/ReferenceHolder.h b/src/server/shared/Dynamic/CountedReference/ReferenceHolder.h
new file mode 100644
index 00000000000..597e9854be0
--- /dev/null
+++ b/src/server/shared/Dynamic/CountedReference/ReferenceHolder.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_REFERENCEHOLDER_H
+#define TRINITY_REFERENCEHOLDER_H
+
+/** ReferenceHolder holds the actualy referenced obejct as well the refence
+ count. The ReferenecHolder implements as a policy base object and
+ will decided by the Reference class to be consnsitent.
+ */
+
+template
+<
+typename T,
+class THREADING_MODEL
+>
+struct ReferenceHolder : public THREADING_MODEL
+{
+ explicit ReferenceHolder(T *ref) : i_referencee(ref), i_referenceCount(0) {}
+ T *i_referencee;
+ unsigned int i_referenceCount;
+ typedef typename THREADING_MODEL::Lock Lock;
+};
+#endif
+
diff --git a/src/server/shared/Dynamic/CountedReference/ReferenceImpl.h b/src/server/shared/Dynamic/CountedReference/ReferenceImpl.h
new file mode 100644
index 00000000000..cde330179e3
--- /dev/null
+++ b/src/server/shared/Dynamic/CountedReference/ReferenceImpl.h
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_REFERENCEIMPL_H
+#define TRINITY_REFERENCEIMPL_H
+
+#include "Reference.h"
+
+template
+<
+typename T,
+class THREADING_MODEL
+>
+Referencer<T, THREADING_MODEL>::Referencer(T *ref)
+: i_holder(NULL)
+{
+ if( ref != NULL )
+ {
+ i_holder = new ReferenceeHolder(ref);
+ ++i_holder->i_referenceCount;
+ }
+}
+
+template
+<
+typename T,
+class THREADING_MODEL
+>
+Referencer<T, THREADING_MODEL>::~Referencer()
+{
+ if( i_holder != NULL )
+ deReference(i_holder);
+ i_holder = NULL;
+}
+
+template
+<
+typename T,
+class THREADING_MODEL
+>
+Referencer<T, THREADING_MODEL>&
+Referencer<T, THREADING_MODEL>::operator=(const Referencer<T, THREADING_MODEL> &obj)
+{
+ if( i_holder != NULL )
+ deReference(i_holder);
+ if( obj.i_holder != NULL )
+ addReference(obj.i_holder);
+ i_holder = obj.i_holder;
+ return *this;
+}
+
+template
+<
+typename T,
+class THREADING_MODEL
+>
+Referencer<T, THREADING_MODEL>&
+Referencer<T, THREADING_MODEL>::operator=(T *ref)
+{
+ if( i_holder != NULL )
+ deReference(i_holder);
+ i_holder = NULL;
+ if( ref != NULL )
+ {
+ i_holder = new ReferenceeHolder(ref);
+ ++i_holder->i_referenceCount;
+ }
+
+ return *this;
+}
+
+template
+<
+typename T,
+class THREADING_MODEL
+>
+void
+Referencer<T, THREADING_MODEL>::deReference(ReferenceHolder<T, THREADING_MODEL> *holder)
+{
+ assert( holder != NULL && holder->i_referenceCount > 0);
+ bool delete_object = false;
+
+ {
+ // The guard is within the scope due to the guard
+ // must release earlier than expected.
+ Lock guard(*holder);
+ Guard(&guard);
+
+ --holder->i_referenceCount;
+ if( holder->i_referenceCount == 0 )
+ delete_object = true;
+ }
+
+ if( delete_object )
+ {
+ delete holder->i_referencee;
+ delete holder;
+ }
+}
+
+template
+<
+typename T,
+class THREADING_MODEL
+>
+void
+Referencer<T, THREADING_MODEL>::addReference(ReferenceHolder<T, THREADING_MODEL> *holder)
+{
+ assert( i_holder != NULL );
+ Lock guard(*holder);
+ Guard(&guard);
+
+ ++holder->i_referenceCount;
+}
+#endif
+
diff --git a/src/server/shared/Dynamic/FactoryHolder.h b/src/server/shared/Dynamic/FactoryHolder.h
new file mode 100644
index 00000000000..282968d6097
--- /dev/null
+++ b/src/server/shared/Dynamic/FactoryHolder.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_FACTORY_HOLDER
+#define TRINITY_FACTORY_HOLDER
+
+#include "Platform/Define.h"
+#include "Utilities/TypeList.h"
+#include "ObjectRegistry.h"
+#include "Policies/SingletonImp.h"
+
+/** FactoryHolder holds a factory object of a specific type
+ */
+template<class T, class Key = std::string>
+class FactoryHolder
+{
+ public:
+ typedef ObjectRegistry<FactoryHolder<T, Key >, Key > FactoryHolderRegistry;
+ typedef Trinity::Singleton<FactoryHolderRegistry > FactoryHolderRepository;
+
+ FactoryHolder(Key k) : i_key(k) {}
+ virtual ~FactoryHolder() {}
+ inline Key key() const { return i_key; }
+
+ void RegisterSelf(void) { FactoryHolderRepository::Instance().InsertItem(this, i_key); }
+ void DeregisterSelf(void) { FactoryHolderRepository::Instance().RemoveItem(this, false); }
+
+ /// Abstract Factory create method
+ virtual T* Create(void *data = NULL) const = 0;
+ private:
+ Key i_key;
+};
+
+/** Permissible is a classic way of letting the object decide
+ * whether how good they handle things. This is not retricted
+ * to factory selectors.
+ */
+template<class T>
+class Permissible
+{
+ public:
+ virtual ~Permissible() {}
+ virtual int Permit(const T *) const = 0;
+};
+#endif
+
diff --git a/src/server/shared/Dynamic/LinkedList.h b/src/server/shared/Dynamic/LinkedList.h
new file mode 100644
index 00000000000..b26687767b3
--- /dev/null
+++ b/src/server/shared/Dynamic/LinkedList.h
@@ -0,0 +1,247 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _LINKEDLIST
+#define _LINKEDLIST
+
+#include "Common.h"
+
+//============================================
+class LinkedListHead;
+
+class LinkedListElement
+{
+ private:
+ friend class LinkedListHead;
+
+ LinkedListElement* iNext;
+ LinkedListElement* iPrev;
+ public:
+ LinkedListElement() { iNext = NULL; iPrev = NULL; }
+ ~LinkedListElement() { delink(); }
+
+ bool hasNext() const { return(iNext && iNext->iNext != NULL); }
+ bool hasPrev() const { return(iPrev && iPrev->iPrev != NULL); }
+ bool isInList() const { return(iNext != NULL && iPrev != NULL); }
+
+ LinkedListElement * next() { return hasNext() ? iNext : NULL; }
+ LinkedListElement const* next() const { return hasNext() ? iNext : NULL; }
+ LinkedListElement * prev() { return hasPrev() ? iPrev : NULL; }
+ LinkedListElement const* prev() const { return hasPrev() ? iPrev : NULL; }
+
+ LinkedListElement * nocheck_next() { return iNext; }
+ LinkedListElement const* nocheck_next() const { return iNext; }
+ LinkedListElement * nocheck_prev() { return iPrev; }
+ LinkedListElement const* nocheck_prev() const { return iPrev; }
+
+ void delink()
+ {
+ if(isInList())
+ {
+ iNext->iPrev = iPrev; iPrev->iNext = iNext; iNext = NULL; iPrev = NULL;
+ }
+ }
+
+ void insertBefore(LinkedListElement* pElem)
+ {
+ pElem->iNext = this;
+ pElem->iPrev = iPrev;
+ iPrev->iNext = pElem;
+ iPrev = pElem;
+ }
+
+ void insertAfter(LinkedListElement* pElem)
+ {
+ pElem->iPrev = this;
+ pElem->iNext = iNext;
+ iNext->iPrev = pElem;
+ iNext = pElem;
+ }
+};
+
+//============================================
+
+class LinkedListHead
+{
+ private:
+ LinkedListElement iFirst;
+ LinkedListElement iLast;
+ uint32 iSize;
+ public:
+ LinkedListHead()
+ {
+ // create empty list
+
+ iFirst.iNext = &iLast;
+ iLast.iPrev = &iFirst;
+ iSize = 0;
+ }
+
+ bool isEmpty() const { return(!iFirst.iNext->isInList()); }
+
+ LinkedListElement * getFirst() { return(isEmpty() ? NULL : iFirst.iNext); }
+ LinkedListElement const* getFirst() const { return(isEmpty() ? NULL : iFirst.iNext); }
+
+ LinkedListElement * getLast() { return(isEmpty() ? NULL : iLast.iPrev); }
+ LinkedListElement const* getLast() const { return(isEmpty() ? NULL : iLast.iPrev); }
+
+ void insertFirst(LinkedListElement* pElem)
+ {
+ iFirst.insertAfter(pElem);
+ }
+
+ void insertLast(LinkedListElement* pElem)
+ {
+ iLast.insertBefore(pElem);
+ }
+
+ uint32 getSize() const
+ {
+ if(!iSize)
+ {
+ uint32 result = 0;
+ LinkedListElement const* e = getFirst();
+ while(e)
+ {
+ ++result;
+ e = e->next();
+ }
+ return result;
+ }
+ else
+ return iSize;
+ }
+
+ void incSize() { ++iSize; }
+ void decSize() { --iSize; }
+
+ template<class _Ty>
+ class Iterator
+ {
+ public:
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef _Ty value_type;
+ typedef ptrdiff_t difference_type;
+ typedef ptrdiff_t distance_type;
+ typedef _Ty* pointer;
+ typedef _Ty const* const_pointer;
+ typedef _Ty& reference;
+ typedef _Ty const & const_reference;
+
+ Iterator() : _Ptr(0)
+ { // construct with null node pointer
+ }
+
+ Iterator(pointer _Pnode) : _Ptr(_Pnode)
+ { // construct with node pointer _Pnode
+ }
+
+ Iterator& operator=(Iterator const &_Right)
+ {
+ return (*this) = _Right._Ptr;
+ }
+
+ Iterator& operator=(const_pointer const &_Right)
+ {
+ _Ptr = (pointer)_Right;
+ return (*this);
+ }
+
+ reference operator*()
+ { // return designated value
+ return *_Ptr;
+ }
+
+ pointer operator->()
+ { // return pointer to class object
+ return _Ptr;
+ }
+
+ Iterator& operator++()
+ { // preincrement
+ _Ptr = _Ptr->next();
+ return (*this);
+ }
+
+ Iterator operator++(int)
+ { // postincrement
+ iterator _Tmp = *this;
+ ++*this;
+ return (_Tmp);
+ }
+
+ Iterator& operator--()
+ { // predecrement
+ _Ptr = _Ptr->prev();
+ return (*this);
+ }
+
+ Iterator operator--(int)
+ { // postdecrement
+ iterator _Tmp = *this;
+ --*this;
+ return (_Tmp);
+ }
+
+ bool operator==(Iterator const &_Right) const
+ { // test for iterator equality
+ return (_Ptr == _Right._Ptr);
+ }
+
+ bool operator!=(Iterator const &_Right) const
+ { // test for iterator inequality
+ return (!(*this == _Right));
+ }
+
+ bool operator==(pointer const &_Right) const
+ { // test for pointer equality
+ return (_Ptr != _Right);
+ }
+
+ bool operator!=(pointer const &_Right) const
+ { // test for pointer equality
+ return (!(*this == _Right));
+ }
+
+ bool operator==(const_reference _Right) const
+ { // test for reference equality
+ return (_Ptr == &_Right);
+ }
+
+ bool operator!=(const_reference _Right) const
+ { // test for reference equality
+ return (_Ptr != &_Right);
+ }
+
+ pointer _Mynode()
+ { // return node pointer
+ return (_Ptr);
+ }
+
+ protected:
+ pointer _Ptr; // pointer to node
+ };
+
+ typedef Iterator<LinkedListElement> iterator;
+};
+
+//============================================
+#endif
+
diff --git a/src/server/shared/Dynamic/LinkedReference/RefManager.h b/src/server/shared/Dynamic/LinkedReference/RefManager.h
new file mode 100644
index 00000000000..7e294b4f5f0
--- /dev/null
+++ b/src/server/shared/Dynamic/LinkedReference/RefManager.h
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _REFMANAGER_H
+#define _REFMANAGER_H
+//=====================================================
+
+#include "Utilities/LinkedList.h"
+#include "Utilities/LinkedReference/Reference.h"
+
+template <class TO, class FROM> class RefManager : public LinkedListHead
+{
+ public:
+ typedef LinkedListHead::Iterator< Reference<TO, FROM> > iterator;
+ RefManager() { }
+ virtual ~RefManager() { clearReferences(); }
+
+ Reference<TO, FROM>* getFirst() { return ((Reference<TO, FROM>*) LinkedListHead::getFirst()); }
+ Reference<TO, FROM> const* getFirst() const { return ((Reference<TO, FROM> const*) LinkedListHead::getFirst()); }
+ Reference<TO, FROM>* getLast() { return ((Reference<TO, FROM>*) LinkedListHead::getLast()); }
+ Reference<TO, FROM> const* getLast() const { return ((Reference<TO, FROM> const*) LinkedListHead::getLast()); }
+
+ iterator begin() { return iterator(getFirst()); }
+ iterator end() { return iterator(NULL); }
+ iterator rbegin() { return iterator(getLast()); }
+ iterator rend() { return iterator(NULL); }
+
+ void clearReferences()
+ {
+ LinkedListElement* ref;
+ while((ref = getFirst()) != NULL)
+ {
+ ((Reference<TO, FROM>*) ref)->invalidate();
+ ref->delink(); // the delink might be already done by invalidate(), but doing it here again does not hurt and insures an empty list
+ }
+ }
+};
+
+//=====================================================
+#endif
+
diff --git a/src/server/shared/Dynamic/LinkedReference/Reference.h b/src/server/shared/Dynamic/LinkedReference/Reference.h
new file mode 100644
index 00000000000..4a1545f8f12
--- /dev/null
+++ b/src/server/shared/Dynamic/LinkedReference/Reference.h
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _REFERENCE_H
+#define _REFERENCE_H
+
+#include "Utilities/LinkedList.h"
+
+//=====================================================
+
+template <class TO, class FROM> class Reference : public LinkedListElement
+{
+ private:
+ TO* iRefTo;
+ FROM* iRefFrom;
+ protected:
+ // Tell our refTo (target) object that we have a link
+ virtual void targetObjectBuildLink() = 0;
+
+ // Tell our refTo (taget) object, that the link is cut
+ virtual void targetObjectDestroyLink() = 0;
+
+ // Tell our refFrom (source) object, that the link is cut (Target destroyed)
+ virtual void sourceObjectDestroyLink() = 0;
+ public:
+ Reference() { iRefTo = NULL; iRefFrom = NULL; }
+ virtual ~Reference() {}
+
+ // Create new link
+ void link(TO* toObj, FROM* fromObj)
+ {
+ assert(fromObj); // fromObj MUST not be NULL
+ if(isValid())
+ unlink();
+ if(toObj != NULL)
+ {
+ iRefTo = toObj;
+ iRefFrom = fromObj;
+ targetObjectBuildLink();
+ }
+ }
+
+ // We don't need the reference anymore. Call comes from the refFrom object
+ // Tell our refTo object, that the link is cut
+ void unlink() { targetObjectDestroyLink(); delink(); iRefTo = NULL; iRefFrom = NULL; }
+
+ // Link is invalid due to destruction of referenced target object. Call comes from the refTo object
+ // Tell our refFrom object, that the link is cut
+ void invalidate() // the iRefFrom MUST remain!!
+ {
+ sourceObjectDestroyLink(); delink(); iRefTo = NULL;
+ }
+
+ bool isValid() const // Only check the iRefTo
+ {
+ return iRefTo != NULL;
+ }
+
+ 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()); }
+
+ 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()); }
+
+ TO* operator ->() const { return iRefTo; }
+ TO* getTarget() const { return iRefTo; }
+
+ FROM* getSource() const { return iRefFrom; }
+};
+
+//=====================================================
+#endif
+
diff --git a/src/server/shared/Dynamic/ObjectRegistry.h b/src/server/shared/Dynamic/ObjectRegistry.h
new file mode 100644
index 00000000000..e6619427885
--- /dev/null
+++ b/src/server/shared/Dynamic/ObjectRegistry.h
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_OBJECTREGISTRY_H
+#define TRINITY_OBJECTREGISTRY_H
+
+#include "Platform/Define.h"
+#include "Utilities/UnorderedMap.h"
+#include "Policies/Singleton.h"
+
+#include <string>
+#include <vector>
+#include <map>
+
+/** ObjectRegistry holds all registry item of the same type
+ */
+template<class T, class Key = std::string>
+class ObjectRegistry
+{
+ public:
+ typedef std::map<Key, T *> RegistryMapType;
+
+ /// Returns a registry item
+ const T* GetRegistryItem(Key key) const
+ {
+ typename RegistryMapType::const_iterator iter = i_registeredObjects.find(key);
+ return( iter == i_registeredObjects.end() ? NULL : iter->second );
+ }
+
+ /// Inserts a registry item
+ bool InsertItem(T *obj, Key key, bool override = false)
+ {
+ typename RegistryMapType::iterator iter = i_registeredObjects.find(key);
+ if( iter != i_registeredObjects.end() )
+ {
+ if( !override )
+ return false;
+ delete iter->second;
+ i_registeredObjects.erase(iter);
+ }
+
+ i_registeredObjects[key] = obj;
+ return true;
+ }
+
+ /// Removes a registry item
+ void RemoveItem(Key key, bool delete_object = true)
+ {
+ typename RegistryMapType::iterator iter = i_registeredObjects.find(key);
+ if( iter != i_registeredObjects.end() )
+ {
+ if( delete_object )
+ delete iter->second;
+ i_registeredObjects.erase(iter);
+ }
+ }
+
+ /// Returns true if registry contains an item
+ bool HasItem(Key key) const
+ {
+ return (i_registeredObjects.find(key) != i_registeredObjects.end());
+ }
+
+ /// Inefficiently return a vector of registered items
+ unsigned int GetRegisteredItems(std::vector<Key> &l) const
+ {
+ unsigned int sz = l.size();
+ l.resize(sz + i_registeredObjects.size());
+ for (typename RegistryMapType::const_iterator iter = i_registeredObjects.begin(); iter != i_registeredObjects.end(); ++iter)
+ l[sz++] = iter->first;
+ return i_registeredObjects.size();
+ }
+
+ /// Return the map of registered items
+ RegistryMapType const &GetRegisteredItems() const
+ {
+ return i_registeredObjects;
+ }
+
+ private:
+ RegistryMapType i_registeredObjects;
+ friend class Trinity::OperatorNew<ObjectRegistry<T, Key> >;
+
+ // protected for friend use since it should be a singleton
+ ObjectRegistry() {}
+ ~ObjectRegistry()
+ {
+ for (typename RegistryMapType::iterator iter=i_registeredObjects.begin(); iter != i_registeredObjects.end(); ++iter)
+ delete iter->second;
+ i_registeredObjects.clear();
+ }
+};
+#endif
+
diff --git a/src/server/shared/Dynamic/TypeContainer.h b/src/server/shared/Dynamic/TypeContainer.h
new file mode 100644
index 00000000000..c2c9b4fcdea
--- /dev/null
+++ b/src/server/shared/Dynamic/TypeContainer.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_TYPECONTAINER_H
+#define TRINITY_TYPECONTAINER_H
+
+/*
+ * Here, you'll find a series of containers that allow you to hold multiple
+ * types of object at the same time.
+ */
+
+#include <map>
+#include <vector>
+#include "Platform/Define.h"
+#include "Utilities/TypeList.h"
+#include "GameSystem/GridRefManager.h"
+
+/*
+ * @class ContainerMapList is a mulit-type container for map elements
+ * By itself its meaningless but collaborate along with TypeContainers,
+ * it become the most powerfully container in the whole system.
+ */
+template<class OBJECT> struct ContainerMapList
+{
+ //std::map<OBJECT_HANDLE, OBJECT *> _element;
+ GridRefManager<OBJECT> _element;
+};
+
+template<> struct ContainerMapList<TypeNull> /* nothing is in type null */
+{
+};
+template<class H, class T> struct ContainerMapList<TypeList<H, T> >
+{
+ ContainerMapList<H> _elements;
+ ContainerMapList<T> _TailElements;
+};
+
+/*
+ * @class ContaierArrayList is a multi-type container for
+ * array of elements.
+ */
+template<class OBJECT> struct ContainerArrayList
+{
+ std::vector<OBJECT> _element;
+};
+
+// termination condition
+template<> struct ContainerArrayList<TypeNull> {};
+// recursion
+template<class H, class T> struct ContainerArrayList<TypeList<H, T> >
+{
+ ContainerArrayList<H> _elements;
+ ContainerArrayList<T> _TailElements;
+};
+
+/*
+ * @class ContainerList is a simple list of different types of elements
+ *
+ */
+template<class OBJECT> struct ContainerList
+{
+ OBJECT _element;
+};
+
+/* TypeNull is underfined */
+template<> struct ContainerList<TypeNull> {};
+template<class H, class T> struct ContainerList<TypeList<H, T> >
+{
+ ContainerList<H> _elements;
+ ContainerMapList<T> _TailElements;
+};
+
+#include "TypeContainerFunctions.h"
+
+/*
+ * @class TypeMapContainer contains a fixed number of types and is
+ * determined at compile time. This is probably the most complicated
+ * class and do its simplest thing, that is, holds objects
+ * of different types.
+ */
+
+template<class OBJECT_TYPES>
+class TypeMapContainer
+{
+ public:
+ template<class SPECIFIC_TYPE> size_t Count() const { return Trinity::Count(i_elements, (SPECIFIC_TYPE*)NULL); }
+
+ /// inserts a specific object into the container
+ template<class SPECIFIC_TYPE> bool insert(SPECIFIC_TYPE *obj)
+ {
+ SPECIFIC_TYPE* t = Trinity::Insert(i_elements, obj);
+ return (t != NULL);
+ }
+
+ /// Removes the object from the container, and returns the removed object
+ template<class SPECIFIC_TYPE> bool remove(SPECIFIC_TYPE* obj)
+ {
+ SPECIFIC_TYPE* t = Trinity::Remove(i_elements, obj);
+ return (t != NULL);
+ }
+
+ ContainerMapList<OBJECT_TYPES> & GetElements(void) { return i_elements; }
+ const ContainerMapList<OBJECT_TYPES> & GetElements(void) const { return i_elements;}
+
+ private:
+ ContainerMapList<OBJECT_TYPES> i_elements;
+};
+#endif
+
diff --git a/src/server/shared/Dynamic/TypeContainerFunctions.h b/src/server/shared/Dynamic/TypeContainerFunctions.h
new file mode 100644
index 00000000000..edfbb40e659
--- /dev/null
+++ b/src/server/shared/Dynamic/TypeContainerFunctions.h
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TYPECONTAINER_FUNCTIONS_H
+#define TYPECONTAINER_FUNCTIONS_H
+
+/*
+ * Here you'll find a list of helper functions to make
+ * the TypeContainer usefull. Without it, its hard
+ * to access or mutate the container.
+ */
+
+#include "Platform/Define.h"
+#include "Utilities/TypeList.h"
+#include <map>
+
+namespace Trinity
+{
+ /* ContainerMapList Helpers */
+ // count functions
+ template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<SPECIFIC_TYPE> &elements, SPECIFIC_TYPE* /*fake*/)
+ {
+ return elements._element.getSize();
+ };
+
+ template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<TypeNull> &/*elements*/, SPECIFIC_TYPE* /*fake*/)
+ {
+ return 0;
+ }
+
+ template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<T> &/*elements*/, SPECIFIC_TYPE* /*fake*/)
+ {
+ return 0;
+ }
+
+ template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<TypeList<SPECIFIC_TYPE, T> >&elements, SPECIFIC_TYPE* fake)
+ {
+ return Count(elements._elements,fake);
+ }
+
+ template<class SPECIFIC_TYPE, class H, class T> size_t Count(const ContainerMapList<TypeList<H, T> >&elements, SPECIFIC_TYPE* fake)
+ {
+ return Count(elements._TailElements, fake);
+ }
+
+ // non-const insert functions
+ template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Insert(ContainerMapList<SPECIFIC_TYPE> &elements, SPECIFIC_TYPE *obj)
+ {
+ //elements._element[hdl] = obj;
+ obj->GetGridRef().link(&elements._element, obj);
+ return obj;
+ };
+
+ template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Insert(ContainerMapList<TypeNull> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ {
+ return NULL;
+ }
+
+ // this is a missed
+ template<class SPECIFIC_TYPE, class T> SPECIFIC_TYPE* Insert(ContainerMapList<T> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ {
+ return NULL; // a missed
+ }
+
+ // Recursion
+ template<class SPECIFIC_TYPE, class H, class T> SPECIFIC_TYPE* Insert(ContainerMapList<TypeList<H, T> >&elements, SPECIFIC_TYPE *obj)
+ {
+ SPECIFIC_TYPE* t= Insert(elements._elements, obj);
+ return (t != NULL ? t : Insert(elements._TailElements, obj));
+ }
+
+ // non-const remove method
+ template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Remove(ContainerMapList<SPECIFIC_TYPE> & /*elements*/, SPECIFIC_TYPE *obj)
+ {
+ obj->GetGridRef().unlink();
+ return obj;
+ }
+
+ template<class SPECIFIC_TYPE> SPECIFIC_TYPE* Remove(ContainerMapList<TypeNull> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ {
+ return NULL;
+ }
+
+ // this is a missed
+ template<class SPECIFIC_TYPE, class T> SPECIFIC_TYPE* Remove(ContainerMapList<T> &/*elements*/, SPECIFIC_TYPE * /*obj*/)
+ {
+ return NULL; // a missed
+ }
+
+ template<class SPECIFIC_TYPE, class T, class H> SPECIFIC_TYPE* Remove(ContainerMapList<TypeList<H, T> > &elements, SPECIFIC_TYPE *obj)
+ {
+ // The head element is bad
+ SPECIFIC_TYPE* t = Remove(elements._elements, obj);
+ return ( t != NULL ? t : Remove(elements._TailElements, obj) );
+ }
+
+}
+#endif
+
diff --git a/src/server/shared/Dynamic/TypeContainerFunctionsPtr.h b/src/server/shared/Dynamic/TypeContainerFunctionsPtr.h
new file mode 100644
index 00000000000..2affcc457cc
--- /dev/null
+++ b/src/server/shared/Dynamic/TypeContainerFunctionsPtr.h
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TYPECONTAINER_FUNCTIONS_PTR_H
+#define TYPECONTAINER_FUNCTIONS_PTR_H
+
+/*
+ * Here you'll find a list of helper functions to make
+ * the TypeContainer usefull. Without it, its hard
+ * to access or mutate the container.
+ */
+
+#include "Platform/Define.h"
+#include "Utilities/TypeList.h"
+#include <map>
+
+namespace Trinity
+{
+ /* ContainerMapList Helpers */
+ // count functions
+ // template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<SPECIFIC_TYPE> &elements, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ // {
+ // return elements._element.size();
+ // };
+ //
+ // template<class SPECIFIC_TYPE> size_t Count(const ContainerMapList<TypeNull> &elements, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ // {
+ // return 0;
+ // }
+ //
+ // template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<T> &elements, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ // {
+ // return 0;
+ // }
+ //
+ // template<class SPECIFIC_TYPE, class T> size_t Count(const ContainerMapList<TypeList<SPECIFIC_TYPE, T> >&elements, SPECIFIC_TYPE* fake)
+ // {
+ // return Count(elements._elements,fake);
+ // }
+ //
+ // template<class SPECIFIC_TYPE, class H, class T> size_t Count(const ContainerMapList<TypeList<H, T> >&elements, SPECIFIC_TYPE* fake)
+ // {
+ // return Count(elements._TailElements, fake);
+ // }
+
+ // non-const find functions
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<SPECIFIC_TYPE> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ typename std::map<OBJECT_HANDLE, CountedPtr<SPECIFIC_TYPE> >::iterator iter = elements._element.find(hdl);
+ return (iter == elements._element.end() ? NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL) : iter->second);
+ };
+
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<TypeNull> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);// terminate recursion
+ }
+
+ template<class SPECIFIC_TYPE, class T> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<T> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);// this is a missed
+ }
+
+ template<class SPECIFIC_TYPE, class H, class T> CountedPtr<SPECIFIC_TYPE>& Find(ContainerMapList<TypeList<H, T> >&elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* fake)
+ {
+ CountedPtr<SPECIFIC_TYPE> &t = Find(elements._elements, hdl,fake);
+ return (!t ? Find(elements._TailElements, hdl,fake) : t);
+ }
+
+ // const find functions
+ template<class SPECIFIC_TYPE> const CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<SPECIFIC_TYPE> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ typename CountedPtr<SPECIFIC_TYPE>::iterator iter = elements._element.find(hdl);
+ return (iter == elements._element.end() ? NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL) : iter->second);
+ };
+
+ template<class SPECIFIC_TYPE> const CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<TypeNull> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);
+ }
+
+ template<class SPECIFIC_TYPE, class T> const CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<T> &elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* /*fake*/)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);
+ }
+
+ template<class SPECIFIC_TYPE, class H, class T> CountedPtr<SPECIFIC_TYPE>& Find(const ContainerMapList<TypeList<H, T> >&elements, OBJECT_HANDLE hdl, CountedPtr<SPECIFIC_TYPE>* fake)
+ {
+ CountedPtr<SPECIFIC_TYPE> &t = Find(elements._elements, hdl,fake);
+ if(!t)
+ t = Find(elements._TailElement, hdl,fake);
+
+ return t;
+ }
+
+ // non-const insert functions
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<SPECIFIC_TYPE> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ elements._element[hdl] = obj;
+ return obj;
+ };
+
+ template<class SPECIFIC_TYPE> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<TypeNull> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);
+ }
+
+ // this is a missed
+ template<class SPECIFIC_TYPE, class T> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<T> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return NullPtr<SPECIFIC_TYPE>((SPECIFIC_TYPE*)NULL);// a missed
+ }
+
+ // Recursion
+ template<class SPECIFIC_TYPE, class H, class T> CountedPtr<SPECIFIC_TYPE>& Insert(ContainerMapList<TypeList<H, T> >&elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ CountedPtr<SPECIFIC_TYPE> &t= Insert(elements._elements, obj, hdl);
+ return (!t ? Insert(elements._TailElements, obj, hdl) : t);
+ }
+
+ // non-const remove method
+ template<class SPECIFIC_TYPE> bool Remove(ContainerMapList<SPECIFIC_TYPE> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ typename std::map<OBJECT_HANDLE, CountedPtr<SPECIFIC_TYPE> >::iterator iter = elements._element.find(hdl);
+ if( iter != elements._element.end() )
+ {
+ elements._element.erase(iter);
+ return true;
+ }
+
+ return false; // found... terminate the search
+ }
+
+ template<class SPECIFIC_TYPE> bool Remove(ContainerMapList<TypeNull> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return false;
+ }
+
+ // this is a missed
+ template<class SPECIFIC_TYPE, class T> bool Remove(ContainerMapList<T> &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ return false;
+ }
+
+ template<class SPECIFIC_TYPE, class T, class H> bool Remove(ContainerMapList<TypeList<H, T> > &elements, CountedPtr<SPECIFIC_TYPE> &obj, OBJECT_HANDLE hdl)
+ {
+ // The head element is bad
+ bool t = Remove(elements._elements, obj, hdl);
+ return ( !t ? Remove(elements._TailElements, obj, hdl) : t );
+ }
+
+}
+#endif
+
diff --git a/src/server/shared/Dynamic/TypeContainerVisitor.h b/src/server/shared/Dynamic/TypeContainerVisitor.h
new file mode 100644
index 00000000000..f15075e5afd
--- /dev/null
+++ b/src/server/shared/Dynamic/TypeContainerVisitor.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_TYPECONTAINERVISITOR_H
+#define TRINITY_TYPECONTAINERVISITOR_H
+
+/*
+ * @class TypeContainerVisitor is implemented as a visitor pattern. It is
+ * a visitor to the TypeContainerList or TypeContainerMapList. The visitor has
+ * to overload its types as a visit method is called.
+ */
+
+#include "Platform/Define.h"
+#include "TypeContainer.h"
+
+// forward declaration
+template<class T, class Y> class TypeContainerVisitor;
+
+// visitor helper
+template<class VISITOR, class TYPE_CONTAINER> void VisitorHelper(VISITOR &v, TYPE_CONTAINER &c)
+{
+ v.Visit(c);
+};
+
+// terminate condition for container list
+template<class VISITOR> void VisitorHelper(VISITOR &v, ContainerList<TypeNull> &c)
+{
+}
+
+template<class VISITOR, class T> void VisitorHelper(VISITOR &v, ContainerList<T> &c)
+{
+ v.Visit(c._element);
+}
+
+// recursion for container list
+template<class VISITOR, class H, class T> void VisitorHelper(VISITOR &v, ContainerList<TypeList<H, T> > &c)
+{
+ VisitorHelper(v, c._elements);
+ VisitorHelper(v, c._TailElements);
+}
+
+// terminate condition container map list
+template<class VISITOR> void VisitorHelper(VISITOR &/*v*/, ContainerMapList<TypeNull> &/*c*/)
+{
+}
+
+template<class VISITOR, class T> void VisitorHelper(VISITOR &v, ContainerMapList<T> &c)
+{
+ v.Visit(c._element);
+}
+
+// recursion container map list
+template<class VISITOR, class H, class T> void VisitorHelper(VISITOR &v, ContainerMapList<TypeList<H, T> > &c)
+{
+ VisitorHelper(v, c._elements);
+ VisitorHelper(v, c._TailElements);
+}
+
+// array list
+template<class VISITOR, class T> void VisitorHelper(VISITOR &v, ContainerArrayList<T> &c)
+{
+ v.Visit(c._element);
+}
+
+template<class VISITOR> void VisitorHelper(VISITOR &/*v*/, ContainerArrayList<TypeNull> &/*c*/)
+{
+}
+
+// recursion
+template<class VISITOR, class H, class T> void VisitorHelper(VISITOR &v, ContainerArrayList<TypeList<H, T> > &c)
+{
+ VisitorHelper(v, c._elements);
+ VisitorHelper(v, c._TailElements);
+}
+
+// for TypeMapContainer
+template<class VISITOR, class OBJECT_TYPES> void VisitorHelper(VISITOR &v, TypeMapContainer<OBJECT_TYPES> &c)
+{
+ VisitorHelper(v, c.GetElements());
+}
+
+template<class VISITOR, class TYPE_CONTAINER>
+class TypeContainerVisitor
+{
+ public:
+ TypeContainerVisitor(VISITOR &v) : i_visitor(v) {}
+
+ void Visit(TYPE_CONTAINER &c)
+ {
+ VisitorHelper(i_visitor, c);
+ }
+
+ void Visit(const TYPE_CONTAINER &c) const
+ {
+ VisitorHelper(i_visitor, c);
+ }
+
+ private:
+ VISITOR &i_visitor;
+};
+#endif
+
diff --git a/src/server/shared/Dynamic/TypeList.h b/src/server/shared/Dynamic/TypeList.h
new file mode 100644
index 00000000000..02bc08083c2
--- /dev/null
+++ b/src/server/shared/Dynamic/TypeList.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_TYPELIST_H
+#define TRINITY_TYPELIST_H
+
+/*
+ @struct TypeList
+ TypeList is the most simple but yet the most powerfull class of all. It holds
+ at compile time the different type of objects in a linked list.
+ */
+
+class TypeNull;
+
+template<typename HEAD, typename TAIL>
+struct TypeList
+{
+ typedef HEAD Head;
+ typedef TAIL Tail;
+};
+
+// enough for now.. can be expand at any point in time as needed
+#define TYPELIST_1(T1) TypeList<T1,TypeNull>
+#define TYPELIST_2(T1, T2) TypeList<T1, TYPELIST_1(T2) >
+#define TYPELIST_3(T1, T2, T3) TypeList<T1, TYPELIST_2(T2, T3) >
+#define TYPELIST_4(T1, T2, T3, T4) TypeList<T1, TYPELIST_3(T2, T3, T4) >
+#define TYPELIST_5(T1, T2, T3, T4, T5) TypeList<T1, TYPELIST_4(T2, T3, T4, T5) >
+#endif
+
diff --git a/src/server/shared/Dynamic/UnorderedMap.h b/src/server/shared/Dynamic/UnorderedMap.h
new file mode 100644
index 00000000000..fce5ec82bfc
--- /dev/null
+++ b/src/server/shared/Dynamic/UnorderedMap.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
+ *
+ * Copyright (C) 2008-2010 Trinity <http://www.trinitycore.org/>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef TRINITY_UNORDERED_MAP_H
+#define TRINITY_UNORDERED_MAP_H
+
+#include "Platform/CompilerDefs.h"
+#include "Platform/Define.h"
+
+#if COMPILER == COMPILER_INTEL
+#include <ext/hash_map>
+#elif COMPILER == COMPILER_GNU && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#include <tr1/unordered_map>
+#elif COMPILER == COMPILER_GNU && __GNUC__ >= 3
+#include <ext/hash_map>
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1 // VC9.0 and later
+#include <unordered_map>
+#else
+#include <hash_map>
+#endif
+
+#ifdef _STLPORT_VERSION
+#define UNORDERED_MAP std::hash_map
+using std::hash_map;
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1500 && _HAS_TR1
+#define UNORDERED_MAP std::tr1::unordered_map
+#elif COMPILER == COMPILER_MICROSOFT && _MSC_VER >= 1300
+#define UNORDERED_MAP stdext::hash_map
+using stdext::hash_map;
+#elif COMPILER == COMPILER_INTEL
+#define UNORDERED_MAP std::hash_map
+using std::hash_map;
+#elif COMPILER == COMPILER_GNU && (__GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 3)
+#define UNORDERED_MAP std::tr1::unordered_map
+#elif COMPILER == COMPILER_GNU && __GNUC__ >= 3
+#define UNORDERED_MAP __gnu_cxx::hash_map
+
+namespace __gnu_cxx
+{
+ template<> struct hash<unsigned long long>
+ {
+ size_t operator()(const unsigned long long &__x) const { return (size_t)__x; }
+ };
+ template<typename T> struct hash<T *>
+ {
+ size_t operator()(T * const &__x) const { return (size_t)__x; }
+ };
+
+};
+
+#else
+#define UNORDERED_MAP std::hash_map
+using std::hash_map;
+#endif
+#endif
+