28 #ifndef WINTERMUTE_COLL_TEMPL_H 29 #define WINTERMUTE_COLL_TEMPL_H 31 #include "engines/wintermute/base/base_persistence_manager.h" 39 inline void dcConstructElements(TYPE *pElements, int32 nCount) {
41 memset((
void *)pElements, 0, nCount *
sizeof(TYPE));
44 for (; nCount--; pElements++)
45 ::
new((
void *)pElements) TYPE;
50 inline void dcDestructElements(TYPE *pElements, int32 nCount) {
52 for (; nCount--; pElements++)
58 inline void dcCopyElements(TYPE *pDest,
const TYPE *pSrc, int32 nCount) {
74 int32 getSize()
const;
75 int32 getUpperBound()
const;
76 void setSize(int32 nNewSize, int32 nGrowBy = -1);
84 TYPE getAt(int32 nIndex)
const;
85 void setAt(int32 nIndex, TYPE newElement);
86 TYPE& elementAt(int32 nIndex);
89 const TYPE *getData()
const;
93 void setAtGrow(int32 nIndex, TYPE newElement);
94 int32 add(TYPE newElement);
99 TYPE operator[](int32 nIndex)
const;
100 TYPE &operator[](int32 nIndex);
103 void insertAt(int32 nIndex, TYPE newElement, int32 nCount = 1);
104 void removeAt(int32 nIndex, int32 nCount = 1);
138 return _pData[nIndex];
143 _pData[nIndex] = newElement;
148 return _pData[nIndex];
153 return (
const TYPE *)_pData;
158 return (TYPE *)_pData;
163 int32 nIndex = _nSize;
164 setAtGrow(nIndex, newElement);
170 return getAt(nIndex);
175 return elementAt(nIndex);
184 _nSize = _nMaxSize = _nGrowBy = 0;
190 if (_pData !=
nullptr) {
191 dcDestructElements<TYPE>(_pData, _nSize);
192 delete[] (byte *)_pData;
204 if (_pData !=
nullptr) {
205 dcDestructElements<TYPE>(_pData, _nSize);
206 delete[] (byte *)_pData;
209 _nSize = _nMaxSize = 0;
210 }
else if (_pData ==
nullptr) {
212 _pData = (TYPE *)
new byte[nNewSize *
sizeof(TYPE)];
213 dcConstructElements<TYPE>(_pData, nNewSize);
214 _nSize = _nMaxSize = nNewSize;
215 }
else if (nNewSize <= _nMaxSize) {
217 if (nNewSize > _nSize) {
219 dcConstructElements<TYPE>(&_pData[_nSize], nNewSize - _nSize);
220 }
else if (_nSize > nNewSize) {
222 dcDestructElements<TYPE>(&_pData[nNewSize], _nSize - nNewSize);
227 int32 numGrowBy = _nGrowBy;
228 if (numGrowBy == 0) {
231 numGrowBy = _nSize / 8;
232 numGrowBy = (numGrowBy < 4) ? 4 : ((numGrowBy > 1024) ? 1024 : numGrowBy);
235 if (nNewSize < _nMaxSize + numGrowBy)
236 nNewMax = _nMaxSize + numGrowBy;
240 TYPE *pNewData = (TYPE *)
new byte[nNewMax *
sizeof(TYPE)];
243 memcpy(pNewData, _pData, _nSize *
sizeof(TYPE));
246 dcConstructElements<TYPE>(&pNewData[_nSize], nNewSize - _nSize);
249 delete[] (byte *)_pData;
259 int32 nOldSize = _nSize;
260 setSize(_nSize + src._nSize);
261 dcCopyElements<TYPE>(_pData + nOldSize, src._pData, src._nSize);
269 dcCopyElements<TYPE>(_pData, src._pData, src._nSize);
275 if (_nSize != _nMaxSize) {
277 TYPE *pNewData =
nullptr;
279 pNewData = (TYPE *)
new byte[_nSize *
sizeof(TYPE)];
281 memcpy(pNewData, _pData, _nSize *
sizeof(TYPE));
285 delete[] (byte *)_pData;
294 if (nIndex >= _nSize)
295 setSize(nIndex + 1, -1);
296 _pData[nIndex] = newElement;
302 if (nIndex >= _nSize) {
304 setSize(nIndex + nCount, -1);
307 int32 nOldSize = _nSize;
308 setSize(_nSize + nCount, -1);
310 dcDestructElements<TYPE>(&_pData[nOldSize], nCount);
312 memmove(&_pData[nIndex + nCount], &_pData[nIndex],
313 (nOldSize - nIndex) *
sizeof(TYPE));
316 dcConstructElements<TYPE>(&_pData[nIndex], nCount);
321 _pData[nIndex++] = newElement;
328 int32 nMoveCount = _nSize - (nIndex + nCount);
329 dcDestructElements<TYPE>(&_pData[nIndex], nCount);
331 memmove(&_pData[nIndex], &_pData[nIndex + nCount], nMoveCount *
sizeof(TYPE));
338 if (pNewArray->getSize() > 0) {
339 InsertAt(nStartIndex, pNewArray->getAt(0), pNewArray->getSize());
340 for (int32 i = 0; i < pNewArray->getSize(); i++)
341 setAt(nStartIndex + i, pNewArray->getAt(i));
351 if (persistMgr->getIsSaving()) {
352 j = BaseArray::getSize();
353 persistMgr->transferSint32(
"ArraySize", &j);
354 for (i = 0; i < j; i++) {
355 TYPE obj = BaseArray::getAt(i);
356 persistMgr->transferPtr(
"", &obj);
359 BaseArray::setSize(0, -1);
360 persistMgr->transferSint32(
"ArraySize", &j);
361 for (i = 0; i < j; i++) {
363 persistMgr->transferPtr(
"", &obj);
377 if (persistMgr->getIsSaving()) {
379 persistMgr->transferSint32(
"ArraySize", &j);
380 for (i = 0; i < j; i++) {
381 char *obj = getAt(i);
382 persistMgr->transferCharPtr(
"", &obj);
386 persistMgr->transferSint32(
"ArraySize", &j);
387 for (i = 0; i < j; i++) {
389 persistMgr->transferCharPtr(
"", &obj);
403 if (persistMgr->getIsSaving()) {
405 persistMgr->transferSint32(
"ArraySize", &j);
406 for (i = 0; i < j; i++) {
407 const char * obj = getAt(i);
408 persistMgr->transferConstChar(
"", &obj);
412 persistMgr->transferSint32(
"ArraySize", &j);
413 for (i = 0; i < j; i++) {
415 persistMgr->transferConstChar(
"", &obj);
Definition: base_persistence_manager.h:55
Definition: coll_templ.h:68
Definition: coll_templ.h:347
Definition: achievements_tables.h:27