7f843b0fc9
old->new references during Scavenge. Review URL: https://chromiumcodereview.appspot.com//10797021 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@9791 260f80e4-7a28-3924-810f-c04153c831b5
104 lines
2.3 KiB
C++
104 lines
2.3 KiB
C++
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
#ifndef VM_HASH_SET_H_
|
|
#define VM_HASH_SET_H_
|
|
|
|
#include "vm/allocation.h"
|
|
#include "platform/utils.h"
|
|
|
|
namespace dart {
|
|
|
|
class HashSet {
|
|
public:
|
|
HashSet(intptr_t size, intptr_t fill_ratio)
|
|
: keys_(new uword[size]),
|
|
size_mask_(size - 1),
|
|
growth_limit_((size * fill_ratio) / 100),
|
|
count_(0),
|
|
fill_ratio_(fill_ratio) {
|
|
ASSERT(Utils::IsPowerOfTwo(size));
|
|
ASSERT(fill_ratio < 100);
|
|
memset(keys_, 0, size * sizeof(*keys_));
|
|
}
|
|
|
|
~HashSet() {
|
|
delete[] keys_;
|
|
}
|
|
|
|
intptr_t Size() const {
|
|
return size_mask_ + 1;
|
|
}
|
|
|
|
intptr_t Count() const {
|
|
return count_;
|
|
}
|
|
|
|
uword At(intptr_t i) const {
|
|
ASSERT(i >= 0);
|
|
ASSERT(i < Size());
|
|
return keys_[i];
|
|
}
|
|
|
|
// Returns false if the caller should stop adding entries to this HashSet.
|
|
bool Add(uword value) {
|
|
ASSERT(value != 0);
|
|
ASSERT(count_ < growth_limit_);
|
|
intptr_t hash = Hash(value);
|
|
while (true) {
|
|
if (keys_[hash] == value) {
|
|
return true;
|
|
} else if (SlotIsEmpty(hash)) {
|
|
keys_[hash] = value;
|
|
count_++;
|
|
return (count_ < growth_limit_);
|
|
}
|
|
hash = (hash + 1) & size_mask_;
|
|
// Ensure that we do not end up looping forever.
|
|
ASSERT(hash != Hash(value));
|
|
}
|
|
UNREACHABLE();
|
|
}
|
|
|
|
bool Contains(uword value) const {
|
|
if (value == 0) {
|
|
return false;
|
|
}
|
|
intptr_t hash = Hash(value);
|
|
while (true) {
|
|
if (keys_[hash] == value) {
|
|
return true;
|
|
} else if (SlotIsEmpty(hash)) {
|
|
return false;
|
|
}
|
|
hash = (hash + 1) & size_mask_;
|
|
// Ensure that we do not end up looping forever.
|
|
ASSERT(hash != Hash(value));
|
|
}
|
|
UNREACHABLE();
|
|
}
|
|
|
|
private:
|
|
intptr_t Hash(uword value) const {
|
|
return value & size_mask_;
|
|
}
|
|
|
|
// Returns true if the given slot contains a value.
|
|
bool SlotIsEmpty(intptr_t index) const {
|
|
return keys_[index] == 0;
|
|
}
|
|
|
|
uword* keys_;
|
|
intptr_t size_mask_;
|
|
intptr_t growth_limit_;
|
|
intptr_t count_;
|
|
intptr_t fill_ratio_;
|
|
|
|
DISALLOW_IMPLICIT_CONSTRUCTORS(HashSet);
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
#endif // VM_HASH_SET_H_
|