// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/containers/linked_list.h" #include "base/check_op.h" namespace base { namespace internal { LinkNodeBase::LinkNodeBase() = default; LinkNodeBase::LinkNodeBase(LinkNodeBase* previous, LinkNodeBase* next) : previous_(previous), next_(next) {} LinkNodeBase::LinkNodeBase(LinkNodeBase&& rhs) { next_ = rhs.next_; rhs.next_ = nullptr; previous_ = rhs.previous_; rhs.previous_ = nullptr; // If the node belongs to a list, next_ and previous_ are both non-null. // Otherwise, they are both null. if (next_) { next_->previous_ = this; previous_->next_ = this; } } void LinkNodeBase::RemoveFromList() { previous_->next_ = next_; next_->previous_ = previous_; // next() and previous() return non-null if and only this node is not in any // list. next_ = nullptr; previous_ = nullptr; } void LinkNodeBase::InsertBeforeBase(LinkNodeBase* e) { CHECK_EQ(previous_, nullptr); CHECK_EQ(next_, nullptr); next_ = e; previous_ = e->previous_; e->previous_->next_ = this; e->previous_ = this; } void LinkNodeBase::InsertAfterBase(LinkNodeBase* e) { CHECK_EQ(previous_, nullptr); CHECK_EQ(next_, nullptr); next_ = e->next_; previous_ = e; e->next_->previous_ = this; e->next_ = this; } } // namespace internal } // namespace base