void Collection<ESXRecordT, IdAccessorT>::setRecord (int index, const Record<ESXRecordT>& record) { if (IdAccessorT().getId (mRecords.at (index).get())!=IdAccessorT().getId (record.get())) throw std::runtime_error ("attempt to change the ID of a record"); mRecords.at (index) = record; }
void IdCollection<ESXRecordT, IdAccessorT>::load (const ESXRecordT& record, bool base, int index) { if (index==-2) index = this->searchId (IdAccessorT().getId (record)); if (index==-1) { // new record Record<ESXRecordT> record2; record2.mState = base ? RecordBase::State_BaseOnly : RecordBase::State_ModifiedOnly; (base ? record2.mBase : record2.mModified) = record; this->appendRecord (record2); } else { // old record Record<ESXRecordT> record2 = Collection<ESXRecordT, IdAccessorT>::getRecord (index); if (base) record2.mBase = record; else record2.setModified (record); this->setRecord (index, record2); } }
void Collection<ESXRecordT, IdAccessorT>::appendRecord (const RecordBase& record, UniversalId::Type type) { mRecords.push_back (dynamic_cast<const Record<ESXRecordT>&> (record)); mIndex.insert (std::make_pair (Misc::StringUtils::lowerCase (IdAccessorT().getId ( dynamic_cast<const Record<ESXRecordT>&> (record).get())), mRecords.size()-1)); }
void Collection<ESXRecordT, IdAccessorT>::appendBlankRecord (const std::string& id, UniversalId::Type type) { ESXRecordT record; IdAccessorT().getId (record) = id; record.blank(); add (record); }
void IdCollection<ESXRecordT, IdAccessorT>::load (ESM::ESMReader& reader, bool base) { std::string id = reader.getHNOString ("NAME"); if (reader.isNextSub ("DELE")) { int index = Collection<ESXRecordT, IdAccessorT>::searchId (id); reader.skipRecord(); if (index==-1) { // deleting a record that does not exist // ignore it for now /// \todo report the problem to the user } else if (base) { Collection<ESXRecordT, IdAccessorT>::removeRows (index, 1); } else { Record<ESXRecordT> record = Collection<ESXRecordT, IdAccessorT>::getRecord (index); record.mState = RecordBase::State_Deleted; this->setRecord (index, record); } } else { ESXRecordT record; int index = this->searchId (id); if (index==-1) IdAccessorT().getId (record) = id; else { record = this->getRecord (index).get(); } record.load (reader); load (record, base, index); } }
void Collection<ESXRecordT, IdAccessorT>::add (const ESXRecordT& record) { std::string id = Misc::StringUtils::lowerCase (IdAccessorT().getId (record)); std::map<std::string, int>::iterator iter = mIndex.find (id); if (iter==mIndex.end()) { Record<ESXRecordT> record2; record2.mState = Record<ESXRecordT>::State_ModifiedOnly; record2.mModified = record; mRecords.push_back (record2); mIndex.insert (std::make_pair (Misc::StringUtils::lowerCase (id), mRecords.size()-1)); } else { mRecords[iter->second].setModified (record); } }
std::string Collection<ESXRecordT, IdAccessorT>::getId (int index) const { return IdAccessorT().getId (mRecords.at (index).get()); }