1 #ifndef CSM_WOLRD_COLLECTION_H
2 #define CSM_WOLRD_COLLECTION_H
24 template<
typename ESXRecordT>
27 void setId(ESXRecordT& record,
const std::string&
id)
const;
28 const std::string
getId (
const ESXRecordT& record)
const;
31 template<
typename ESXRecordT>
37 template<
typename ESXRecordT>
77 template<
typename ESXRecordT,
typename IdAccessorT = IdAccessor<ESXRecordT> >
96 const std::map<std::string, int>&
getIdMap()
const;
98 const std::vector<Record<ESXRecordT> >&
getRecords()
const;
100 bool reorderRowsImp (
int baseIndex,
const std::vector<int>& newOrder);
106 int cloneRecordImp (
const std::string& origin,
const std::string& dest,
119 void add (
const ESXRecordT& record);
124 virtual std::string
getId (
int index)
const;
126 virtual int getIndex (
const std::string&
id)
const;
130 virtual QVariant
getData (
int index,
int column)
const;
132 virtual void setData (
int index,
int column,
const QVariant& data);
136 virtual void merge();
139 virtual void purge();
142 virtual void removeRows (
int index,
int count) ;
148 virtual void cloneRecord(
const std::string& origin,
149 const std::string& destination,
156 virtual int searchId (
const std::string&
id)
const;
178 virtual std::vector<std::string>
getIds (
bool listDeleted =
true)
const;
192 virtual bool reorderRows (
int baseIndex,
const std::vector<int>& newOrder);
206 template<
typename ESXRecordT,
typename IdAccessorT>
212 template<
typename ESXRecordT,
typename IdAccessorT>
218 template<
typename ESXRecordT,
typename IdAccessorT>
220 const std::vector<int>& newOrder)
222 if (!newOrder.empty())
224 int size =
static_cast<int> (newOrder.size());
227 std::vector<int>
test (newOrder);
228 std::sort (test.begin(), test.end());
229 if (*test.begin()!=0 || *--test.end()!=size-1)
233 std::vector<Record<ESXRecordT> > buffer (size);
235 for (
int i=0; i<size; ++i)
237 buffer[newOrder[i]] = mRecords [baseIndex+i];
238 buffer[newOrder[i]].setModified (buffer[newOrder[i]].
get());
241 std::copy (buffer.begin(), buffer.end(), mRecords.begin()+baseIndex);
244 for (std::map<std::string, int>::iterator iter (mIndex.begin()); iter!=mIndex.end();
246 if (iter->second>=baseIndex && iter->second<baseIndex+size)
247 iter->second = newOrder.at (iter->second-baseIndex)+baseIndex;
253 template<
typename ESXRecordT,
typename IdAccessorT>
258 copy.
mModified = getRecord(origin).get();
260 IdAccessorT().setId(copy.
get(), destination);
262 int index = getAppendIndex(destination, type);
263 insertRecord(copy, getAppendIndex(destination, type));
268 template<
typename ESXRecordT,
typename IdAccessorT>
271 int index = getIndex(
id);
275 throw std::runtime_error(
"attempt to touch deleted record");
287 template<
typename ESXRecordT,
typename IdAccessorT>
291 cloneRecordImp(origin, destination, type);
298 int index = cloneRecordImp(origin, destination, type);
299 mRecords.at(index).get().mPlugin = 0;
302 template<
typename ESXRecordT,
typename IdAccessorT>
305 return touchRecordImp(
id) != -1;
311 int index = touchRecordImp(
id);
314 mRecords.at(index).get().mPlugin = 0;
321 template<
typename ESXRecordT,
typename IdAccessorT>
325 template<
typename ESXRecordT,
typename IdAccessorT>
328 for (
typename std::vector<
Column<ESXRecordT> *>::iterator iter (mColumns.begin()); iter!=mColumns.end(); ++iter)
332 template<
typename ESXRecordT,
typename IdAccessorT>
337 std::map<std::string, int>::iterator iter = mIndex.find (
id);
339 if (iter==mIndex.end())
345 insertRecord (record2, getAppendIndex (
id));
349 mRecords[iter->second].setModified (record);
353 template<
typename ESXRecordT,
typename IdAccessorT>
356 return mRecords.size();
359 template<
typename ESXRecordT,
typename IdAccessorT>
362 return IdAccessorT().getId (mRecords.at (index).get());
365 template<
typename ESXRecordT,
typename IdAccessorT>
371 throw std::runtime_error (
"invalid ID: " +
id);
376 template<
typename ESXRecordT,
typename IdAccessorT>
379 return mColumns.size();
382 template<
typename ESXRecordT,
typename IdAccessorT>
385 return mColumns.at (column)->get (mRecords.at (index));
388 template<
typename ESXRecordT,
typename IdAccessorT>
391 return mColumns.at (column)->set (mRecords.at (index), data);
394 template<
typename ESXRecordT,
typename IdAccessorT>
397 return *mColumns.at (column);
400 template<
typename ESXRecordT,
typename IdAccessorT>
403 if (column < 0 || column >= static_cast<int>(mColumns.size()))
404 throw std::runtime_error(
"column index out of range");
406 return mColumns.at (column);
409 template<
typename ESXRecordT,
typename IdAccessorT>
412 mColumns.push_back (column);
415 template<
typename ESXRecordT,
typename IdAccessorT>
418 for (
typename std::vector<
Record<ESXRecordT> >::iterator iter (mRecords.begin()); iter!=mRecords.end(); ++iter)
424 template<
typename ESXRecordT,
typename IdAccessorT>
429 while (i<static_cast<int> (mRecords.size()))
431 if (mRecords[i].isErased())
438 template<
typename ESXRecordT,
typename IdAccessorT>
441 mRecords.erase (mRecords.begin()+index, mRecords.begin()+index+count);
443 typename std::map<std::string, int>::iterator iter = mIndex.begin();
445 while (iter!=mIndex.end())
447 if (iter->second>=index)
449 if (iter->second>=index+count)
451 iter->second -= count;
456 mIndex.erase (iter++);
464 template<
typename ESXRecordT,
typename IdAccessorT>
469 IdAccessorT().setId(record,
id);
476 insertRecord (record2, getAppendIndex (
id, type), type);
479 template<
typename ESXRecordT,
typename IdAccessorT>
484 std::map<std::string, int>::const_iterator iter = mIndex.find (id2);
486 if (iter==mIndex.end())
492 template<
typename ESXRecordT,
typename IdAccessorT>
498 template<
typename ESXRecordT,
typename IdAccessorT>
502 insertRecord (record,
503 getAppendIndex (IdAccessorT().
getId (
507 template<
typename ESXRecordT,
typename IdAccessorT>
511 return static_cast<int> (mRecords.size());
514 template<
typename ESXRecordT,
typename IdAccessorT>
517 std::vector<std::string> ids;
519 for (
typename std::map<std::string, int>::const_iterator iter = mIndex.begin();
520 iter!=mIndex.end(); ++iter)
522 if (listDeleted || !mRecords[iter->second].isDeleted())
523 ids.push_back (IdAccessorT().
getId (mRecords[iter->second].get()));
529 template<
typename ESXRecordT,
typename IdAccessorT>
532 int index = getIndex (
id);
533 return mRecords.at (index);
536 template<
typename ESXRecordT,
typename IdAccessorT>
539 return mRecords.at (index);
542 template<
typename ESXRecordT,
typename IdAccessorT>
546 if (index<0 || index>static_cast<int> (mRecords.size()))
547 throw std::runtime_error (
"index out of range");
551 mRecords.insert (mRecords.begin()+index, record2);
553 if (index<static_cast<int> (mRecords.size())-1)
555 for (std::map<std::string, int>::iterator iter (mIndex.begin()); iter!=mIndex.end();
557 if (iter->second>=index)
562 record2.
get())), index));
565 template<
typename ESXRecordT,
typename IdAccessorT>
570 throw std::runtime_error (
"attempt to change the ID of a record");
572 mRecords.at (index) = record;
575 template<
typename ESXRecordT,
typename IdAccessorT>
virtual bool reorderRows(int baseIndex, const std::vector< int > &newOrder)
Definition: collection.hpp:576
virtual std::string getId(int index) const
Definition: collection.hpp:360
void copy(const btTransform &src, Nif::Transformation &dst)
Definition: testbulletnifloader.cpp:269
virtual void appendBlankRecord(const std::string &id, UniversalId::Type type=UniversalId::Type_None)
Definition: collection.hpp:465
Collection & operator=(const Collection &)
int getId(const std::string &name)
Will return -1 for an invalid name.
Definition: columns.cpp:384
State mState
Definition: record.hpp:19
Collection()
Definition: collection.hpp:322
const std::vector< Record< ESXRecordT > > & getRecords() const
Definition: collection.hpp:213
static void parseUniqueRecordId(const std::string &id, int &x, int &y)
Definition: land.cpp:20
Definition: columnbase.hpp:172
Wrapper for LandTexture record, providing info which plugin the LandTexture was loaded from...
Definition: landtexture.hpp:11
int cloneRecordImp(const std::string &origin, const std::string &dest, UniversalId::Type type)
Returns the index of the clone.
Definition: collection.hpp:254
static std::string lowerCase(const std::string &in)
Returns lower case copy of input string.
Definition: stringops.hpp:177
Type
Definition: universalid.hpp:40
Wrapper for Land record. Encodes X and Y cell index in the ID.
Definition: land.hpp:13
bool reorderRowsImp(int baseIndex, const std::vector< int > &newOrder)
Definition: collection.hpp:219
void addColumn(Column< ESXRecordT > *column)
Definition: collection.hpp:410
std::vector< Record< ESXRecordT > > mRecords
Definition: collection.hpp:86
Single-type record collection.
Definition: collection.hpp:78
virtual int searchId(const std::string &id) const
Definition: collection.hpp:480
virtual const Record< ESXRecordT > & getRecord(const std::string &id) const
Definition: collection.hpp:530
const std::map< std::string, int > & getIdMap() const
Definition: collection.hpp:207
virtual int getIndex(const std::string &id) const
Definition: collection.hpp:366
int mIndex
Definition: loadltex.hpp:36
virtual ~Collection()
Definition: collection.hpp:326
const std::string getId(const ESXRecordT &record) const
Definition: collection.hpp:38
virtual int getAppendIndex(const std::string &id, UniversalId::Type type=UniversalId::Type_None) const
Definition: collection.hpp:508
virtual int getColumns() const
Definition: collection.hpp:377
MWWorld::Ptr searchId(MWWorld::CellRefList< T > &list, const std::string &id, MWWorld::ContainerStore *store)
Definition: containerstore.cpp:43
int mX
Definition: loadland.hpp:31
virtual void replace(int index, const RecordBase &record)
Definition: collection.hpp:493
Definition: nestedcolumnadapter.hpp:11
std::map< std::string, int > mIndex
Definition: collection.hpp:87
Definition: columnbase.hpp:190
static void parseUniqueRecordId(const std::string &id, int &plugin, int &index)
Deconstructs a unique string identifier into plugin and index.
Definition: landtexture.cpp:24
void setRecord(int index, const Record< ESXRecordT > &record)
Definition: collection.hpp:566
Definition: record.hpp:14
int mY
Definition: loadland.hpp:31
virtual void insertRecord(const RecordBase &record, int index, UniversalId::Type type=UniversalId::Type_None)
Definition: collection.hpp:543
static std::string createUniqueRecordId(int plugin, int index)
Returns a string identifier that will be unique to any LandTexture.
Definition: landtexture.cpp:17
virtual const ColumnBase & getColumn(int column) const
Definition: collection.hpp:395
virtual void purge()
Remove records that are flagged as erased.
Definition: collection.hpp:425
ESXRecordT mModified
Definition: record.hpp:41
void add(const ESXRecordT &record)
Add a new record (modified)
Definition: collection.hpp:333
virtual void setData(int index, int column, const QVariant &data)
Definition: collection.hpp:389
virtual void removeRows(int index, int count)
< Merge modified into base.
Definition: collection.hpp:439
virtual void merge()
Merge modified into base.
Definition: collection.hpp:416
const ESXRecordT & get() const
Throws an exception, if the record is deleted.
Definition: record.hpp:106
virtual bool touchRecord(const std::string &id)
Definition: collection.hpp:303
int touchRecordImp(const std::string &id)
Returns the index of the record on success, -1 on failure.
Definition: collection.hpp:269
static std::string createUniqueRecordId(int x, int y)
Definition: land.cpp:13
Definition: columnbase.hpp:15
Base class for record collections.
Definition: collectionbase.hpp:23
void setId(ESXRecordT &record, const std::string &id) const
Definition: collection.hpp:32
virtual int getSize() const
Definition: collection.hpp:354
void setModified(const ESXRecordT &modified)
Throws an exception, if the record is deleted.
Definition: record.hpp:133
void test(const MWWorld::Ptr &actor, int &compiled, int &total, const Compiler::Extensions *extensions, int warningsMode)
Definition: scripttest.cpp:26
virtual void cloneRecord(const std::string &origin, const std::string &destination, const UniversalId::Type type)
Definition: collection.hpp:288
virtual std::vector< std::string > getIds(bool listDeleted=true) const
Definition: collection.hpp:515
Access to ID field in records.
Definition: collection.hpp:25
NestableColumn * getNestableColumn(int column) const
Definition: collection.hpp:401
Definition: universalid.hpp:42
ESXRecordT ESXRecord
Definition: collection.hpp:82
virtual QVariant getData(int index, int column) const
Definition: collection.hpp:383
std::vector< Column< ESXRecordT > * > mColumns
Definition: collection.hpp:88
virtual void appendRecord(const RecordBase &record, UniversalId::Type type=UniversalId::Type_None)
Definition: collection.hpp:499
bool isModified() const
Definition: record.cpp:17
bool isDeleted() const
Definition: record.cpp:5
int mPluginIndex
Definition: landtexture.hpp:13