v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
list.h
Go to the documentation of this file.
1// Copyright 2018 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_HEAP_LIST_H_
6#define V8_HEAP_LIST_H_
7
8#include <atomic>
9
10#include "src/base/logging.h"
11
12namespace v8 {
13namespace internal {
14namespace heap {
15
16template <class T>
17class List {
18 public:
19 List() = default;
20 List(List&& other) V8_NOEXCEPT : front_(std::exchange(other.front_, nullptr)),
21 back_(std::exchange(other.back_, nullptr)),
22 size_(std::exchange(other.size_, 0)) {}
24 front_ = std::exchange(other.front_, nullptr);
25 back_ = std::exchange(other.back_, nullptr);
26 size_ = std::exchange(other.size_, 0);
27 return *this;
28 }
29
30 void PushBack(T* element) {
31 DCHECK(!element->list_node().next());
32 DCHECK(!element->list_node().prev());
33 if (back_) {
35 InsertAfter(element, back_);
36 } else {
37 AddFirstElement(element);
38 }
39 size_++;
40 }
41
42 void PushFront(T* element) {
43 DCHECK(!element->list_node().next());
44 DCHECK(!element->list_node().prev());
45 if (front_) {
47 InsertBefore(element, front_);
48 } else {
49 AddFirstElement(element);
50 }
51 size_++;
52 }
53
54 void Remove(T* element) {
55 DCHECK(Contains(element));
56 if (back_ == element) {
57 back_ = element->list_node().prev();
58 }
59 if (front_ == element) {
60 front_ = element->list_node().next();
61 }
62 T* next = element->list_node().next();
63 T* prev = element->list_node().prev();
64 if (next) next->list_node().set_prev(prev);
65 if (prev) prev->list_node().set_next(next);
66 element->list_node().set_prev(nullptr);
67 element->list_node().set_next(nullptr);
68 size_--;
69 }
70
71 bool Contains(const T* element) const {
72 const T* it = front_;
73 while (it) {
74 if (it == element) return true;
75 it = it->list_node().next();
76 }
77 return false;
78 }
79
80 bool Empty() const {
81 DCHECK_EQ(size_ == 0, !front_);
82 DCHECK_EQ(size_ == 0, !back_);
83 return size_ == 0;
84 }
85
86 T* front() { return front_; }
87 T* back() { return back_; }
88
89 const T* front() const { return front_; }
90 const T* back() const { return back_; }
91
92 size_t size() const { return size_; }
93
94 private:
95 void AddFirstElement(T* element) {
96 DCHECK(!back_);
97 DCHECK(!front_);
98 DCHECK(!element->list_node().next());
99 DCHECK(!element->list_node().prev());
100 element->list_node().set_prev(nullptr);
101 element->list_node().set_next(nullptr);
102 front_ = element;
103 back_ = element;
104 }
105
106 void InsertAfter(T* element, T* other) {
107 T* other_next = other->list_node().next();
108 element->list_node().set_next(other_next);
109 element->list_node().set_prev(other);
110 other->list_node().set_next(element);
111 if (other_next)
112 other_next->list_node().set_prev(element);
113 else
114 back_ = element;
115 }
116
117 void InsertBefore(T* element, T* other) {
118 T* other_prev = other->list_node().prev();
119 element->list_node().set_next(other);
120 element->list_node().set_prev(other_prev);
121 other->list_node().set_prev(element);
122 if (other_prev) {
123 other_prev->list_node().set_next(element);
124 } else {
125 front_ = element;
126 }
127 }
128
129 T* front_{nullptr};
130 T* back_{nullptr};
131 size_t size_{0};
132};
133
134template <class T>
135class ListNode {
136 public:
138
139 T* next() { return next_; }
140 T* prev() { return prev_; }
141
142 const T* next() const { return next_; }
143 const T* prev() const { return prev_; }
144
145 void Initialize() {
146 next_ = nullptr;
147 prev_ = nullptr;
148 }
149
150 private:
151 void set_next(T* next) { next_ = next; }
152 void set_prev(T* prev) { prev_ = prev; }
153
156
157 friend class List<T>;
158};
159} // namespace heap
160} // namespace internal
161} // namespace v8
162
163#endif // V8_HEAP_LIST_H_
void set_prev(T *prev)
Definition list.h:152
const T * next() const
Definition list.h:142
const T * prev() const
Definition list.h:143
void set_next(T *next)
Definition list.h:151
const T * front() const
Definition list.h:89
List(List &&other) V8_NOEXCEPT
Definition list.h:20
void PushBack(T *element)
Definition list.h:30
bool Contains(const T *element) const
Definition list.h:71
void PushFront(T *element)
Definition list.h:42
void Remove(T *element)
Definition list.h:54
bool Empty() const
Definition list.h:80
void AddFirstElement(T *element)
Definition list.h:95
size_t size() const
Definition list.h:92
void InsertBefore(T *element, T *other)
Definition list.h:117
List & operator=(List &&other) V8_NOEXCEPT
Definition list.h:23
const T * back() const
Definition list.h:90
void InsertAfter(T *element, T *other)
Definition list.h:106
#define V8_NOEXCEPT
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485