Exemplo n.º 1
0
void CSMWorld::RefIdData::erase (int index, int count)
{
    LocalIndex localIndex = globalToLocalIndex (index);

    std::map<UniversalId::Type, RefIdDataContainerBase *>::const_iterator iter =
        mRecordContainers.find (localIndex.second);

    while (count>0 && iter!=mRecordContainers.end())
    {
        int size = iter->second->getSize();

        if (localIndex.first+count>size)
        {
            erase (localIndex, size-localIndex.first);
            count -= size-localIndex.first;

            ++iter;

            if (iter==mRecordContainers.end())
                throw std::runtime_error ("invalid count value for erase operation");

            localIndex.first = 0;
            localIndex.second = iter->first;
        }
        else
        {
            erase (localIndex, count);
            count = 0;
        }
    }
}
Exemplo n.º 2
0
void CSMWorld::RefIdData::save (int index, ESM::ESMWriter& writer) const
{
    LocalIndex localIndex = globalToLocalIndex (index);

    std::map<UniversalId::Type, RefIdDataContainerBase *>::const_iterator iter =
        mRecordContainers.find (localIndex.second);

    if (iter==mRecordContainers.end())
        throw std::logic_error ("invalid local index type");

    iter->second->save (localIndex.first, writer);
}
Exemplo n.º 3
0
void CSMWorld::RefIdData::copyTo (int index, RefIdData& target) const
{
    LocalIndex localIndex = globalToLocalIndex (index);

    RefIdDataContainerBase *source = mRecordContainers.find (localIndex.second)->second;

    std::string id = source->getId (localIndex.first);

    std::auto_ptr<CSMWorld::RecordBase> newRecord (source->getRecord (localIndex.first).modifiedCopy());

    target.insertRecord (*newRecord, localIndex.second, id);
}