Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(653)

Side by Side Diff: src/close-table.h

Issue 202293004: Work in progress: ES6 Maps and Sets with deterministic iteration support (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Added growth Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/factory.h » ('j') | src/objects.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 #ifndef CLOSE_TABLE_H
2 #define CLOSE_TABLE_H
3
4 #include "objects.h"
5
6 namespace v8 {
7 namespace internal {
8
9 // TODO(adamk): Merge this into objects.h once development is done
10
11 // Based on Tyler Close's "Deterministic Hash Table" as described
12 // by Jason Orendorff at
13 // https://wiki.mozilla.org/User:Jorend/Deterministic_hash_tables
14 //
15 // Memory layout:
16 // [0]: bucket count
17 // [1]: element count
18 // [2]: deleted element count
19 // [3]: "hash table", an array of length NumberOfBuckets() entry numbers
20 // followed by "data table", an array of length NumberOfBuckets() *
21 // kLoadFactor entries
22 template<int entrysize>
23 class CloseTable: public FixedArray {
24 public:
25 MUST_USE_RESULT static MaybeObject* Allocate(Heap* heap, int capacity);
26
27 MUST_USE_RESULT MaybeObject* EnsureCapacity(int num_to_add);
28
29 static CloseTable* cast(Object* obj) {
30 ASSERT(obj->IsFixedArray()); // TODO(adamk): Make a map for this
31 return reinterpret_cast<CloseTable*>(obj);
32 }
33
34 int Lookup(Object* key);
35
36 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); }
37 Object* ChainAt(int entry) { return get(EntryToIndex(entry) + kChainOffset); }
38
39 int NumberOfElements() {
40 return Smi::cast(get(kNumberOfElementsIndex))->value();
41 }
42 void SetNumberOfElements(int num) {
43 set(kNumberOfElementsIndex, Smi::FromInt(num));
44 }
45 int NumberOfDeletedElements() {
46 return Smi::cast(get(kNumberOfDeletedElementsIndex))->value();
47 }
48 void SetNumberOfDeletedElements(int num) {
49 set(kNumberOfDeletedElementsIndex, Smi::FromInt(num));
50 }
51
52 int NumberOfBuckets() {
53 return Smi::cast(get(kNumberOfBucketsIndex))->value();
54 }
55
56 void SetNumberOfBuckets(int num) {
57 set(kNumberOfBucketsIndex, Smi::FromInt(num));
58 }
59
60 void ElementAdded() {
61 SetNumberOfElements(NumberOfElements() + 1);
62 }
63
64 void ElementRemoved() {
65 SetNumberOfElements(NumberOfElements() - 1);
66 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
67 }
68
69 private:
70 friend class CloseTableSet;
71
72 int Capacity() {
73 return NumberOfBuckets() * kLoadFactor;
74 }
75
76 int DataTableStartIndex() {
77 return kHashTableStartIndex + Smi::cast(get(kNumberOfBucketsIndex))->value() ;
arv (Not doing code reviews) 2014/03/27 22:39:02 This can be return kHashTableStartIndex + Number
78 }
79
80 int EntryToIndex(int entry) {
81 return DataTableStartIndex() + (entry * kEntrySize);
82 }
83
84 // Should be 8.0 / 3.0 but making it a double is complicated
85 static const int kLoadFactor = 2;
86
87 static const int kNumberOfBucketsIndex = 0;
88 static const int kNumberOfElementsIndex = kNumberOfBucketsIndex + 1;
89 static const int kNumberOfDeletedElementsIndex = kNumberOfElementsIndex + 1;
90 static const int kHashTableStartIndex = kNumberOfDeletedElementsIndex + 1;
91
92 static const int kEntrySize = entrysize + 1;
93 static const int kChainOffset = entrysize;
94
95 static const int kNotFound = -1;
96 };
97
98
99 class CloseTableSet: public CloseTable<1> {
100 public:
101 static CloseTableSet* cast(Object* obj) {
102 ASSERT(obj->IsFixedArray()); // TODO(adamk): Make a map for this
103 return reinterpret_cast<CloseTableSet*>(obj);
104 }
105
106 bool Contains(Object* key);
107 static Handle<CloseTableSet> Add(Handle<CloseTableSet> table, Handle<Object> k ey);
108 static Handle<CloseTableSet> Remove(Handle<CloseTableSet> table, Handle<Object > key);
109 static Handle<CloseTableSet> EnsureCapacity(Handle<CloseTableSet> table, int n um_to_add);
110 };
111
112
113 } // namespace internal
114 } // namespace v8
115
116 #endif //CLOSE_TABLE_H
OLDNEW
« no previous file with comments | « no previous file | src/factory.h » ('j') | src/objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698