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 MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ | 5 #ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ |
6 #define MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ | 6 #define MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <map> | 9 #include <map> |
10 #include <utility> | 10 #include <utility> |
(...skipping 18 matching lines...) Expand all Loading... |
29 MOVE_ONLY_TYPE_FOR_CPP_03(Map); | 29 MOVE_ONLY_TYPE_FOR_CPP_03(Map); |
30 | 30 |
31 public: | 31 public: |
32 using Key = K; | 32 using Key = K; |
33 using Value = V; | 33 using Value = V; |
34 | 34 |
35 // Map keys cannot be move only classes. | 35 // Map keys cannot be move only classes. |
36 static_assert(!internal::IsMoveOnlyType<Key>::value, | 36 static_assert(!internal::IsMoveOnlyType<Key>::value, |
37 "Map keys cannot be move only types."); | 37 "Map keys cannot be move only types."); |
38 | 38 |
| 39 using Iterator = typename std::map<Key, Value>::iterator; |
39 using ConstIterator = typename std::map<Key, Value>::const_iterator; | 40 using ConstIterator = typename std::map<Key, Value>::const_iterator; |
40 | 41 |
41 using Data_ = internal::Map_Data< | 42 using Data_ = internal::Map_Data< |
42 typename internal::GetDataTypeAsArrayElement<Key>::Data, | 43 typename internal::GetDataTypeAsArrayElement<Key>::Data, |
43 typename internal::GetDataTypeAsArrayElement<Value>::Data>; | 44 typename internal::GetDataTypeAsArrayElement<Value>::Data>; |
44 | 45 |
45 // Constructs an empty map. | 46 // Constructs an empty map. |
46 Map() : is_null_(false) {} | 47 Map() : is_null_(false) {} |
47 // Constructs a null map. | 48 // Constructs a null map. |
48 Map(std::nullptr_t null_pointer) : is_null_(true) {} | 49 Map(std::nullptr_t null_pointer) : is_null_(true) {} |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 return false; | 217 return false; |
217 ++i; | 218 ++i; |
218 ++j; | 219 ++j; |
219 } | 220 } |
220 return true; | 221 return true; |
221 } | 222 } |
222 | 223 |
223 // Provide read-only iteration over map members in a way similar to STL | 224 // Provide read-only iteration over map members in a way similar to STL |
224 // collections. | 225 // collections. |
225 ConstIterator begin() const { return map_.begin(); } | 226 ConstIterator begin() const { return map_.begin(); } |
| 227 Iterator begin() { return map_.begin(); } |
| 228 |
226 ConstIterator end() const { return map_.end(); } | 229 ConstIterator end() const { return map_.end(); } |
| 230 Iterator end() { return map_.end(); } |
227 | 231 |
228 // Returns the iterator pointing to the entry for |key|, if present, or else | 232 // Returns the iterator pointing to the entry for |key|, if present, or else |
229 // returns end(). | 233 // returns end(). |
230 ConstIterator find(const Key& key) const { return map_.find(key); } | 234 ConstIterator find(const Key& key) const { return map_.find(key); } |
| 235 Iterator find(const Key& key) { return map_.find(key); } |
231 | 236 |
232 private: | 237 private: |
233 typedef std::map<Key, Value> Map::*Testable; | 238 typedef std::map<Key, Value> Map::*Testable; |
234 | 239 |
235 public: | 240 public: |
236 // The Map may be used in boolean expressions to determine if it is non-null, | 241 // The Map may be used in boolean expressions to determine if it is non-null, |
237 // but is not implicitly convertible to an actual bool value (which would be | 242 // but is not implicitly convertible to an actual bool value (which would be |
238 // dangerous). | 243 // dangerous). |
239 operator Testable() const { return is_null_ ? 0 : &Map::map_; } | 244 operator Testable() const { return is_null_ ? 0 : &Map::map_; } |
240 | 245 |
241 private: | 246 private: |
242 using Traits = | 247 using Traits = |
243 internal::MapTraits<Key, Value, internal::IsMoveOnlyType<Value>::value>; | 248 internal::MapCloneTraits<Key, |
| 249 Value, |
| 250 internal::IsMoveOnlyType<Value>::value>; |
244 | 251 |
245 // Forbid the == and != operators explicitly, otherwise Map will be converted | 252 // Forbid the == and != operators explicitly, otherwise Map will be converted |
246 // to Testable to do == or != comparison. | 253 // to Testable to do == or != comparison. |
247 template <typename T, typename U> | 254 template <typename T, typename U> |
248 bool operator==(const Map<T, U>& other) const = delete; | 255 bool operator==(const Map<T, U>& other) const = delete; |
249 template <typename T, typename U> | 256 template <typename T, typename U> |
250 bool operator!=(const Map<T, U>& other) const = delete; | 257 bool operator!=(const Map<T, U>& other) const = delete; |
251 | 258 |
252 void Take(Map* other) { | 259 void Take(Map* other) { |
253 operator=(nullptr); | 260 operator=(nullptr); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 TypeConverter<STLValue, MojoValue>::Convert(it->second))); | 300 TypeConverter<STLValue, MojoValue>::Convert(it->second))); |
294 } | 301 } |
295 } | 302 } |
296 return result; | 303 return result; |
297 } | 304 } |
298 }; | 305 }; |
299 | 306 |
300 } // namespace mojo | 307 } // namespace mojo |
301 | 308 |
302 #endif // MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ | 309 #endif // MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ |
OLD | NEW |