28 #ifndef WINTERMUTE_COLL_TEMPL_H 29 #define WINTERMUTE_COLL_TEMPL_H 31 #include "engines/wintermute/base/base_persistence_manager.h" 37 inline void dcConstructElements(TYPE *pElements, int32 nCount) {
39 memset((
void *)pElements, 0, nCount *
sizeof(TYPE));
42 for (; nCount--; pElements++)
43 ::
new((
void *)pElements) TYPE;
48 inline void dcDestructElements(TYPE *pElements, int32 nCount) {
50 for (; nCount--; pElements++)
56 inline void dcCopyElements(TYPE *pDest,
const TYPE *pSrc, int32 nCount) {
72 int32 getSize()
const;
73 int32 getUpperBound()
const;
74 void setSize(int32 nNewSize, int32 nGrowBy = -1);
82 TYPE getAt(int32 nIndex)
const;
83 void setAt(int32 nIndex, TYPE newElement);
84 TYPE &elementAt(int32 nIndex);
87 const TYPE *getData()
const;
91 void setAtGrow(int32 nIndex, TYPE newElement);
92 int32 add(TYPE newElement);
97 TYPE operator[](int32 nIndex)
const;
98 TYPE &operator[](int32 nIndex);
101 void insertAt(int32 nIndex, TYPE newElement, int32 nCount = 1);
102 void removeAt(int32 nIndex, int32 nCount = 1);
136 return _pData[nIndex];
141 _pData[nIndex] = newElement;
146 return _pData[nIndex];
151 return (
const TYPE *)_pData;
156 return (TYPE *)_pData;
161 int32 nIndex = _nSize;
162 setAtGrow(nIndex, newElement);
168 return getAt(nIndex);
173 return elementAt(nIndex);
182 _nSize = _nMaxSize = _nGrowBy = 0;
188 if (_pData !=
nullptr) {
189 dcDestructElements<TYPE>(_pData, _nSize);
190 delete[] (byte *)_pData;
202 if (_pData !=
nullptr) {
203 dcDestructElements<TYPE>(_pData, _nSize);
204 delete[] (byte *)_pData;
207 _nSize = _nMaxSize = 0;
208 }
else if (_pData ==
nullptr) {
210 _pData = (TYPE *)
new byte[nNewSize *
sizeof(TYPE)];
211 dcConstructElements<TYPE>(_pData, nNewSize);
212 _nSize = _nMaxSize = nNewSize;
213 }
else if (nNewSize <= _nMaxSize) {
215 if (nNewSize > _nSize) {
217 dcConstructElements<TYPE>(&_pData[_nSize], nNewSize - _nSize);
218 }
else if (_nSize > nNewSize) {
220 dcDestructElements<TYPE>(&_pData[nNewSize], _nSize - nNewSize);
225 int32 numGrowBy = _nGrowBy;
226 if (numGrowBy == 0) {
229 numGrowBy = _nSize / 8;
230 numGrowBy = (numGrowBy < 4) ? 4 : ((numGrowBy > 1024) ? 1024 : numGrowBy);
233 if (nNewSize < _nMaxSize + numGrowBy)
234 nNewMax = _nMaxSize + numGrowBy;
238 TYPE *pNewData = (TYPE *)
new byte[nNewMax *
sizeof(TYPE)];
241 memcpy(pNewData, _pData, _nSize *
sizeof(TYPE));
244 dcConstructElements<TYPE>(&pNewData[_nSize], nNewSize - _nSize);
247 delete[] (byte *)_pData;
257 int32 nOldSize = _nSize;
258 setSize(_nSize + src._nSize);
259 dcCopyElements<TYPE>(_pData + nOldSize, src._pData, src._nSize);
267 dcCopyElements<TYPE>(_pData, src._pData, src._nSize);
273 if (_nSize != _nMaxSize) {
275 TYPE *pNewData =
nullptr;
277 pNewData = (TYPE *)
new byte[_nSize *
sizeof(TYPE)];
279 memcpy(pNewData, _pData, _nSize *
sizeof(TYPE));
283 delete[] (byte *)_pData;
292 if (nIndex >= _nSize)
293 setSize(nIndex + 1, -1);
294 _pData[nIndex] = newElement;
300 if (nIndex >= _nSize) {
302 setSize(nIndex + nCount, -1);
305 int32 nOldSize = _nSize;
306 setSize(_nSize + nCount, -1);
308 dcDestructElements<TYPE>(&_pData[nOldSize], nCount);
310 memmove(&_pData[nIndex + nCount], &_pData[nIndex],
311 (nOldSize - nIndex) *
sizeof(TYPE));
314 dcConstructElements<TYPE>(&_pData[nIndex], nCount);
319 _pData[nIndex++] = newElement;
326 int32 nMoveCount = _nSize - (nIndex + nCount);
327 dcDestructElements<TYPE>(&_pData[nIndex], nCount);
329 memmove(&_pData[nIndex], &_pData[nIndex + nCount], nMoveCount *
sizeof(TYPE));
336 if (pNewArray->getSize() > 0) {
337 insertAt(nStartIndex, pNewArray->getAt(0), pNewArray->getSize());
338 for (int32 i = 0; i < pNewArray->getSize(); i++)
339 setAt(nStartIndex + i, pNewArray->getAt(i));
349 if (persistMgr->getIsSaving()) {
350 j = BaseArray::getSize();
351 persistMgr->transferSint32(
"ArraySize", &j);
352 for (i = 0; i < j; i++) {
353 TYPE obj = BaseArray::getAt(i);
354 persistMgr->transferPtr(
"", &obj);
357 BaseArray::setSize(0, -1);
358 persistMgr->transferSint32(
"ArraySize", &j);
359 for (i = 0; i < j; i++) {
361 persistMgr->transferPtr(
"", &obj);
375 if (persistMgr->getIsSaving()) {
376 j = BaseArray::getSize();
377 persistMgr->transferSint32(
"ArraySize", &j);
378 for (i = 0; i < j; i++) {
379 char *obj = BaseArray::getAt(i);
380 persistMgr->transferCharPtr(
"", &obj);
384 persistMgr->transferSint32(
"ArraySize", &j);
385 for (i = 0; i < j; i++) {
387 persistMgr->transferCharPtr(
"", &obj);
401 if (persistMgr->getIsSaving()) {
402 j = BaseArray::getSize();
403 persistMgr->transferSint32(
"ArraySize", &j);
404 for (i = 0; i < j; i++) {
405 const char * obj = BaseArray::getAt(i);
406 persistMgr->transferConstChar(
"", &obj);
409 BaseArray::setSize(0, -1);
410 persistMgr->transferSint32(
"ArraySize", &j);
411 for (i = 0; i < j; i++) {
413 persistMgr->transferConstChar(
"", &obj);
Definition: base_persistence_manager.h:43
Definition: coll_templ.h:66
Definition: coll_templ.h:345
Definition: achievements_tables.h:27