Index: src/unique.h |
diff --git a/src/unique.h b/src/unique.h |
index 7ae704a26ad18922944050722073ee0a5dfed6c0..38cc336426fa8403db3241b3fcf1fe360d2a368f 100644 |
--- a/src/unique.h |
+++ b/src/unique.h |
@@ -64,6 +64,10 @@ class Unique V8_FINAL { |
handle_ = handle; |
} |
+ // TODO(titzer): this is a hack to migrate to Unique<T> incrementally. |
+ Unique(Address raw_address, Handle<T> handle) |
+ : raw_address_(raw_address), handle_(handle) { } |
+ |
// Constructor for handling automatic up casting. |
// Ex. Unique<JSFunction> can be passed when Unique<Object> is expected. |
template <class S> Unique(Unique<S> uniq) { |
@@ -138,7 +142,7 @@ class UniqueSet V8_FINAL : public ZoneObject { |
} |
// Compare this set against another set. O(|this|). |
- bool Equals(UniqueSet<T>* that) { |
+ bool Equals(UniqueSet<T>* that) const { |
if (that->size_ != this->size_) return false; |
for (int i = 0; i < this->size_; i++) { |
if (this->array_[i] != that->array_[i]) return false; |
@@ -146,8 +150,17 @@ class UniqueSet V8_FINAL : public ZoneObject { |
return true; |
} |
+ template <typename U> |
+ bool Contains(Unique<U> elem) const { |
+ // TODO(titzer): use binary search for larger sets. |
Toon Verwaest
2013/09/13 11:20:49
Maybe you want to add an ASSERT that size_ <= 8; o
|
+ for (int i = 0; i < size_; i++) { |
+ if (this->array_[i] == elem) return true; |
+ } |
+ return false; |
+ } |
+ |
// Check if this set is a subset of the given set. O(|this| + |that|). |
- bool IsSubset(UniqueSet<T>* that) { |
+ bool IsSubset(UniqueSet<T>* that) const { |
if (that->size_ < this->size_) return false; |
int j = 0; |
for (int i = 0; i < this->size_; i++) { |
@@ -163,7 +176,7 @@ class UniqueSet V8_FINAL : public ZoneObject { |
// Returns a new set representing the intersection of this set and the other. |
// O(|this| + |that|). |
- UniqueSet<T>* Intersect(UniqueSet<T>* that, Zone* zone) { |
+ UniqueSet<T>* Intersect(UniqueSet<T>* that, Zone* zone) const { |
if (that->size_ == 0 || this->size_ == 0) return new(zone) UniqueSet<T>(); |
UniqueSet<T>* out = new(zone) UniqueSet<T>(); |
@@ -190,7 +203,7 @@ class UniqueSet V8_FINAL : public ZoneObject { |
// Returns a new set representing the union of this set and the other. |
// O(|this| + |that|). |
- UniqueSet<T>* Union(UniqueSet<T>* that, Zone* zone) { |
+ UniqueSet<T>* Union(UniqueSet<T>* that, Zone* zone) const { |
if (that->size_ == 0) return this->Copy(zone); |
if (this->size_ == 0) return that->Copy(zone); |
@@ -222,7 +235,7 @@ class UniqueSet V8_FINAL : public ZoneObject { |
} |
// Makes an exact copy of this set. O(|this| + |that|). |
- UniqueSet<T>* Copy(Zone* zone) { |
+ UniqueSet<T>* Copy(Zone* zone) const { |
UniqueSet<T>* copy = new(zone) UniqueSet<T>(); |
copy->size_ = this->size_; |
copy->capacity_ = this->size_; |
@@ -231,10 +244,15 @@ class UniqueSet V8_FINAL : public ZoneObject { |
return copy; |
} |
- inline int size() { |
+ inline int size() const { |
return size_; |
} |
+ inline Unique<T> at(int index) const { |
+ ASSERT(index >= 0 && index < size_); |
+ return array_[index]; |
+ } |
+ |
private: |
// These sets should be small, since operations are implemented with simple |
// linear algorithms. Enforce a maximum size. |