OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef CollectionsWTF_h | |
6 #define CollectionsWTF_h | |
7 | |
8 #include "wtf/Allocator.h" | |
9 #include "wtf/HashMap.h" | |
10 #include "wtf/PtrUtil.h" | |
11 #include "wtf/Vector.h" | |
12 #include "wtf/VectorTraits.h" | |
13 | |
14 namespace blink { | |
15 namespace protocol { | |
16 | |
17 template <typename T> | |
18 class Vector { | |
19 public: | |
20 Vector() { } | |
21 Vector(size_t capacity) : m_impl(capacity) { } | |
22 typedef T* iterator; | |
23 typedef const T* const_iterator; | |
24 | |
25 iterator begin() { return m_impl.begin(); } | |
26 iterator end() { return m_impl.end(); } | |
27 const_iterator begin() const { return m_impl.begin(); } | |
28 const_iterator end() const { return m_impl.end(); } | |
29 | |
30 void resize(size_t s) { m_impl.resize(s); } | |
31 size_t size() const { return m_impl.size(); } | |
32 bool isEmpty() const { return m_impl.isEmpty(); } | |
33 T& operator[](size_t i) { return at(i); } | |
34 const T& operator[](size_t i) const { return at(i); } | |
35 T& at(size_t i) { return m_impl.at(i); } | |
36 const T& at(size_t i) const { return m_impl.at(i); } | |
37 T& last() { return m_impl.last(); } | |
38 const T& last() const { return m_impl.last(); } | |
39 void append(const T& t) { m_impl.append(t); } | |
40 void prepend(const T& t) { m_impl.prepend(t); } | |
41 void remove(size_t i) { m_impl.remove(i); } | |
42 void clear() { m_impl.clear(); } | |
43 void swap(Vector<T>& other) { m_impl.swap(other.m_impl); } | |
44 void removeLast() { m_impl.removeLast(); } | |
45 | |
46 private: | |
47 WTF::Vector<T> m_impl; | |
48 }; | |
49 | |
50 template <typename T> | |
51 class Vector<std::unique_ptr<T>> { | |
52 WTF_MAKE_NONCOPYABLE(Vector); | |
53 public: | |
54 Vector() { } | |
55 Vector(size_t capacity) : m_impl(capacity) { } | |
56 Vector(Vector<std::unique_ptr<T>>&& other) : m_impl(std::move(other.m_impl))
{ } | |
57 ~Vector() { } | |
58 | |
59 typedef std::unique_ptr<T>* iterator; | |
60 typedef const std::unique_ptr<T>* const_iterator; | |
61 | |
62 iterator begin() { return m_impl.begin(); } | |
63 iterator end() { return m_impl.end(); } | |
64 const_iterator begin() const { return m_impl.begin(); } | |
65 const_iterator end() const { return m_impl.end(); } | |
66 | |
67 void resize(size_t s) { m_impl.resize(s); } | |
68 size_t size() const { return m_impl.size(); } | |
69 bool isEmpty() const { return m_impl.isEmpty(); } | |
70 T* operator[](size_t i) { return m_impl.at(i).get(); } | |
71 const T* operator[](size_t i) const { return m_impl.at(i).get(); } | |
72 T* at(size_t i) { return m_impl.at(i).get(); } | |
73 const T* at(size_t i) const { return m_impl.at(i).get(); } | |
74 T* last() { return m_impl.last().get(); } | |
75 const T* last() const { return m_impl.last(); } | |
76 void append(std::unique_ptr<T> t) { m_impl.append(std::move(t)); } | |
77 void prepend(std::unique_ptr<T> t) { m_impl.prepend(std::move(t)); } | |
78 void remove(size_t i) { m_impl.remove(i); } | |
79 void clear() { m_impl.clear(); } | |
80 void swap(Vector<std::unique_ptr<T>>& other) { m_impl.swap(other.m_impl); } | |
81 void swap(Vector<std::unique_ptr<T>>&& other) { m_impl.swap(other.m_impl); } | |
82 void removeLast() { m_impl.removeLast(); } | |
83 | |
84 private: | |
85 WTF::Vector<std::unique_ptr<T>> m_impl; | |
86 }; | |
87 | |
88 template <typename K, typename V, typename I> | |
89 class HashMapIterator { | |
90 STACK_ALLOCATED(); | |
91 public: | |
92 HashMapIterator(const I& impl) : m_impl(impl) { } | |
93 std::pair<K, V*>* get() const { m_pair = std::make_pair(m_impl->key, &m_impl
->value); return &m_pair; } | |
94 std::pair<K, V*>& operator*() const { return *get(); } | |
95 std::pair<K, V*>* operator->() const { return get(); } | |
96 | |
97 bool operator==(const HashMapIterator<K, V, I>& other) const { return m_impl
== other.m_impl; } | |
98 bool operator!=(const HashMapIterator<K, V, I>& other) const { return m_impl
!= other.m_impl; } | |
99 | |
100 HashMapIterator<K, V, I>& operator++() { ++m_impl; return *this; } | |
101 | |
102 private: | |
103 mutable std::pair<K, V*> m_pair; | |
104 I m_impl; | |
105 }; | |
106 | |
107 template <typename K, typename V, typename I> | |
108 class HashMapIterator<K, std::unique_ptr<V>, I> { | |
109 STACK_ALLOCATED(); | |
110 public: | |
111 HashMapIterator(const I& impl) : m_impl(impl) { } | |
112 std::pair<K, V*>* get() const { m_pair = std::make_pair(m_impl->key, m_impl-
>value.get()); return &m_pair; } | |
113 std::pair<K, V*>& operator*() const { return *get(); } | |
114 std::pair<K, V*>* operator->() const { return get(); } | |
115 | |
116 bool operator==(const HashMapIterator<K, std::unique_ptr<V>, I>& other) cons
t { return m_impl == other.m_impl; } | |
117 bool operator!=(const HashMapIterator<K, std::unique_ptr<V>, I>& other) cons
t { return m_impl != other.m_impl; } | |
118 | |
119 HashMapIterator<K, std::unique_ptr<V>, I>& operator++() { ++m_impl; return *
this; } | |
120 | |
121 private: | |
122 mutable std::pair<K, V*> m_pair; | |
123 I m_impl; | |
124 }; | |
125 | |
126 template <typename K, typename V> | |
127 class HashMap { | |
128 public: | |
129 HashMap() { } | |
130 ~HashMap() { } | |
131 | |
132 using iterator = HashMapIterator<K, V, typename WTF::HashMap<K, V>::iterator
>; | |
133 using const_iterator = HashMapIterator<K, const V, typename WTF::HashMap<K,
V>::const_iterator>; | |
134 | |
135 iterator begin() { return iterator(m_impl.begin()); } | |
136 iterator end() { return iterator(m_impl.end()); } | |
137 iterator find(const K& k) { return iterator(m_impl.find(k)); } | |
138 const_iterator begin() const { return const_iterator(m_impl.begin()); } | |
139 const_iterator end() const { return const_iterator(m_impl.end()); } | |
140 const_iterator find(const K& k) const { return const_iterator(m_impl.find(k)
); } | |
141 | |
142 size_t size() const { return m_impl.size(); } | |
143 bool isEmpty() const { return m_impl.isEmpty(); } | |
144 bool set(const K& k, const V& v) { return m_impl.set(k, v).isNewEntry; } | |
145 bool contains(const K& k) const { return m_impl.contains(k); } | |
146 V get(const K& k) const { return m_impl.get(k); } | |
147 void remove(const K& k) { m_impl.remove(k); } | |
148 void clear() { m_impl.clear(); } | |
149 V take(const K& k) { return m_impl.take(k); } | |
150 | |
151 private: | |
152 WTF::HashMap<K, V> m_impl; | |
153 }; | |
154 | |
155 template <typename K, typename V> | |
156 class HashMap<K, std::unique_ptr<V>> { | |
157 public: | |
158 HashMap() { } | |
159 ~HashMap() { } | |
160 | |
161 using iterator = HashMapIterator<K, std::unique_ptr<V>, typename WTF::HashMa
p<K, std::unique_ptr<V>>::iterator>; | |
162 using const_iterator = HashMapIterator<K, std::unique_ptr<V>, typename WTF::
HashMap<K, std::unique_ptr<V>>::const_iterator>; | |
163 | |
164 iterator begin() { return iterator(m_impl.begin()); } | |
165 iterator end() { return iterator(m_impl.end()); } | |
166 iterator find(const K& k) { return iterator(m_impl.find(k)); } | |
167 const_iterator begin() const { return const_iterator(m_impl.begin()); } | |
168 const_iterator end() const { return const_iterator(m_impl.end()); } | |
169 const_iterator find(const K& k) const { return const_iterator(m_impl.find(k)
); } | |
170 | |
171 size_t size() const { return m_impl.size(); } | |
172 bool isEmpty() const { return m_impl.isEmpty(); } | |
173 bool set(const K& k, std::unique_ptr<V> v) { return m_impl.set(k, std::move(
v)).isNewEntry; } | |
174 bool contains(const K& k) const { return m_impl.contains(k); } | |
175 V* get(const K& k) const { return m_impl.get(k); } | |
176 std::unique_ptr<V> take(const K& k) { return m_impl.take(k); } | |
177 void remove(const K& k) { m_impl.remove(k); } | |
178 void clear() { m_impl.clear(); } | |
179 | |
180 private: | |
181 WTF::HashMap<K, std::unique_ptr<V>> m_impl; | |
182 }; | |
183 | |
184 template <typename K> | |
185 class HashSet : public protocol::HashMap<K, K> { | |
186 public: | |
187 void add(const K& k) { this->set(k, k); } | |
188 }; | |
189 | |
190 } // namespace platform | |
191 } // namespace blink | |
192 | |
193 #endif // !defined(CollectionsWTF_h) | |
OLD | NEW |