OpenMW
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
idcollection.hpp
Go to the documentation of this file.
1 #ifndef CSM_WOLRD_IDCOLLECTION_H
2 #define CSM_WOLRD_IDCOLLECTION_H
3 
5 
6 #include "collection.hpp"
7 #include "land.hpp"
8 
9 namespace CSMWorld
10 {
12  template<typename ESXRecordT, typename IdAccessorT = IdAccessor<ESXRecordT> >
13  class IdCollection : public Collection<ESXRecordT, IdAccessorT>
14  {
15  virtual void loadRecord (ESXRecordT& record, ESM::ESMReader& reader, bool& isDeleted);
16 
17  public:
18 
20  int load (ESM::ESMReader& reader, bool base);
21 
27  int load (const ESXRecordT& record, bool base, int index = -2);
28 
29  bool tryDelete (const std::string& id);
33  };
34 
35  template<typename ESXRecordT, typename IdAccessorT>
37  ESM::ESMReader& reader,
38  bool& isDeleted)
39  {
40  record.load (reader, isDeleted);
41  }
42 
43  template<>
44  inline void IdCollection<Land, IdAccessor<Land> >::loadRecord (Land& record,
45  ESM::ESMReader& reader, bool& isDeleted)
46  {
47  record.load (reader, isDeleted);
48 
49  // Load all land data for now. A future optimisation may only load non-base data
50  // if a suitable mechanism for avoiding race conditions can be established.
53  record.loadData (flags);
54 
55  // Prevent data from being reloaded.
56  record.mContext.filename.clear();
57  }
58 
59  template<typename ESXRecordT, typename IdAccessorT>
61  {
62  ESXRecordT record;
63  bool isDeleted = false;
64 
65  loadRecord (record, reader, isDeleted);
66 
67  std::string id = IdAccessorT().getId (record);
68  int index = this->searchId (id);
69 
70  if (isDeleted)
71  {
72  if (index==-1)
73  {
74  // deleting a record that does not exist
75  // ignore it for now
77  return -1;
78  }
79 
80  if (base)
81  {
82  this->removeRows (index, 1);
83  return -1;
84  }
85 
86  Record<ESXRecordT> baseRecord = this->getRecord (index);
87  baseRecord.mState = RecordBase::State_Deleted;
88  this->setRecord (index, baseRecord);
89  return index;
90  }
91 
92  return load (record, base, index);
93  }
94 
95  template<typename ESXRecordT, typename IdAccessorT>
96  int IdCollection<ESXRecordT, IdAccessorT>::load (const ESXRecordT& record, bool base,
97  int index)
98  {
99  if (index==-2)
100  index = this->searchId (IdAccessorT().getId (record));
101 
102  if (index==-1)
103  {
104  // new record
105  Record<ESXRecordT> record2;
107  (base ? record2.mBase : record2.mModified) = record;
108 
109  index = this->getSize();
110  this->appendRecord (record2);
111  }
112  else
113  {
114  // old record
116 
117  if (base)
118  record2.mBase = record;
119  else
120  record2.setModified (record);
121 
122  this->setRecord (index, record2);
123  }
124 
125  return index;
126  }
127 
128  template<typename ESXRecordT, typename IdAccessorT>
130  {
131  int index = this->searchId (id);
132 
133  if (index==-1)
134  return false;
135 
137 
138  if (record.isDeleted())
139  return false;
140 
142  {
144  }
145  else
146  {
148  this->setRecord (index, record);
149  }
150 
151  return true;
152  }
153 }
154 
155 #endif
Single type collection of top level records.
Definition: idcollection.hpp:13
virtual void loadRecord(ESXRecordT &record, ESM::ESMReader &reader, bool &isDeleted)
Definition: idcollection.hpp:36
int getId(const std::string &name)
Will return -1 for an invalid name.
Definition: columns.cpp:384
State mState
Definition: record.hpp:19
Definition: esmreader.hpp:21
Definition: loadland.hpp:45
Wrapper for Land record. Encodes X and Y cell index in the ID.
Definition: land.hpp:13
Single-type record collection.
Definition: collection.hpp:78
int load(ESM::ESMReader &reader, bool base)
Definition: idcollection.hpp:60
virtual const Record< ESXRecordT > & getRecord(const std::string &id) const
Definition: collection.hpp:530
MWWorld::Ptr searchId(MWWorld::CellRefList< T > &list, const std::string &id, MWWorld::ContainerStore *store)
Definition: containerstore.cpp:43
Definition: nestedcolumnadapter.hpp:11
ESXRecordT mBase
Definition: record.hpp:40
std::string filename
Definition: esmcommon.hpp:118
ESM_Context mContext
Definition: loadland.hpp:38
int load(Arguments &info)
Definition: esmtool.cpp:302
Definition: record.hpp:12
Definition: record.hpp:15
Definition: loadland.hpp:48
void loadData(int flags, LandData *target=NULL) const
Definition: loadland.cpp:217
Definition: loadland.hpp:44
ESXRecordT mModified
Definition: record.hpp:41
virtual void removeRows(int index, int count)
< Merge modified into base.
Definition: collection.hpp:439
Definition: loadland.hpp:47
void setModified(const ESXRecordT &modified)
Throws an exception, if the record is deleted.
Definition: record.hpp:133
void load(ESM::ESMReader &esm, bool &isDeleted)
Loads the metadata and ID.
Definition: land.cpp:8
unsigned int getSize(const osg::Array *a)
Shortcut to get size of an array, even if pointer is NULL.
Definition: optimizer.cpp:1004
bool tryDelete(const std::string &id)
Definition: idcollection.hpp:129
bool isDeleted() const
Definition: record.cpp:5