OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MIDIPortMap_h | 5 #ifndef MIDIPortMap_h |
6 #define MIDIPortMap_h | 6 #define MIDIPortMap_h |
7 | 7 |
8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
9 #include "bindings/core/v8/ScriptState.h" | 9 #include "bindings/core/v8/ScriptState.h" |
10 #include "bindings/core/v8/ScriptValue.h" | 10 #include "bindings/core/v8/ScriptValue.h" |
11 #include "bindings/core/v8/V8Binding.h" | 11 #include "bindings/core/v8/V8Binding.h" |
12 #include "bindings/core/v8/V8IteratorResultValue.h" | 12 #include "core/dom/Iterable.h" |
13 #include "core/dom/Iterator.h" | |
14 #include "platform/heap/Handle.h" | 13 #include "platform/heap/Handle.h" |
15 #include "wtf/HashMap.h" | 14 #include "wtf/HashMap.h" |
16 #include "wtf/text/StringHash.h" | 15 #include "wtf/text/StringHash.h" |
17 #include "wtf/text/WTFString.h" | 16 #include "wtf/text/WTFString.h" |
18 | 17 |
19 namespace blink { | 18 namespace blink { |
20 | 19 |
21 template <typename T> | 20 template <typename T> |
22 class MIDIPortMap : public GarbageCollected<MIDIPortMap<T>> { | 21 class MIDIPortMap : public GarbageCollected<MIDIPortMap<T>>, public PairIterable
<String, T*> { |
23 public: | 22 public: |
24 explicit MIDIPortMap(const HeapHashMap<String, Member<T>>& entries) : m_entr
ies(entries) { } | 23 explicit MIDIPortMap(const HeapHashMap<String, Member<T>>& entries) : m_entr
ies(entries) { } |
25 | 24 |
26 // IDL attributes / methods | 25 // IDL attributes / methods |
27 size_t size() const { return m_entries.size(); } | 26 size_t size() const { return m_entries.size(); } |
28 Iterator* keys(); | |
29 Iterator* entries(); | |
30 Iterator* values(); | |
31 T* get(const String& key) const; | 27 T* get(const String& key) const; |
32 bool has(const String& key) const { return m_entries.contains(key); } | 28 bool has(const String& key) const { return m_entries.contains(key); } |
33 Iterator* iterator(ScriptState*, ExceptionState&) { return entries(); } | |
34 | 29 |
35 virtual void trace(Visitor* visitor) | 30 virtual void trace(Visitor* visitor) |
36 { | 31 { |
37 visitor->trace(m_entries); | 32 visitor->trace(m_entries); |
38 } | 33 } |
39 | 34 |
40 private: | 35 private: |
41 typedef HeapHashMap<String, Member<T>> MapType; | 36 typedef HeapHashMap<String, Member<T>> MapType; |
42 typedef typename HeapHashMap<String, Member<T>>::const_iterator IteratorType
; | 37 typedef typename HeapHashMap<String, Member<T>>::const_iterator IteratorType
; |
43 struct KeySelector { | 38 |
44 static const String& select(ScriptState*, IteratorType i) { return i->ke
y; } | 39 typename PairIterable<String, T*>::IterationSource* startIteration(ScriptSta
te*, ExceptionState&) override |
45 }; | 40 { |
46 struct ValueSelector { | 41 return new MapIterationSource(this, m_entries.begin(), m_entries.end()); |
47 static T* select(ScriptState*, IteratorType i) { return i->value; } | 42 } |
48 }; | |
49 struct EntrySelector { | |
50 static Vector<ScriptValue> select(ScriptState* scriptState, IteratorType
i) | |
51 { | |
52 Vector<ScriptValue> entry; | |
53 entry.append(ScriptValue(scriptState, v8String(scriptState->isolate(
), i->key))); | |
54 entry.append(ScriptValue(scriptState, toV8(i->value, scriptState->co
ntext()->Global(), scriptState->isolate()))); | |
55 return entry; | |
56 } | |
57 }; | |
58 | 43 |
59 // Note: This template class relies on the fact that m_map.m_entries will | 44 // Note: This template class relies on the fact that m_map.m_entries will |
60 // never be modified once it is created. | 45 // never be modified once it is created. |
61 template <typename Selector> | 46 class MapIterationSource final : public PairIterable<String, T*>::IterationS
ource { |
62 class MapIterator : public Iterator { | |
63 public: | 47 public: |
64 MapIterator(MIDIPortMap<T>* map, IteratorType iterator, IteratorType end
) | 48 MapIterationSource(MIDIPortMap<T>* map, IteratorType iterator, IteratorT
ype end) |
65 : m_map(map) | 49 : m_map(map) |
66 , m_iterator(iterator) | 50 , m_iterator(iterator) |
67 , m_end(end) | 51 , m_end(end) |
68 { | 52 { |
69 } | 53 } |
70 | 54 |
71 virtual ScriptValue next(ScriptState* scriptState, ExceptionState&) over
ride | 55 bool next(ScriptState* scriptState, String& key, T*& value, ExceptionSta
te&) override |
72 { | 56 { |
73 if (m_iterator == m_end) | 57 if (m_iterator == m_end) |
74 return v8IteratorResultDone(scriptState); | 58 return false; |
75 ScriptValue result = v8IteratorResult(scriptState, Selector::select(
scriptState, m_iterator)); | 59 key = m_iterator->key; |
| 60 value = m_iterator->value; |
76 ++m_iterator; | 61 ++m_iterator; |
77 return result; | 62 return true; |
78 } | 63 } |
79 | 64 |
80 virtual ScriptValue next(ScriptState* scriptState, ScriptValue, Exceptio
nState& exceptionState) override | 65 void trace(Visitor* visitor) override |
81 { | |
82 return next(scriptState, exceptionState); | |
83 } | |
84 | |
85 virtual void trace(Visitor* visitor) override | |
86 { | 66 { |
87 visitor->trace(m_map); | 67 visitor->trace(m_map); |
88 Iterator::trace(visitor); | 68 PairIterable<String, T*>::IterationSource::trace(visitor); |
89 } | 69 } |
90 | 70 |
91 private: | 71 private: |
92 // m_map is stored just for keeping it alive. It needs to be kept | 72 // m_map is stored just for keeping it alive. It needs to be kept |
93 // alive while JavaScript holds the iterator to it. | 73 // alive while JavaScript holds the iterator to it. |
94 const Member<const MIDIPortMap<T>> m_map; | 74 const Member<const MIDIPortMap<T>> m_map; |
95 IteratorType m_iterator; | 75 IteratorType m_iterator; |
96 const IteratorType m_end; | 76 const IteratorType m_end; |
97 }; | 77 }; |
98 | 78 |
99 const MapType m_entries; | 79 const MapType m_entries; |
100 }; | 80 }; |
101 | 81 |
102 template <typename T> | 82 template <typename T> |
103 Iterator* MIDIPortMap<T>::keys() | |
104 { | |
105 return new MapIterator<KeySelector>(this, m_entries.begin(), m_entries.end()
); | |
106 } | |
107 | |
108 template <typename T> | |
109 Iterator* MIDIPortMap<T>::entries() | |
110 { | |
111 return new MapIterator<EntrySelector>(this, m_entries.begin(), m_entries.end
()); | |
112 } | |
113 | |
114 template <typename T> | |
115 Iterator* MIDIPortMap<T>::values() | |
116 { | |
117 return new MapIterator<ValueSelector>(this, m_entries.begin(), m_entries.end
()); | |
118 } | |
119 | |
120 template <typename T> | |
121 T* MIDIPortMap<T>::get(const String& key) const | 83 T* MIDIPortMap<T>::get(const String& key) const |
122 { | 84 { |
123 return has(key) ? m_entries.get(key) : 0; | 85 return has(key) ? m_entries.get(key) : 0; |
124 } | 86 } |
125 | 87 |
126 } // namespace blink | 88 } // namespace blink |
127 | 89 |
128 #endif | 90 #endif |
OLD | NEW |