青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
#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,  
//高級(jí)圖形實(shí)體,相當(dāng)于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 "";};

        
//此屬性可以給編輯器交互的時(shí)候使用
        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可以存放任意類(lèi)型的對(duì)象

    
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:

        
//全局監(jiān)聽(tīng)器,可以用于和編輯器的接口
        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()
    {
        
//因?yàn)橛锌赡軐?duì)象池是不同的Dll創(chuàng)建的,不能在這里統(tǒng)一釋放
        
//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()
    {
        
//因?yàn)橛锌赡芄S(chǎng)是不同的Dll創(chuàng)建的,不能在這里統(tǒng)一釋放
        
//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];
    }

    


}
實(shí)現(xiàn)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情一区二区三区全黄| 午夜宅男久久久| 欧美日韩成人在线| 美女在线一区二区| 久久久久久久一区| 久久久999精品视频| 免费精品视频| 99精品视频免费| 亚洲欧美激情诱惑| 久久精品国亚洲| 欧美精品乱人伦久久久久久| 欧美系列一区| 国产一区91| 亚洲欧洲另类国产综合| 亚洲永久字幕| 免播放器亚洲一区| 亚洲午夜激情免费视频| 久久久久天天天天| 欧美午夜片欧美片在线观看| 激情综合网址| 亚洲一级片在线看| 久久综合色播五月| 亚洲欧洲一级| 翔田千里一区二区| 欧美大香线蕉线伊人久久国产精品| 欧美日韩精品免费观看视频完整| 国产日韩欧美一区二区| 日韩午夜中文字幕| 久久亚洲春色中文字幕| aa国产精品| 免费一区二区三区| 国产综合在线视频| 午夜日本精品| 亚洲欧洲三级电影| 免费成人在线视频网站| 国产精品综合| 在线亚洲激情| 亚洲激情女人| 男人的天堂亚洲在线| 国内成人精品一区| 欧美专区在线观看一区| 中日韩美女免费视频网站在线观看| 久久久久久综合| 国产精品永久免费视频| 亚洲自拍偷拍麻豆| 亚洲精品久久久久久下一站 | 日韩性生活视频| 巨胸喷奶水www久久久免费动漫| 宅男在线国产精品| 欧美日韩在线播放三区| 一区二区欧美日韩| 亚洲精品日本| 欧美日韩免费观看一区=区三区| 在线精品福利| 美女视频黄免费的久久| 久久久久久有精品国产| 怡红院精品视频| 免费成人性网站| 久久只有精品| 亚洲人成高清| 亚洲伦理一区| 亚洲国产天堂久久综合| 久久国产精品久久w女人spa| 国产欧美一区二区三区沐欲| 久久成人18免费观看| 欧美一级黄色录像| 一区精品在线| 亚洲国产精品久久久久秋霞影院 | 欧美日韩一级黄| 亚洲视频一区| 亚洲一区二区视频在线观看| 国产精品成人播放| 欧美一区二区三区四区在线| 亚洲一区二区三区精品在线| 国产日韩欧美在线播放不卡| 久久中文字幕一区二区三区| 久久婷婷综合激情| 亚洲精一区二区三区| 一本色道久久| 国产综合色在线| 亚洲青色在线| 国产欧美日韩一区二区三区在线观看| 久久国产欧美日韩精品| 久久免费99精品久久久久久| 亚洲欧洲精品一区二区| 一本一道久久综合狠狠老精东影业 | 亚洲欧美激情四射在线日 | 欧美理论大片| 欧美一区二区免费| 久久婷婷综合激情| 一区二区三区波多野结衣在线观看| 99国产精品99久久久久久粉嫩| 国产精品亚洲аv天堂网 | 欧美大片专区| 国产精品久久久久久妇女6080| 久久精品一本| 欧美欧美全黄| 久久精品亚洲国产奇米99| 免费亚洲婷婷| 久久国产一区二区| 欧美日韩国产区| 能在线观看的日韩av| 欧美视频在线观看一区| 久久一区二区视频| 国产精品国产精品国产专区不蜜| 老色鬼精品视频在线观看播放| 欧美日韩精品一区二区三区四区 | 美女网站在线免费欧美精品| 欧美亚韩一区| 亚洲国产欧美日韩精品| 一本久道综合久久精品| 精久久久久久久久久久| 亚洲桃花岛网站| 亚洲精品国产精品国自产观看浪潮 | 亚洲影院免费观看| 一本色道久久综合狠狠躁的推荐| 久久国产精品一区二区三区| 午夜精品视频| 欧美视频网址| 亚洲欧洲日本mm| 亚洲人精品午夜| 久久婷婷久久| 久久久久久久久久码影片| 国产精品人人做人人爽人人添| 一本色道久久综合| 在线综合亚洲| 欧美日韩国产综合视频在线| 亚洲国产成人午夜在线一区| 亚洲成人资源网| 久久久久国产一区二区| 久久久久久综合| 国内成人自拍视频| 欧美在线一区二区| 久久精品视频在线免费观看| 国产欧美va欧美va香蕉在| 亚洲一区二区三区在线播放| 亚洲欧美视频一区| 国产日韩欧美一区在线| 欧美在线视频全部完| 久久在线免费视频| 91久久综合| 欧美另类人妖| 亚洲午夜国产成人av电影男同| 亚洲欧美成人一区二区三区| 国产精品久久久久久久久果冻传媒| 一区二区三区产品免费精品久久75| 一二三区精品| 国产欧美精品日韩区二区麻豆天美| 亚洲欧美日韩视频一区| 久久人人97超碰人人澡爱香蕉| 激情成人综合网| 欧美电影在线| 亚洲自拍16p| 欧美大片在线观看| 亚洲视频在线观看视频| 国产乱码精品一区二区三区忘忧草| 午夜视频在线观看一区二区三区| 久久嫩草精品久久久精品| 亚洲国产精品一区二区第一页 | 亚洲国产成人在线| 老司机精品视频一区二区三区| 亚洲黄色一区| 香蕉久久夜色精品| 18成人免费观看视频| 欧美人妖另类| 久久国产精品黑丝| 亚洲欧洲日韩综合二区| 午夜久久99| 亚洲国产精品va在线看黑人动漫| 国产精品vvv| 欧美一区二区在线播放| 韩国成人理伦片免费播放| 欧美高清在线观看| 亚洲午夜精品一区二区| 欧美韩国日本一区| 午夜激情一区| 亚洲日本一区二区| 国产一区二区精品久久| 欧美日韩不卡| 美女视频黄a大片欧美| 亚洲一区二区三区精品在线观看 | 中文一区二区在线观看| 红桃视频国产一区| 欧美午夜激情视频| 麻豆av一区二区三区| 亚洲欧美在线高清| 亚洲伦伦在线| 亚洲国产欧美一区二区三区丁香婷| 欧美在线免费一级片| 夜夜嗨一区二区三区| 136国产福利精品导航网址应用| 国产精品视频一区二区三区| 欧美久久九九| 欧美激情一区二区三区| 久久久噜噜噜久久| 久久大香伊蕉在人线观看热2| 亚洲视频在线播放| 亚洲茄子视频| 亚洲国产日韩欧美综合久久| 久久综合网色—综合色88|