18 TIntrusiveList(
int tag = 0)
19 : Root_{
nullptr,
nullptr, tag}
24 TIntrusiveList(
const TIntrusiveList&) =
delete;
25 TIntrusiveList& operator=(
const TIntrusiveList&) =
delete;
35 void PushBack(std::unique_ptr<T>&& node) {
40 Tail_->Next = std::move(node);
41 Tail_ = Tail_->Next.get();
46 std::unique_ptr<T> Erase(T* node) {
48 assert(node != &Root_);
50 if (node->Tag != Tag_) {
54 std::unique_ptr<T>& owner = node->Prev->Next;
55 std::unique_ptr<T> result = std::move(owner);
56 owner = std::move(node->Next);
59 owner->Prev = node->Prev;
64 result->Next =
nullptr;
65 result->Prev =
nullptr;
74 return Root_.Next.get();
77 std::unique_ptr<T> PopFront()
noexcept {
78 auto result = std::move(Root_.Next);
79 Root_.Next = std::move(result->Next);
82 Root_.Next->Prev = &Root_;
87 result->Next =
nullptr;
88 result->Prev =
nullptr;