54 PAGE* page = (PAGE*)
::odrxAlloc(
sizeof(PAGE) + pageSize *
sizeof(T));
64 A::destroyRange(items(), _size);
72 return *(items(
index));
77 return *(items(
index));
83 A::copyConstruct(items(_size),
value);
90 A::copyAssignRange(items(i+1), items(i), moved);
91 A::copyConstruct(items(i),
value);
97 A::copyConstructFill(items(_size), newSize-_size,
value);
103 A::defaultConstructFill(items(_size), newSize-_size);
107 A::destroyRange(items(0), _size - newSize);
111 void moveFrom(PAGE* src,
size_type start)
116 A::copyAssignRangeDisjoint(items(_size), src->items(), start);
119 A::copyAssignRange(src->items(), src->items(start), src->_size);
123 A::destroyRange(items(i), 1);
126 A::copyAssignRange(items(i), items(i+1), _size - i);
130 A::destroyRange(items(_size--), 1);
135 return (T*)((
OdUInt8*)
this +
sizeof(PAGE)) + i;
151 PAGE* page = PAGE::allocate(_pageSize);
168 PAGE* insertPage(PAGE* prev)
170 PAGE* page = PAGE::allocate(_pageSize);
180 _first->_prev = page;
181 page->_next = _first;
194 prev->_next->_prev = page;
195 page->_next = prev->_next;
210 OdLinkedArray(
const OdLinkedArray&);
211 OdLinkedArray& operator = (
const OdLinkedArray&);
224 , _pageSize(pageSize)
249 PAGE *next, *curr = _first;
271 T
data = _last->at(_last->_size - 1);
277 PAGE* p = _last->_prev;
289#if defined(_MSC_VER) && (_MSC_VER < 1910)
290 :
public std::iterator<std::bidirectional_iterator_tag, T, void>
301 operator const T*()
const {
344 return (!(*
this == it));
389 friend class OdLinkedArray<T,A>;
397 return this->_page->at(this->_ind);
400 return &(this->_page->at(this->_ind));
438 friend class OdLinkedArray<T, A>;
460 return iterator(_last, (_last ? _last->_size : 0));
479 while (it != endIt && *it != val)
495 while (it != endIt && *it != val)
516 int d = newSize -
size();
522 if(_last->_size < _pageSize) {
523 d0 =
odmin(d, (
int)(_pageSize - _last->_size));
524 _last->resize(_last->_size + d0);
528 while (d && _last->_next) {
529 _last = _last->_next;
531 d0 =
odmin(d, (
int)_pageSize);
537 while (d>=(
int)_pageSize)
539 addPage()->resize(_pageSize);
545 addPage()->resize(d);
553 PAGE* pToRemove = _last;
554 _last = _last->_prev;
555 pToRemove->release();
588 PAGE* curPage = before._page;
590 if (curPage->_size < _pageSize)
592 curPage->insertAt(curInd, val);
596 PAGE* prevPage = curPage->_prev;
597 if (!prevPage || (prevPage->_size + curInd) >= _pageSize)
599 prevPage = insertPage(prevPage);
603 prevPage->moveFrom(curPage, curInd);
606 prevPage->append(val);
607 before =
iterator(prevPage, prevPage->_size-1);
620 PAGE* curPage = at._page;
621 if (curPage == _last && curInd == (_last->_size - 1))
623 T
data = curPage->at(curInd);
624 if (curPage->_size == 1)
627 curPage->_prev->_next = curPage->_next;
629 this->_first = curPage->_next;
631 curPage->_next->_prev = curPage->_prev;
637 curPage->remove(curInd);
647 if (_last && _last->_size < _pageSize)
649 _last->append(
value);
653 addPage()->append(
value);
706 itemNums += page->_size;
719 PAGE *curr = _last->_next;