437 delete[] (
char*)fItems_;
440 template <
typename T>
441 inline void Array<T>::MoveIteratorHereAfterClone (IteratorBase* pi, [[maybe_unused]]
const Array<T>* movedFrom)
const
446 Require (pi->CurrentIndex () <= this->size ());
447 Require (pi->_fData == movedFrom);
450 template <
typename T>
456 template <
typename T>
462 template <
typename T>
467 Require (i < fLength_);
470 template <
typename T>
475 Require (i < fLength_);
478 template <
typename T>
483 Require (i < fLength_);
486 template <
typename T>
491 Require (i < fLength_);
494 template <
typename T>
499 Require (i < fLength_);
502 template <
typename T>
507 Require (i < fLength_);
510 template <
typename T>
516 template <
typename T>
520 return fLength_ == 0;
522 template <
typename T>
526 return fSlotsAllocated_;
528 template <
typename T>
529 inline void Array<T>::shrink_to_fit ()
534 template <
typename T>
538 Require (not i.Done ());
539 Require (i._fData ==
this);
540 this->Remove (i.CurrentIndex ());
542 template <
typename T>
546 Require (not i.Done ());
547 Require (i._fData ==
this);
548 size_t idx = i.CurrentIndex ();
550 if (idx == this->fLength_) {
557 template <
typename T>
561 Require (not i.Done ());
562 this->Remove (i.CurrentIndex ());
564 template <
typename T>
565 inline void Array<T>::SetAt (
const ForwardIterator& i, ArgByValueType<T> newValue)
568 Require (i._fData ==
this);
569 Require (not i.Done ());
570 SetAt (i.CurrentIndex (), newValue);
572 template <
typename T>
573 inline void Array<T>::SetAt (
const BackwardIterator& i, ArgByValueType<T> newValue)
575 Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{*
this};
576 Require (not i.Done ());
577 SetAt (i.CurrentIndex (), newValue);
585 template <
typename T>
586 inline Array<T>::IteratorBase::IteratorBase (
const Array* data)
591#if qStroika_Foundation_Debug_AssertionsChecked
592 template <
typename T>
593 inline Array<T>::IteratorBase::~IteratorBase ()
595#if qStroika_Foundation_Debug_AssertionsChecked
597 _fData =
reinterpret_cast<Array<T>*
> (-1);
598 _fCurrentIdx = numeric_limits<size_t>::max ();
602 template <
typename T>
603 inline size_t Array<T>::IteratorBase::CurrentIndex ()
const
612 template <
typename T>
613 inline const T& Array<T>::IteratorBase::operator* ()
const
618 Require (0 <= _fCurrentIdx and _fCurrentIdx < _fData->fLength_);
619 return _fData->fItems_[_fCurrentIdx];
621 template <
typename T>
622 inline const T* Array<T>::IteratorBase::operator->()
const
627 Require (0 <= _fCurrentIdx and _fCurrentIdx < _fData->fLength_);
628 return _fData->PeekAt (_fCurrentIdx);
630 template <
typename T>
631 inline void Array<T>::IteratorBase::SetIndex (
size_t i)
635 Require (i <= _fData->fLength_);
638 template <
typename T>
648 template <
typename T>
653 Require (i <= _fData->fLength_);
656 template <
typename T>
659#if qStroika_Foundation_Debug_AssertionsChecked
660 Require (
data == _fData);
663 template <
typename T>
666#if qStroika_Foundation_Debug_AssertionsChecked
670#if qStroika_Foundation_Debug_AssertionsChecked
671 template <
typename T>
674 Assert (0 <= _fCurrentIdx);
675 if (_fData !=
nullptr) {
676#if qStroika_Foundation_Containers_DataStructures_Array_IncludeSlowDebugChecks_
679 Assert (_fCurrentIdx <= _fData->fLength_);
689 template <
typename T>
694 this->_fCurrentIdx = startAt;
697 template <
typename T>
700 this->_fData = -src._fData;
701 this->_fCurrentIdx = src._fCurrentIdx;
702 src._fData =
nullptr;
704 template <
typename T>