| Index: runtime/vm/type_table.h
|
| diff --git a/runtime/vm/type_table.h b/runtime/vm/type_table.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c33a124a63cb596d7b400d21a2e3fb2385d5d23a
|
| --- /dev/null
|
| +++ b/runtime/vm/type_table.h
|
| @@ -0,0 +1,112 @@
|
| +// Copyright (c) 2016, 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_TYPE_TABLE_H_
|
| +#define VM_TYPE_TABLE_H_
|
| +
|
| +#include "platform/assert.h"
|
| +#include "vm/hash_table.h"
|
| +#include "vm/object.h"
|
| +
|
| +namespace dart {
|
| +
|
| +class CanonicalTypeKey {
|
| + public:
|
| + explicit CanonicalTypeKey(const Type& key) : key_(key) {
|
| + }
|
| + bool Matches(const Type& arg) const {
|
| + return key_.Equals(arg);
|
| + }
|
| + uword Hash() const {
|
| + return key_.Hash();
|
| + }
|
| + const Type& key_;
|
| +
|
| + private:
|
| + DISALLOW_ALLOCATION();
|
| +};
|
| +
|
| +
|
| +// Traits for looking up Canonical Type based on it's hash.
|
| +class CanonicalTypeTraits {
|
| + public:
|
| + static const char* Name() { return "CanonicalTypeTraits"; }
|
| + static bool ReportStats() { return false; }
|
| +
|
| + // Called when growing the table.
|
| + static bool IsMatch(const Object& a, const Object& b) {
|
| + ASSERT(a.IsType() && b.IsType());
|
| + const Type& arg1 = Type::Cast(a);
|
| + const Type& arg2 = Type::Cast(b);
|
| + return arg1.Equals(arg2) && (arg1.Hash() == arg2.Hash());
|
| + }
|
| + static bool IsMatch(const CanonicalTypeKey& a, const Object& b) {
|
| + ASSERT(b.IsType());
|
| + return a.Matches(Type::Cast(b));
|
| + }
|
| + static uword Hash(const Object& key) {
|
| + ASSERT(key.IsType());
|
| + return Type::Cast(key).Hash();
|
| + }
|
| + static uword Hash(const CanonicalTypeKey& key) {
|
| + return key.Hash();
|
| + }
|
| + static RawObject* NewKey(const CanonicalTypeKey& obj) {
|
| + return obj.key_.raw();
|
| + }
|
| +};
|
| +typedef UnorderedHashSet <CanonicalTypeTraits> CanonicalTypeSet;
|
| +
|
| +
|
| +class CanonicalTypeArgumentsKey {
|
| + public:
|
| + explicit CanonicalTypeArgumentsKey(const TypeArguments& key) : key_(key) {
|
| + }
|
| + bool Matches(const TypeArguments& arg) const {
|
| + return key_.Equals(arg) && (key_.Hash() == arg.Hash());
|
| + }
|
| + uword Hash() const {
|
| + return key_.Hash();
|
| + }
|
| + const TypeArguments& key_;
|
| +
|
| + private:
|
| + DISALLOW_ALLOCATION();
|
| +};
|
| +
|
| +
|
| +// Traits for looking up Canonical TypeArguments based on its hash.
|
| +class CanonicalTypeArgumentsTraits {
|
| + public:
|
| + static const char* Name() { return "CanonicalTypeArgumentsTraits"; }
|
| + static bool ReportStats() { return false; }
|
| +
|
| + // Called when growing the table.
|
| + static bool IsMatch(const Object& a, const Object& b) {
|
| + ASSERT(a.IsTypeArguments() && b.IsTypeArguments());
|
| + const TypeArguments& arg1 = TypeArguments::Cast(a);
|
| + const TypeArguments& arg2 = TypeArguments::Cast(b);
|
| + return arg1.Equals(arg2) && (arg1.Hash() == arg2.Hash());
|
| + }
|
| + static bool IsMatch(const CanonicalTypeArgumentsKey& a, const Object& b) {
|
| + ASSERT(b.IsTypeArguments());
|
| + return a.Matches(TypeArguments::Cast(b));
|
| + }
|
| + static uword Hash(const Object& key) {
|
| + ASSERT(key.IsTypeArguments());
|
| + return TypeArguments::Cast(key).Hash();
|
| + }
|
| + static uword Hash(const CanonicalTypeArgumentsKey& key) {
|
| + return key.Hash();
|
| + }
|
| + static RawObject* NewKey(const CanonicalTypeArgumentsKey& obj) {
|
| + return obj.key_.raw();
|
| + }
|
| +};
|
| +typedef UnorderedHashSet<CanonicalTypeArgumentsTraits>
|
| + CanonicalTypeArgumentsSet;
|
| +
|
| +} // namespace dart
|
| +
|
| +#endif // VM_TYPE_TABLE_H_
|
|
|