void Array::resize(std::size_t s) { AIO_PRE_CONDITION(valid()); Type t = type(); TypeMethods& methods = t.methods(); std::size_t new_size = s * type().payload(); if (s < size()) { if (!t.isPod()) { for (byte* p = m_imp->data.data() + m_imp->data.size() - type().payload() ; p >= m_imp->data.data() + new_size; p -= type().payload()) { methods.destruct(CommonObject(t, p)); } } m_imp->data.resize(new_size); } if(s > size()) { std::size_t old_size = m_imp->data.size(); m_imp->data.resize(new_size); //TODO: need exception safe for (byte* p = m_imp->data.data() + old_size ; p != m_imp->data.data() + m_imp->data.size(); p += type().payload()) { methods.construct(CommonObject(t, p), get_heap(), get_ext_heap()); } } }
void Array::push_back(ConstCommonObject obj) { AIO_PRE_CONDITION(valid()); AIO_PRE_CONDITION(obj.type() == type()); std::size_t old_size = m_imp->data.size(); //TODO:not safe if object hold a pointer to itself. m_imp->data.resize(old_size + type().payload()); byte* p = m_imp->data.data() + old_size; if (!type().isPod()) type().methods().construct(CommonObject(type(), p), get_heap(), get_ext_heap()); type().methods().assign(obj, CommonObject(type(), p) ); }
void Array::insert(Array::iterator pos, ConstCommonObject obj) { AIO_PRE_CONDITION(valid()); std::size_t s = size(); Type t = type(); std::size_t idx = (pos - begin()) * t.payload(); //TODO:not safe if object hold a pointer to itself. m_imp->data.insert(m_imp->data.begin() + idx, t.payload(), byte()); if (!type().isPod()) type().methods().construct(CommonObject(type(), m_imp->data.data() + idx), get_heap(), get_ext_heap()); type().methods().assign(obj, CommonObject(type(), m_imp->data.data() + idx) ); AIO_POST_CONDITION(size() == s + 1); }
void SceneObjectManager::ReloadSceneObject(sgp::ISGPObject* pObj) { CWaitCursor cursor; std::vector<ISGPObject*>& objVector=WorldMapManager::GetInstance()->GetWorldObjects(); CString sMF1FileName=pObj->m_MF1FileName; std::vector<ISGPObject*> reloadObjVector; uint32 i; for(i=0;i<objVector.size();++i) { if(sMF1FileName==objVector[i]->m_MF1FileName) reloadObjVector.push_back(objVector[i]); } for(i=0;i<reloadObjVector.size();++i) EngineDeleteSceneObject(CommonObject(reloadObjVector[i])); for(i=0;i<reloadObjVector.size();++i) EngineAddSceneObject(CommonObject(reloadObjVector[i])); WorldEditorRenderInterface::GetInstance()->GetWorldSystemManager()->initializeQuadTree(); }
void SceneObjectManager::ReloadSceneObject(const std::vector<CommonObject>& objVector) { CWaitCursor cursor; uint32 i,j; std::set<CString> mf1Set; for(i=0;i<objVector.size();++i) { ASSERT(objVector[i].IsMF1()); mf1Set.insert(CString(objVector[i].m_pObj->m_MF1FileName)); } std::vector<ISGPObject*>& allObjVec=WorldMapManager::GetInstance()->GetWorldObjects(); std::set<CString>::iterator iter; for(iter=mf1Set.begin();iter!=mf1Set.end();++iter) { CString mf1Name=*iter; std::vector<CommonObject> reloadObjVector; for(i=0;i<allObjVec.size();++i) { if(mf1Name==allObjVec[i]->m_MF1FileName) reloadObjVector.push_back(CommonObject(allObjVec[i])); } for(j=0;j<reloadObjVector.size();++j) EngineDeleteSceneObject(reloadObjVector[j]); for(j=0;j<reloadObjVector.size();++j) EngineAddSceneObject(reloadObjVector[j]); } WorldEditorRenderInterface::GetInstance()->GetWorldSystemManager()->initializeQuadTree(); }
void Array::pop_back() { AIO_PRE_CONDITION(valid()); AIO_PRE_CONDITION(!empty()); std::size_t new_size = m_imp->data.size() - type().payload(); if (!type().isPod()) type().methods().destruct(CommonObject(type(), m_imp->data.data() + new_size)); m_imp->data.resize(new_size); }
void Array::clear() { AIO_PRE_CONDITION(valid()); Type t = type(); if (!t.isPod() && !empty()) { TypeMethods& methods = t.methods(); for (byte* p = m_imp->data.data() + m_imp->data.size() - type().payload() ; p >= m_imp->data.data(); p -= type().payload()) { methods.destruct(CommonObject(t, p)); } } m_imp->data.clear(); }