257 template <
typename T>
261 Require (not i.Done ());
262#if qStroika_Foundation_Debug_AssertionsChecked
263 Require (i.fData_ ==
this);
267 const_cast<Link_*
> (i.fCurrent_)->fItem = newValue;
270 template <
typename T>
274#if qStroika_Foundation_Debug_AssertionsChecked
275 Require (i.fData_ ==
this);
283 Link_* prev =
nullptr;
284 if ((this->fHead_ !=
nullptr) and (this->fHead_ != i.fCurrent_)) {
285 for (prev = this->fHead_; prev->fNext != i.fCurrent_; prev = prev->fNext) {
290 if (prev ==
nullptr) {
291 Assert (this->fHead_ == i.fCurrent_);
292 this->fHead_ =
new Link_{item, this->fHead_};
295 Assert (prev->fNext == i.fCurrent_);
296 prev->fNext =
new Link_{item, prev->fNext};
301 template <
typename T>
306#if qStroika_Foundation_Debug_AssertionsChecked
307 Require (i.fData_ ==
this);
315 Link_* prev =
nullptr;
316 if ((this->fHead_ !=
nullptr) and (this->fHead_ != i.fCurrent_)) {
317 for (prev = this->fHead_; prev->fNext != i.fCurrent_; prev = prev->fNext) {
322 if (prev ==
nullptr) {
323 Assert (this->fHead_ == i.fCurrent_);
324 this->fHead_ =
new Link_{item, this->fHead_};
325 *newLinkCreatedAt = ForwardIterator{
this, this->fHead_};
328 Assert (prev->fNext == i.fCurrent_);
329 prev->fNext =
new Link_{item, prev->fNext};
330 *newLinkCreatedAt = ForwardIterator{
this, prev->fNext};
335 template <
typename T>
339 Require (not i.Done ());
340#if qStroika_Foundation_Debug_AssertionsChecked
341 Require (i.fData_ ==
this);
345 const_cast<Link_*
> (i.fCurrent_)->fNext =
new Link_{newValue, i.fCurrent_->fNext};
347 template <
typename T>
350 ForwardIterator next = i;
356 template <
typename T>
360#if qStroika_Foundation_Debug_AssertionsChecked
361 Require (i.fData_ ==
this);
363 Require (not i.Done ());
367 const Link_* victim = i.fCurrent_;
374 Link_* prevLink =
nullptr;
375 if (this->fHead_ != victim) {
376 auto potentiallyPrevLink = this->fHead_;
378 for (; potentiallyPrevLink->fNext != victim; potentiallyPrevLink = potentiallyPrevLink->fNext) {
381 prevLink = potentiallyPrevLink;
383 Assert (prevLink ==
nullptr or prevLink->fNext == victim);
384 if (prevLink ==
nullptr) {
385 Require (this->fHead_ == victim);
387 this->fHead_ = victim->fNext;
390 Assert (prevLink->fNext == victim);
391 prevLink->fNext = victim->fNext;
397 template <
typename T>
398 template <
typename EQUALS_COMPARER>
399 void LinkedList<T>::Remove (ArgByValueType<T> item,
const EQUALS_COMPARER& equalsComparer)
401 Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{*
this};
410 for (ForwardIterator it{
this}; not it.Done (); ++it) {
411 if (equalsComparer (*it, item)) {
418 template <
typename T>
419 template <invocable<T> FUNCTION>
420 inline void LinkedList<T>::Apply (FUNCTION&& doToElement)
const
422 AssertExternallySynchronizedMutex::ReadContext declareContext{*
this};
423 for (
const Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
424 doToElement (i->fItem);
427 template <
typename T>
428 template <predicate<T> FUNCTION>
429 inline auto LinkedList<T>::Find (FUNCTION&& firstThat)
const -> UnderlyingIteratorRep
431 AssertExternallySynchronizedMutex::ReadContext declareContext{*
this};
432 for (Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
433 if (firstThat (i->fItem)) {
439 template <
typename T>
440 template <
typename EQUALS_COMPARER>
441 T* LinkedList<T>::Find (ArgByValueType<T> item, EQUALS_COMPARER&& equalsComparer)
443 Debug::AssertExternallySynchronizedMutex::WriteContext declareContext{*
this};
444 for (Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
445 if (forward<EQUALS_COMPARER> (equalsComparer) (i->fItem, item)) {
451 template <
typename T>
452 template <
typename EQUALS_COMPARER>
453 const T* LinkedList<T>::Find (ArgByValueType<T> item, EQUALS_COMPARER&& equalsComparer)
const
455 AssertExternallySynchronizedMutex::ReadContext declareContext{*
this};
456 for (
const Link_* i = fHead_; i !=
nullptr; i = i->fNext) {
457 if (forward<EQUALS_COMPARER> (equalsComparer) (i->fItem, item)) {
463 template <
typename T>
468 for (Link_* i = fHead_; i !=
nullptr;) {
477 template <
typename T>
480 AssertExternallySynchronizedMutex::ReadContext declareContext{*
this};
482 Require (i < size ());
483 const Link_* cur = fHead_;
484 for (; i != 0; cur = cur->fNext, --i) {
490 template <
typename T>
495 Require (i < size ());
497 for (; i != 0; cur = cur->fNext, --i) {
525 constexpr LinkedList<T>::ForwardIterator::ForwardIterator ([[maybe_unused]]
const LinkedList* data, UnderlyingIteratorRep startAt) noexcept