• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 311, comments - 0, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            (地基工)對象池管理類

            Posted on 2011-10-27 10:25 點點滴滴 閱讀(332) 評論(0)  編輯 收藏 引用
            #ifndef WS_OBJECTPOOL_H_
            #define WS_OBJECTPOOL_H_

            #include 
            "WSDataObject.h"
            #include 
            "templates\WSSmartAssert.h"
            #include 
            "WSTaggedListenerManager.h"
            #include 
            "WSParamHolder.h"
            #include 
            "WSAny.h"
            namespace WS {
                typedef ParamHolder ObjectCreationParameters;
                
            class ObjectPool;
                
            //class DataObjectManager;
                class DataObject;
                
            class PoolableObjectManager;
                
            enum PoolableObjectType {
                    POT_NONE,
                    POT_SCENEMANAGER,
                    POT_SCENENODE,
                    POT_LIGHT,
                    POT_TERRAINGROUP,
                    POT_TERRAINPAGE,
                    POT_ADGRAPHICENTITY,  
            //高級圖形實體,相當于Ogre::Entity
                    POT_PARTICLESYSTEM,
                    POT_SPECIALEFFECT,
                    POT_VIEWPORT,
                    POT_CAMERA,
                    POT_SKELETON,
                    POT_UNITENTITY,
                    POT_PLAY,
                    POT_ITEM,
                    POT_CREATURE,
                };
                typedef 
            set<PoolableObjectType>::type PoolableObjectTypeSet;
                
            class _WSExport PoolableObject
                {
                    friend 
            class ObjectPool;
                
            public:
                    
            enum PoolableObjectState  {PO_IDLE, PO_USE,};

                    PoolableObject();
                    
            virtual ~PoolableObject();
                    ObjectPool
            * getObjectPool() {return mObjectPool;}
                    
            void setObjectPool(ObjectPool* val){mObjectPool = val;}
                    
                    
            virtual bool getIsAutoRelease() const { return mIsAutoRelease; }
                    
            virtual void setIsAutoRelease(bool isAutoRelease) { mIsAutoRelease = isAutoRelease; }

                    
            virtual Real getAutoReleaseTime() const { return mAutoReleaseTime; };
                    
            virtual void setAutoReleaseTime(Real autoReleaseTime) { mAutoReleaseTime = autoReleaseTime; };
                    
            virtual void update(const Real timeElapsed);

                    
            virtual bool getNeedTouch() const { return mNeedTouch; }
                    
            virtual void setNeedTouch(bool needTouch) { mNeedTouch = needTouch; }

                    
            virtual void unUse(){mState = PO_IDLE;}
                    
            virtual const int getState(){return mState;}

                    
            virtual PoolableObjectType getPoolableObjectType() const { return mPoolableObjectType; }
                    
            virtual void setPoolableObjectType(PoolableObjectType poolableObjectType) { mPoolableObjectType = poolableObjectType; }

                    
            virtual void touch() { mUnTouchTime = 0; }    
                    
            virtual  const String& getPoolableObjectID() constreturn mPoolableObjectID; }
                    
            virtual void setPoolableObjectID (const String &poolableObjectID){ mPoolableObjectID = poolableObjectID; }
                    
            virtual String getClassName(){ return "";};

                    
            //此屬性可以給編輯器交互的時候使用
                    virtual PropertyValueMap* getPropertyValueParams() const { return mPropertyValueParams; }
                    
            virtual void setPropertyValueParams(PropertyValueMap *propertyValueParams) { mPropertyValueParams = propertyValueParams; }    


                    
            //釋放自己
                    virtual void releaseSelf();
                    
            void setPoolableObjectManager(PoolableObjectManager *poolableObjectManager) { mPoolableObjectManager = poolableObjectManager; }
                    PoolableObjectManager 
            * getPoolableObjectManager() const { return mPoolableObjectManager;}
                
            protected:

                    
            virtual void _onBorrowed();
                    
            virtual void _onReturned();
                
            protected:
                    ObjectPool
            * mObjectPool;
                    
            bool mIsAutoRelease;
                    Real mAutoReleaseTime;    
                    PoolableObjectState mState;
                    
            bool mNeedTouch;
                    Real mUnTouchTime;
                    String mPoolableObjectID;
                    PoolableObjectType mPoolableObjectType;

                    PropertyValueMap 
            *mPropertyValueParams;
                    
            bool mIsTriggerCreate;
                    PoolableObjectManager 
            *mPoolableObjectManager;
                
            private:
                    
            //int _addRef();
                    
            //int _release();
                    
            //int mUseCount;
                };

                
            class _WSExport PoolableObjectFactory
                {
                
            public:
                    friend 
            class ObjectPool;
                    
            //typedef std::vector<PoolableObject*> PoolableObjectVector;
                public:
                    
            virtual ~PoolableObjectFactory();
                    
            virtual PoolableObject* makeObject() = 0;
                    
            virtual void destroyObject(PoolableObject* obj) {delete obj; };
                    
            //bool validateObject(PoolableObject* obj){return false;}
                    
            //void activateObject(PoolableObject* obj){}
                    
            //void passivateObject(PoolableObject* obj){}
                
            //protected:
                
            //    //void addObject(PoolableObject* obj);
                
            //protected:
                
            //    PoolableObjectVector mPoolableObjects;
                };
                
                typedef map
            <String, PoolableObjectFactory*>::type PoolableObjectFactoryList;


                
            class _WSExport PoolableObjectFactoryManager: public Singleton<PoolableObjectFactoryManager>
                {
                
            public:
                    PoolableObjectFactoryManager();
                    
            virtual ~PoolableObjectFactoryManager();
                    
            static PoolableObjectFactoryManager* getSingletonPtr(void);        
                    
            static PoolableObjectFactoryManager& getSingleton(void);
                    
            void addFactory(const String &name, PoolableObjectFactory* factory);
                    
            void removeFactory(const String &name);
                    PoolableObjectFactory 
            * getFactory(const String &name);
                
            protected:
                    PoolableObjectFactoryList mFactorys;
                    
                };

                
            class _WSExport ObjectPool
                {
                
            public:
                    typedef deque
            <PoolableObject*>::type PoolableObjectQueue;
                
            public:
                    ObjectPool(PoolableObjectFactory
            * factory = NULL);
                    
            virtual ~ObjectPool();
                    
            virtual PoolableObject* borrowObject(PoolableObjectManager *poolableObjectManager = NULL);
                    
            virtual void returnObject(PoolableObject* obj);        
            //         int getNumIdle();
            //         int getNumActive();
            //         void addObject();        
            //         void clear();
            //         void close();
                    void setFactory(PoolableObjectFactory* factory);
                    
            void update(const Real);
                    
            void destoryAllPoolableObjects();
                
            protected:        
                    PoolableObjectFactory
            * mFactory;
                    PoolableObjectQueue mPoolableObjects;        
                    
            //PoolableObjectQueue mIdlePoolableObjects;        
                    
            //PoolableObjectQueue mUsedPoolableObjects;
                    
            //PoolableObjectQueue mReturnPoolableObjects;
                };
                typedef map
            <String, ObjectPool*>::type ObjectPoolList;    

                
            class _WSExport ObjectPoolManager: public Singleton<ObjectPoolManager>
                {
                
            public:
                    ObjectPoolManager();
                    
            virtual ~ObjectPoolManager();
                    
            static ObjectPoolManager* getSingletonPtr(void);        
                    
            static ObjectPoolManager& getSingleton(void);

                    
            void addObjectPool(const String &className, ObjectPool* objectPool);
                    
            void removeObjectPool(const String &className);
                    ObjectPool 
            * getObjectPool(const String &className);
                    
            void destoryAllPoolableObjects();
                
            protected:
                    ObjectPoolList mObjectPools;
                };


                
            class _WSExport PoolableObjectManagerListener
                {
                
            public:
                    
            enum MethodType{
                        MT_CREATE,
                        MT_INIT,
                        MT_DESTROY,
                        MT_MODIFY,
                    };
                    
            virtual ~PoolableObjectManagerListener() {}
                    
            virtual void onObjectCreated(PoolableObject*const ObjectCreationParameters& = ObjectCreationParameters()) {}
                    
            virtual void onObjectInitialized(PoolableObject*const ObjectCreationParameters& = ObjectCreationParameters()) {}
                    
            virtual void onDestroyObject(PoolableObject*) {}
                    
            virtual void onObjectModify(PoolableObject*const ObjectCreationParameters& = ObjectCreationParameters()) {}        
                };

            //PoolableObjectManager可以存放任意類型的對象

                
            class _WSExport PoolableObjectManager: public ListenerManager<PoolableObjectManagerListener>
                {
                
            public:
                    friend 
            class PoolableObject;
                    PoolableObjectManager(
            const String &className = String(""), DataObjectManager *dataObjectManager = NULL);        
                    
            //PoolableObjectManager(ObjectPool* defaultObjectPool, DataObjectManager *dataObjectManager);

                    
                    
            virtual ~PoolableObjectManager();

                    
            virtual void initObjectFromDataObject(PoolableObject* poolableObject, DataObject *dataObject) = 0;
                    
            virtual void initObjectFromDataObject(PoolableObject* poolableObject, const String& dataObjectID);

                    
            virtual PoolableObject* borrowObject();
                    
            virtual PoolableObject* borrowObjectByClassName(const String &className = "");        
                    
            virtual PoolableObject* borrowObjectByID(const String& poolableObjectID, const String &className = "");        
                    
            virtual PoolableObject* borrowObject(const String& dataObjectID,const String& poolableObjectID, const String &className = "");
                    
            virtual PoolableObject* borrowObject(DataObject *dataObject);
                    
            virtual PoolableObject* borrowObject(const String& dataObjectID);
                    
            virtual void returnObject(PoolableObject* obj);
                    
            virtual void returnObject(const String &poolableObjectID);
                    
            virtual void returnAllObjects();
                    
            virtual void delayReturn(PoolableObject* obj);
                    
            virtual void update(const Real);
                
            public:
                    typedef map
            <String, PoolableObject*>::type PoolableObjectList;
                    typedef MapIterator
            <PoolableObjectList> PoolableObjectIterator;
                    PoolableObjectIterator getPoolableObjectIterator(
            void) {
                        
            return PoolableObjectIterator(mPoolableObjects.begin(), mPoolableObjects.end());
                    }
                    
            const PoolableObjectList& getPoolableObjects() const { return mPoolableObjects; }
                    
            virtual PoolableObject* getPoolableObject(const String &poolableObjectID);

                    
            bool hasPoolableObject(const String& poolableObjectID);
                
            public:
                    
            //void addFactory(const String &name, PoolableObjectFactory* factory);
                    
            //void removeFactory(const String &name);
                    void addObjectPool(const String &className, ObjectPool* objectPool = NULL);
                    
            void removeObjectPool(const String &className);
                
            protected:
                    
            //virtual PoolableObject* makeObject(){ return factory->makeObject();    }
                    
            //virtual PoolableObject* makeObjectFromDataObject(DataObject *dataObject){return factory->makeObjectFromDataObject(dataObject);}
                    
            //virtual PoolableObjectFactory* getFactory() { return mFactory; };
                    
            //virtual ObjectPool* getObjectPool() {return mObjectPool;};
                    typedef ListenerManager<PoolableObjectManagerListener> listener_mgr_type;
                    
            void listeners_onObjectCreated(PoolableObject* obj,const ObjectCreationParameters& params = ObjectCreationParameters());
                    
            void listeners_onObjectInitialized(PoolableObject* obj,const ObjectCreationParameters& params = ObjectCreationParameters());
                    
            void listeners_onDestroyObject(PoolableObject* obj);
                    String getNextID();
                
            protected:    
                    int32 mIDCounter;
                    
            //PoolableObjectFactory* mDefaultFactory; 
                    
            //PoolableObjectFactoryList mFactorys;

                    ObjectPool
            * mDefaultObjectPool;    //=mObjectPools[0]
                    ObjectPoolList mObjectPools;

                    DataObjectManager 
            *mDataObjectManager;


                    ObjectPoolManager 
            *mObjectPoolManager;
                    
                
            private:
                    PoolableObjectList mPoolableObjects;

                
                
            public:    
                    typedef vector
            <PoolableObjectManagerListener*>::type PoolableObjectManagerListenerList;
                    
            static void addSingletonListener(PoolableObjectManagerListener* listener);
                    
            static void removeSingletonListener(PoolableObjectManagerListener* listener);    
                    
            static PoolableObjectManagerListenerList& getSingletonListeners();
                    
            static bool hasSingletonListeners() { return mSingletonListeners.size() > 0; }
                    
            static void triggerSingletonListeners(PoolableObject* obj, PoolableObjectManagerListener::MethodType methodType, const ObjectCreationParameters& params = ObjectCreationParameters());
                
            protected:

                    
            //全局監聽器,可以用于和編輯器的接口
                    static PoolableObjectManagerListenerList mSingletonListeners;
                };



            #endif
            #include <WSPrerequisites.h>
            #include 
            "WSObjectPool.h"
            #include 
            "WSDataObject.h"
            #include 
            "WSStringConverter.h"
            #include 
            "WSUniqueName.h"

            namespace WS
            {
                PoolableObjectManager::PoolableObjectManagerListenerList PoolableObjectManager::mSingletonListeners;
                PoolableObject::PoolableObject()
                    :mObjectPool(
            0)
                    
            //,mUseCount(0)
                    ,mIsAutoRelease(false)
                    ,mAutoReleaseTime(FLT_MAX)
                    ,mState(PO_IDLE)
                    ,mNeedTouch(
            false)
                    ,mUnTouchTime(
            0.0f)
                    ,mPoolableObjectID(uniqueName::create( 
            "PO" ))
                    ,mPoolableObjectType(POT_NONE)
                    ,mIsTriggerCreate(
            false)
                    ,mPoolableObjectManager(NULL)
                {

                }

                PoolableObject::
            ~PoolableObject()
                {        
                    PoolableObjectManager::triggerSingletonListeners(
            this, PoolableObjectManagerListener::MT_DESTROY);
                }

                
            void PoolableObject::releaseSelf()
                {
                    
            if (mPoolableObjectManager)
                        mPoolableObjectManager
            ->returnObject(this);
                }
                
            //int PoolableObject::_addRef()
                
            //{
                
            //    ++mUseCount;
                
            //    return mUseCount;
                
            //}

                
            //int PoolableObject::_release()
                
            //{
                
            //    if (mUseCount > 0)
                
            //    {
                
            //        --mUseCount;
                
            //    }
                
            //    
                
            //    if ((mUseCount == 0) && mObjectPool)
                
            //    {
                
            //        _onReturned();            
                
            //    }
                
            //    return mUseCount;
                
            //}

                
            void PoolableObject::update(const Real timeElapsed)
                {
                    
            if (!mIsTriggerCreate)
                    {
                        PoolableObjectManager::triggerSingletonListeners(
            this, PoolableObjectManagerListener::MT_CREATE);
                        mIsTriggerCreate 
            = true;
                    }
                    
                    
            if (mIsAutoRelease)
                    {
                        mAutoReleaseTime 
            -= timeElapsed;
                        
            if (mAutoReleaseTime <= 0)
                        {
                            mObjectPool
            ->returnObject(this);
                            
            return;
                        }
                    }

                    
            if (mNeedTouch)
                    {
                        mUnTouchTime 
            += timeElapsed;
                        
            if (mUnTouchTime > 300 )
                        {
                            mObjectPool
            ->returnObject(this);
                            
            return;
                        }
                    }
                    
                }

                
            void PoolableObject::_onBorrowed()
                {
                    mState 
            = PO_USE;
                    mAutoReleaseTime 
            = FLT_MAX;
                    mIsAutoRelease 
            = false;
                    mNeedTouch 
            = false;
                    mUnTouchTime 
            = 0.0f;
                }

                
            void PoolableObject::_onReturned() 
                {
                    mState 
            = PO_IDLE;
                    PoolableObjectManager::triggerSingletonListeners(
            this, PoolableObjectManagerListener::MT_DESTROY);
                }

                PoolableObjectFactory::
            ~PoolableObjectFactory()
                {
                }


                PoolableObject
            * ObjectPool::borrowObject(PoolableObjectManager *poolableObjectManager)
                {

                    PoolableObject 
            *pPoolableObject = NULL;
                    
            for (PoolableObjectQueue::iterator iter = mPoolableObjects.begin(); iter != mPoolableObjects.end(); ++iter)
                    {
                        
            if ((*iter)->mState == PoolableObject::PO_IDLE)
                        {
                            pPoolableObject 
            = *iter;
                        }
                    }

                    
            if(!pPoolableObject)
                    {
                        pPoolableObject 
            = mFactory->makeObject();
                        pPoolableObject
            ->setObjectPool(this);        
                        mPoolableObjects.push_back(pPoolableObject);
                    }
                    pPoolableObject
            ->setPoolableObjectManager(poolableObjectManager);
                    pPoolableObject
            ->_onBorrowed();
                    
            return pPoolableObject;
                }

                ObjectPool::ObjectPool(PoolableObjectFactory
            * factory)
                    :mFactory(factory)
                {
                    
                }

                ObjectPool::
            ~ObjectPool()
                {
                    
            for (PoolableObjectQueue::iterator iter = mPoolableObjects.begin(); iter != mPoolableObjects.end(); ++iter)
                    {
                        mFactory
            ->destroyObject(*iter);
                    }
                    mPoolableObjects.clear();
                    
            //mIdlePoolableObjects.clear();
                    
            //mUsedPoolableObjects.clear();
                    
            //mReturnPoolableObjects.clear();
                }

                
            void ObjectPool::returnObject(PoolableObject* obj)
                {    
                    obj
            ->_onReturned();
                    
            //mReturnPoolableObjects.push_back(obj);

            //         PoolableObjectQueue::iterator iter = find(mUsedPoolableObjects.begin(), mUsedPoolableObjects.end(), obj);
            //         if (iter != mUsedPoolableObjects.end())
            //         {
            //             mUsedPoolableObjects.erase(iter);
            //         }
            //         mIdlePoolableObjects.push_back(obj);
                }

                
            void ObjectPool::update(const Real timeElapsed)
                {
                    
            //for (PoolableObjectQueue::iterator iter = mReturnPoolableObjects.begin(); iter != mReturnPoolableObjects.end(); ++iter)
                    
            //{
                    
            //    PoolableObjectQueue::iterator iter1 = find(mUsedPoolableObjects.begin(), mUsedPoolableObjects.end(), *iter);
                    
            //    if (iter1 != mUsedPoolableObjects.end())
                    
            //    {
                    
            //        mIdlePoolableObjects.push_back(*iter1);
                    
            //        mUsedPoolableObjects.erase(iter1);
                    
            //        
                    
            //    }
                    
            //}
                    
            //mReturnPoolableObjects.clear();

                    
            for (PoolableObjectQueue::iterator iter = mPoolableObjects.begin(); iter != mPoolableObjects.end(); ++iter)
                    {
                        
            if ((*iter)->mState == PoolableObject::PO_USE)
                        {
                            (
            *iter)->update(timeElapsed);                
                        }
                    }
                }

                
            void ObjectPool::setFactory(PoolableObjectFactory* factory)
                {
                    mFactory 
            = factory;
                }



                
            void ObjectPool::destoryAllPoolableObjects()
                {
                    PoolableObjectQueue::reverse_iterator it 
            = mPoolableObjects.rbegin();
                    PoolableObjectQueue::reverse_iterator itEnd 
            = mPoolableObjects.rend();
                    
            for (; it != itEnd; ++it)
                    {
                        mFactory
            ->destroyObject(*it); //returnObject(it->second);
                    }
                    mPoolableObjects.clear();
                }

                template
            <> ObjectPoolManager* Singleton<ObjectPoolManager>::ms_Singleton = 0;
                ObjectPoolManager
            * ObjectPoolManager::getSingletonPtr(void)
                {
                    
            return ms_Singleton; 
                }
                ObjectPoolManager
            & ObjectPoolManager::getSingleton(void)
                {
                    assert( ms_Singleton );  
            return ( *ms_Singleton );
                }

                ObjectPoolManager::ObjectPoolManager()
                {

                }

                ObjectPoolManager::
            ~ObjectPoolManager()
                {
                    
            //因為有可能對象池是不同的Dll創建的,不能在這里統一釋放
                    
            //for (ObjectPoolList::iterator it = mObjectPools.begin(); it != mObjectPools.end(); ++it)
                    
            //{
                    
            //    delete it->second;
                    
            //}
                }

                
            void ObjectPoolManager::addObjectPool(const String &className, ObjectPool* objectPool)
                {
                    mObjectPools[className] 
            = objectPool;
                }

                
            void ObjectPoolManager::removeObjectPool(const String &className)
                {
                    mObjectPools.erase(mObjectPools.find(className));
                }

                ObjectPool
            * ObjectPoolManager::getObjectPool(const String &className)
                {
                    
            return mObjectPools[className];
                }

                
            void ObjectPoolManager::destoryAllPoolableObjects()
                {
                    ObjectPoolList::reverse_iterator it 
            = mObjectPools.rbegin();
                    ObjectPoolList::reverse_iterator itEnd 
            = mObjectPools.rend(); 
                    
            for (; it != itEnd; ++it)
                    {
                        it
            ->second->destoryAllPoolableObjects();
                    }
                }

                PoolableObjectManager::PoolableObjectManager(
            const String &className, DataObjectManager *dataObjectManager):mIDCounter(0), 
                    mDefaultObjectPool(NULL), mDataObjectManager(dataObjectManager), mObjectPoolManager(ObjectPoolManager::getSingletonPtr())
                {
                    
            if (className != "")
                    {
                        addObjectPool(className, mObjectPoolManager
            ->getObjectPool(className));
                    }
                }

                
            //PoolableObjectManager::PoolableObjectManager(ObjectPool* defaultObjectPool, DataObjectManager *dataObjectManager):
                
            //    mIDCounter(0), mDefaultObjectPool(defaultObjectPool), mDataObjectManager(dataObjectManager)
                
            //{         
                
            //    //if (defaultFactory)
                
            //    //{
                
            //    //    mDefaultObjectPool->setFactory(mDefaultFactory);
                
            //    //    mFactorys["Default"]
                
            //    //}
                
            //    
                
            //}

                PoolableObjectManager::
            ~PoolableObjectManager()
                {
                    returnAllObjects();
                }

                PoolableObject
            * PoolableObjectManager::borrowObjectByID(const String& poolableObjectID, const String &className)
                {
                    PoolableObject
            * obj;
                    
            if (className == "")
                    {
                        obj 
            = mDefaultObjectPool->borrowObject();
                    }
                    
            else
                    {    
                        ObjectPoolList::iterator it 
            = mObjectPools.find(className);
                        
            if (it == mObjectPools.end())
                        {
                            ObjectPool 
            *objPool = mObjectPoolManager->getObjectPool(className);
                            addObjectPool(className, objPool);
                            obj 
            = objPool->borrowObject(this);
                        }
                        
            else
                        {
                            obj 
            = it->second->borrowObject(this);
                        }            
                    }
                    
            if (poolableObjectID == "" || obj == NULL)
                        
            return NULL;
                    mPoolableObjects[poolableObjectID] 
            = obj;
                    obj
            ->setPoolableObjectID(poolableObjectID);
                    listeners_onObjectCreated(obj, ObjectCreationParameters());
                    
            return obj;
                }

                PoolableObject
            * PoolableObjectManager::borrowObject(const String& dataObjectID,const String& poolableObjectID, const String &className)
                {
                    PoolableObject
            * obj = borrowObjectByID(poolableObjectID,className);
                    initObjectFromDataObject(obj, dataObjectID);
                    
            return obj;
                }

                PoolableObject
            * PoolableObjectManager::borrowObject()
                {
                    
            return borrowObjectByID(getNextID());
                }

                PoolableObject
            * PoolableObjectManager::borrowObjectByClassName(const String &className)    
                {
                     
            return borrowObjectByID(getNextID(), className);
                }

                PoolableObject
            * PoolableObjectManager::borrowObject(DataObject *dataObject)
                {
                    PoolableObject
            * obj = borrowObject();
                    initObjectFromDataObject(obj, dataObject);
                    
            return obj;
                }

                PoolableObject
            * PoolableObjectManager::borrowObject(const String& dataObjectID)
                {
                    PoolableObject
            * obj = borrowObject();
                    initObjectFromDataObject(obj, dataObjectID);
                    
            return obj;
                }
                
                
            void  PoolableObjectManager::returnObject(PoolableObject* obj)
                {    
                    
            if (!obj) return;
                    listeners_onDestroyObject(obj);
                    PoolableObjectList::iterator it 
            = mPoolableObjects.find(obj->getPoolableObjectID());
                    
            if (it == mPoolableObjects.end()) return;
                    mPoolableObjects.erase(it);        
                    
                    mObjectPools.find(obj
            ->getClassName())->second->returnObject(obj);
                    
                    
            //mDefaultObjectPool->returnObject(obj);    
                    
                }
                
                
            void PoolableObjectManager::delayReturn(PoolableObject* obj)
                {
                    obj
            ->unUse();
                }

                
            void PoolableObjectManager::returnObject(const String &poolableObjectID)
                {
                    returnObject(mPoolableObjects[poolableObjectID]);        
                }

                
            void PoolableObjectManager::returnAllObjects()
                {
                     PoolableObjectList::iterator it 
            = mPoolableObjects.begin();
                    PoolableObjectList::iterator itEnd 
            = mPoolableObjects.end(); 
                    
            for (; it != itEnd; ++it)
                    {
                        listeners_onDestroyObject(it
            ->second);
                        mObjectPools.find(it
            ->second->getClassName())->second->returnObject(it->second);
                    }
                    mPoolableObjects.clear();
                }

                
            void PoolableObjectManager::update(const Real timeElapsed)
                {
                    PoolableObjectList::iterator it 
            = mPoolableObjects.begin();
                    PoolableObjectList::iterator itEnd 
            = mPoolableObjects.end();
                    
            for (; it != itEnd; ++it )
                    {
                        
            if ( NULL == it->second)
                            
            continue;
                        it
            ->second->update(timeElapsed);            
                    }

                    
            for (it = mPoolableObjects.begin(); it != mPoolableObjects.end();)
                    {
                        
            if ( NULL == it->second)
                            
            continue;
                        PoolableObject
            * pObject = it->second;
                        
            if (pObject->getState() == PoolableObject::PO_IDLE)
                        {
                            listeners_onDestroyObject(pObject);                
                            it 
            = mPoolableObjects.erase(it);    
                            mObjectPools.find(pObject
            ->getClassName())->second->returnObject(pObject);                            
                        }    
                        
            else
                        {
                            it 
            ++;
                        }
                    }
                    
            //mDefaultObjectPool->update(timeElapsed);
                }
                
                
            void PoolableObjectManager::initObjectFromDataObject(PoolableObject* poolableObject,const String& dataObjectID)
                {
                    DataObjectPtr dataObject 
            = mDataObjectManager->getByID(dataObjectID);
                    
            if (!dataObject.get())
                    {
                        WS_EXCEPT2(Exception2::ERR_ITEM_NOT_FOUND, 
                            mDataObjectManager
            ->getResourceType() + " with ID " + dataObjectID + "' not Found!"
                            
            "PoolableObjectManager::initObjectFromDataObject");
                    }
                    initObjectFromDataObject(poolableObject, dataObject.
            get());

                    listeners_onObjectInitialized(poolableObject, ObjectCreationParameters());
                }

                String PoolableObjectManager::getNextID()
                {
                    
            return "AutoID" + StringConverter::toString(mIDCounter++);        
                }

                PoolableObject
            * PoolableObjectManager::getPoolableObject(const String& poolableObjectID)
                {
                    PoolableObjectList::iterator it 
            = mPoolableObjects.find(poolableObjectID);
                    
            if (it != mPoolableObjects.end())
                        
            return it->second;
                    
            else
                        
            return NULL;
                }

                
            bool PoolableObjectManager::hasPoolableObject(const String& poolableObjectID)
                {
                    
            return mPoolableObjects.find(poolableObjectID) != mPoolableObjects.end();        
                }

                
            void PoolableObjectManager::listeners_onObjectCreated(PoolableObject* obj, const ObjectCreationParameters& params)
                {
                    assert( obj );
                    
            if (!obj)
                        
            return;
                    ConstVectorIterator
            <listener_mgr_type::ListenerList> it(mListeners);
                    
            while (it.hasMoreElements())
                        it.getNext()
            ->onObjectCreated(obj,params);

                    
            //PoolableObjectManagerListenerList::iterator it1 = mSingletonListeners.begin();
                    
            //PoolableObjectManagerListenerList::iterator itEnd1 = mSingletonListeners.end();
                    
            //for (; it1 != itEnd1; ++it1)
                    
            //{
                    
            //    (*it1)->onObjectCreated(obj,params);
                    
            //}
                }
                
            void PoolableObjectManager::listeners_onObjectInitialized(PoolableObject* obj, const ObjectCreationParameters& params)
                {
                    assert( obj );
                    
            if (!obj)
                        
            return;
                    ConstVectorIterator
            <listener_mgr_type::ListenerList> it(mListeners);
                    
            while (it.hasMoreElements())
                        it.getNext()
            ->onObjectInitialized(obj, params);

                    
            //PoolableObjectManagerListenerList::iterator it1 = mSingletonListeners.begin();
                    
            //PoolableObjectManagerListenerList::iterator itEnd1 = mSingletonListeners.end();
                    
            //for (; it1 != itEnd1; ++it1)
                    
            //{
                    
            //    (*it1)->onObjectInitialized(obj,params);
                    
            //}
                }
                
            void PoolableObjectManager::listeners_onDestroyObject(PoolableObject* obj)
                {
                    assert( obj );
                    
            if (!obj)
                        
            return;
                    ConstVectorIterator
            <listener_mgr_type::ListenerList> it(mListeners);
                    
            while (it.hasMoreElements())
                        it.getNext()
            ->onDestroyObject(obj);

                    
            //PoolableObjectManagerListenerList::iterator it1 = mSingletonListeners.begin();
                    
            //PoolableObjectManagerListenerList::iterator itEnd1 = mSingletonListeners.end();
                    
            //for (; it1 != itEnd1; ++it1)
                    
            //{
                    
            //    (*it1)->onDestroyObject(obj);
                    
            //}
                }

                
            //void PoolableObjectManager::addFactory(const String &name, PoolableObjectFactory* factory)
                
            //{
                
            //    mFactorys[name] = factory;
                
            //}

                
            //void PoolableObjectManager::removeFactory(const String &name)
                
            //{
                
            //    mFactorys.erase(mFactorys.find(name));
                
            //}

                
            void PoolableObjectManager::addObjectPool(const String &className, ObjectPool* objectPool)
                {
                    
            if (NULL == objectPool)
                        objectPool 
            = ObjectPoolManager::getSingleton().getObjectPool(className);
                    
            if (mObjectPools.size() == 0)
                        mDefaultObjectPool 
            = objectPool;
                    mObjectPools[className] 
            = objectPool;
                }

                
            void PoolableObjectManager::removeObjectPool(const String &className)
                {
                    mObjectPools.erase(mObjectPools.find(className));
                }

                
            void PoolableObjectManager::addSingletonListener(PoolableObjectManagerListener* listener)
                {
                    mSingletonListeners.push_back(listener);
                }

                
            void PoolableObjectManager::removeSingletonListener(PoolableObjectManagerListener* listener)
                {
                    PoolableObjectManagerListenerList::iterator it 
            = find(mSingletonListeners.begin(), mSingletonListeners.end(), listener);
                    mSingletonListeners.erase(it);
                }

                PoolableObjectManager::PoolableObjectManagerListenerList
            & PoolableObjectManager::getSingletonListeners()
                {
                    
            return mSingletonListeners;
                }

                
            void PoolableObjectManager::triggerSingletonListeners(PoolableObject* obj, PoolableObjectManagerListener::MethodType methodType, const ObjectCreationParameters& params)
                {
                    
            if (!PoolableObjectManager::hasSingletonListeners()) 
                        
            return;
                    PoolableObjectManagerListenerList::iterator it1 
            = mSingletonListeners.begin();
                    PoolableObjectManagerListenerList::iterator itEnd1 
            = mSingletonListeners.end();
                    
            for (; it1 != itEnd1; ++it1)
                    {
                        
            switch (methodType) 
                        {
                        
            case PoolableObjectManagerListener::MT_CREATE:
                            (
            *it1)->onObjectCreated(obj, params);
                            
            break;
                        
            case PoolableObjectManagerListener::MT_INIT:
                            (
            *it1)->onObjectInitialized(obj, params);
                            
            break;
                        
            case PoolableObjectManagerListener::MT_DESTROY:
                            (
            *it1)->onDestroyObject(obj);
                            
            break;
                        
            case PoolableObjectManagerListener::MT_MODIFY:
                            (
            *it1)->onObjectModify(obj, params);
                            
            break;
                            
                        }

                        
                    }
                }


                template
            <> PoolableObjectFactoryManager* Singleton<PoolableObjectFactoryManager>::ms_Singleton = 0;
                PoolableObjectFactoryManager
            * PoolableObjectFactoryManager::getSingletonPtr(void)
                {
                    
            return ms_Singleton; 
                }
                PoolableObjectFactoryManager
            & PoolableObjectFactoryManager::getSingleton(void)
                {
                    assert( ms_Singleton );  
            return ( *ms_Singleton );
                }

                PoolableObjectFactoryManager::PoolableObjectFactoryManager()
                {

                }

                PoolableObjectFactoryManager::
            ~PoolableObjectFactoryManager()
                {
                    
            //因為有可能工廠是不同的Dll創建的,不能在這里統一釋放
                    
            //for (PoolableObjectFactoryList::iterator it = mFactorys.begin(); it != mFactorys.end(); ++it)
                    
            //{
                    
            //    delete it->second;
                    
            //}
                }

                
            void PoolableObjectFactoryManager::addFactory(const String &name, PoolableObjectFactory* factory)
                {
                    mFactorys[name] 
            = factory;
                }

                
            void PoolableObjectFactoryManager::removeFactory(const String &name)
                {
                    mFactorys.erase(mFactorys.find(name));
                }

                PoolableObjectFactory
            * PoolableObjectFactoryManager::getFactory(const String &name)
                {
                    
            return mFactorys[name];
                }

                


            }
            實現
            人妻无码αv中文字幕久久琪琪布| 精品乱码久久久久久夜夜嗨 | 国产精自产拍久久久久久蜜| 无码AV中文字幕久久专区| 中文成人久久久久影院免费观看| 国产福利电影一区二区三区久久久久成人精品综合 | 久久99国产精品99久久| 热re99久久6国产精品免费| 久久婷婷色综合一区二区| 蜜桃麻豆www久久国产精品| 久久久久人妻一区精品| 久久性精品| 久久www免费人成看片| 亚洲精品白浆高清久久久久久| 精产国品久久一二三产区区别| 久久国产免费直播| 2022年国产精品久久久久| 久久99毛片免费观看不卡| 精品国产婷婷久久久| 亚洲婷婷国产精品电影人久久| 亚洲国产另类久久久精品黑人| 97超级碰碰碰久久久久| 国产成人香蕉久久久久| 亚洲国产精品无码久久九九| 亚洲精品乱码久久久久久久久久久久 | 久久高潮一级毛片免费| 久久午夜免费视频| 久久婷婷五月综合97色| 亚洲综合久久综合激情久久| 人妻无码久久精品| 国产精品美女久久久m| 国产精品免费久久| 丁香色欲久久久久久综合网| 欧美久久综合性欧美| 伊人久久大香线蕉成人| jizzjizz国产精品久久| 香蕉99久久国产综合精品宅男自 | 99热都是精品久久久久久| 欧美亚洲另类久久综合婷婷 | 亚洲人成伊人成综合网久久久| 国产精品久久久久久吹潮|