262 Require (not empty ());
265 Link_* victim = fHead_;
266 fHead_ = victim->fNext;
271 template <
typename T>
275#if qStroika_Foundation_Debug_AssertionsChecked
276 Require (i.fData_ ==
this);
278 Require (not i.AtEnd ());
281 return &
const_cast<Link_*
> (i.fCurrent_)->fItem;
283 template <
typename T>
287 Require (not i.AtEnd ());
288#if qStroika_Foundation_Debug_AssertionsChecked
289 Require (i.fData_ ==
this);
293 const_cast<Link_*
> (i.fCurrent_)->fItem = newValue;
296 template <
typename T>
300#if qStroika_Foundation_Debug_AssertionsChecked
301 Require (i.fData_ ==
this);
309 Link_* prev =
nullptr;
310 if ((this->fHead_ !=
nullptr) and (this->fHead_ != i.fCurrent_)) {
311 for (prev = this->fHead_; prev->fNext != i.fCurrent_; prev = prev->fNext) {
316 if (prev ==
nullptr) {
317 Assert (this->fHead_ == i.fCurrent_);
318 this->fHead_ =
new Link_{item, this->fHead_};
321 Assert (prev->fNext == i.fCurrent_);
322 prev->fNext =
new Link_{item, prev->fNext};
328 template <
typename T>
333#if qStroika_Foundation_Debug_AssertionsChecked
334 Require (i.fData_ ==
this);
342 Link_* prev =
nullptr;
343 if ((this->fHead_ !=
nullptr) and (this->fHead_ != i.fCurrent_)) {
344 for (prev = this->fHead_; prev->fNext != i.fCurrent_; prev = prev->fNext) {
349 if (prev ==
nullptr) {
350 Assert (this->fHead_ == i.fCurrent_);
351 this->fHead_ =
new Link_{item, this->fHead_};
352 *newLinkCreatedAt = ForwardIterator{
this, this->fHead_};
355 Assert (prev->fNext == i.fCurrent_);
356 prev->fNext =
new Link_{item, prev->fNext};
357 *newLinkCreatedAt = ForwardIterator{
this, prev->fNext};
363 template <
typename T>
367 Require (not i.AtEnd ());
368#if qStroika_Foundation_Debug_AssertionsChecked
369 Require (i.fData_ ==
this);
373 const_cast<Link_*
> (i.fCurrent_)->fNext =
new Link_{newValue, i.fCurrent_->fNext};
376 template <
typename T>
379 ForwardIterator next = i;
385 template <
typename T>
389#if qStroika_Foundation_Debug_AssertionsChecked
390 Require (i.fData_ ==
this);
392 Require (not i.AtEnd ());
396 const Link_* victim = i.fCurrent_;
403 Link_* prevLink =
nullptr;
404 if (this->fHead_ != victim) {
405 auto potentiallyPrevLink = this->fHead_;
407 for (; potentiallyPrevLink->fNext != victim; potentiallyPrevLink = potentiallyPrevLink->fNext) {
410 prevLink = potentiallyPrevLink;
412 Assert (prevLink ==
nullptr or prevLink->fNext == victim);
413 if (prevLink ==
nullptr) {
414 Require (this->fHead_ == victim);
416 this->fHead_ = victim->fNext;
419 Assert (prevLink->fNext == victim);
420 prevLink->fNext = victim->fNext;
427 template <
typename T>
428 template <
typename EQUALS_COMPARER>
429 void LinkedList<T>::Remove (ArgByValueType<T> item,
const EQUALS_COMPARER& equalsComparer)
431 Debug::AssertExternallySynchronizedChecker::WriteContext declareContext{*
this};
440 for (ForwardIterator it{
this}; not it.AtEnd (); ++it) {
441 if (equalsComparer (*it, item)) {
448 template <
typename T>
449 template <invocable<T> FUNCTION>
450 inline void LinkedList<T>::Apply (FUNCTION&& doToElement)
const
452 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
453 for (
const Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
454 doToElement (i->fItem);
457 template <
typename T>
458 template <predicate<T> FUNCTION>
459 inline auto LinkedList<T>::Find (FUNCTION&& firstThat)
const -> UnderlyingIteratorRep
461 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
462 for (Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
463 if (firstThat (i->fItem)) {
469 template <
typename T>
470 template <
typename EQUALS_COMPARER>
471 T* LinkedList<T>::Find (ArgByValueType<T> item, EQUALS_COMPARER&& equalsComparer)
473 Debug::AssertExternallySynchronizedChecker::WriteContext declareContext{*
this};
474 for (Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
475 if (forward<EQUALS_COMPARER> (equalsComparer) (i->fItem, item)) {
481 template <
typename T>
482 template <
typename EQUALS_COMPARER>
483 const T* LinkedList<T>::Find (ArgByValueType<T> item, EQUALS_COMPARER&& equalsComparer)
const
485 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
486 for (
const Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
487 if (forward<EQUALS_COMPARER> (equalsComparer) (i->fItem, item)) {
493 template <
typename T>
498 for (Link_* i = fHead_; i !=
nullptr;) {
508 template <
typename T>
511 AssertExternallySynchronizedChecker::ReadContext declareContext{*
this};
513 Require (i < size ());
514 const Link_* cur = fHead_;
515 for (; i != 0; cur = cur->fNext, --i) {
521 template <
typename T>
526 Require (i < size ());
528 for (; i != 0; cur = cur->fNext, --i) {
560 constexpr LinkedList<T>::ForwardIterator::ForwardIterator ([[maybe_unused]]
const LinkedList* data, UnderlyingIteratorRep startAt) noexcept