5 #ifndef V8_ZONE_ZONE_HANDLE_SET_H_ 6 #define V8_ZONE_ZONE_HANDLE_SET_H_ 8 #include "src/handles.h" 9 #include "src/zone/zone-containers.h" 10 #include "src/zone/zone.h" 20 : data_(handle.address() | kSingletonTag) {
21 DCHECK(IsAligned(handle.address(), kPointerAlignment));
24 bool is_empty()
const {
return data_ == kEmptyTag; }
27 if ((data_ & kTagMask) == kEmptyTag)
return 0;
28 if ((data_ & kTagMask) == kSingletonTag)
return 1;
29 return list()->size();
33 DCHECK_NE(kEmptyTag, data_ & kTagMask);
34 if ((data_ & kTagMask) == kSingletonTag) {
38 return Handle<T>(list()->at(static_cast<int>(
i)));
41 Handle<T> operator[](
size_t i)
const {
return at(
i); }
44 Address*
const value =
reinterpret_cast<Address*
>(handle.address());
45 DCHECK(IsAligned(reinterpret_cast<Address>(value), kPointerAlignment));
46 if ((data_ & kTagMask) == kEmptyTag) {
47 data_ =
reinterpret_cast<Address>(value) | kSingletonTag;
48 }
else if ((data_ & kTagMask) == kSingletonTag) {
49 if (singleton() == value)
return;
51 if (singleton() < value) {
52 list->push_back(singleton());
53 list->push_back(value);
55 list->push_back(value);
56 list->push_back(singleton());
58 DCHECK(IsAligned(reinterpret_cast<Address>(list), kPointerAlignment));
59 data_ =
reinterpret_cast<Address>(list) | kListTag;
61 DCHECK_EQ(kListTag, data_ & kTagMask);
62 List const*
const old_list = list();
63 for (
size_t i = 0;
i < old_list->size(); ++
i) {
64 if (old_list->at(
i) == value)
return;
65 if (old_list->at(
i) > value)
break;
67 List* new_list =
new (zone->New(
sizeof(
List)))
List(zone);
68 new_list->reserve(old_list->size() + 1);
70 for (;
i < old_list->size(); ++
i) {
71 if (old_list->at(
i) > value)
break;
72 new_list->push_back(old_list->at(
i));
74 new_list->push_back(value);
75 for (;
i < old_list->size(); ++
i) {
76 new_list->push_back(old_list->at(
i));
78 DCHECK_EQ(old_list->size() + 1, new_list->size());
79 DCHECK(IsAligned(reinterpret_cast<Address>(new_list), kPointerAlignment));
80 data_ =
reinterpret_cast<Address>(new_list) | kListTag;
85 if (data_ == other.data_)
return true;
86 if (data_ == kEmptyTag)
return false;
87 if (other.data_ == kEmptyTag)
return true;
88 if ((data_ & kTagMask) == kSingletonTag)
return false;
89 DCHECK_EQ(kListTag, data_ & kTagMask);
90 List const* cached_list = list();
91 if ((other.data_ & kTagMask) == kSingletonTag) {
92 return std::find(cached_list->begin(), cached_list->end(),
93 other.singleton()) != cached_list->end();
95 DCHECK_EQ(kListTag, other.data_ & kTagMask);
97 for (
size_t i = 0;
i < other.list()->size(); ++
i) {
98 if (std::find(cached_list->begin(), cached_list->end(),
99 other.list()->at(
i)) == cached_list->end()) {
107 if (data_ == kEmptyTag)
return false;
108 Address* other_address =
reinterpret_cast<Address*
>(other.address());
109 if ((data_ & kTagMask) == kSingletonTag) {
110 return singleton() == other_address;
112 DCHECK_EQ(kListTag, data_ & kTagMask);
113 return std::find(list()->begin(), list()->end(), other_address) !=
120 for (
size_t i = 0;
i < size(); ++
i) {
122 if (value.address() != handle.address()) {
123 that.insert(value, zone);
126 std::swap(*
this, that);
131 if (lhs.data_ == rhs.data_)
return true;
132 if ((lhs.data_ & kTagMask) == kListTag &&
133 (rhs.data_ & kTagMask) == kListTag) {
134 List const*
const lhs_list = lhs.list();
135 List const*
const rhs_list = rhs.list();
136 if (lhs_list->size() == rhs_list->size()) {
137 for (
size_t i = 0;
i < lhs_list->size(); ++
i) {
138 if (lhs_list->at(
i) != rhs_list->at(
i))
return false;
148 return !(lhs == rhs);
152 return static_cast<size_t>(
set.data_);
162 List const* list()
const {
163 DCHECK_EQ(kListTag, data_ & kTagMask);
164 return reinterpret_cast<List const*
>(data_ - kListTag);
168 DCHECK_EQ(kSingletonTag, data_ & kTagMask);
169 return reinterpret_cast<Address*
>(data_ - kSingletonTag);
179 STATIC_ASSERT(kTagMask < kPointerAlignment);
184 template <
typename T>
185 std::ostream& operator<<(std::ostream& os, ZoneHandleSet<T>
set) {
186 for (
size_t i = 0;
i <
set.size(); ++
i) {
187 if (
i > 0) os <<
", ";
193 template <
typename T>
196 typedef std::forward_iterator_tag iterator_category;
197 typedef std::ptrdiff_t difference_type;
203 : set_(other.set_), current_(other.current_) {}
205 reference operator*()
const {
return (*set_)[current_]; }
207 return set_ == other.set_ && current_ == other.current_;
210 return !(*
this == other);
213 DCHECK(current_ < set_->size());
223 : set_(
set), current_(current) {}
229 template <
typename T>
234 template <
typename T>
242 #endif // V8_ZONE_ZONE_HANDLE_SET_H_