Пример #1
0
    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;
    }
Пример #2
0
    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);
        }
    }
Пример #3
0
 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));
 }
Пример #4
0
 void  Collection<ESXRecordT, IdAccessorT>::appendBlankRecord (const std::string& id,
     UniversalId::Type type)
 {
     ESXRecordT record;
     IdAccessorT().getId (record) = id;
     record.blank();
     add (record);
 }
Пример #5
0
    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);
        }
    }
Пример #6
0
    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);
        }
    }
Пример #7
0
 std::string Collection<ESXRecordT, IdAccessorT>::getId (int index) const
 {
     return IdAccessorT().getId (mRecords.at (index).get());
 }