| 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> |
| 11 | 11 |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "mojo/public/cpp/bindings/lib/map_internal.h" | 13 #include "base/move.h" |
| 14 #include "mojo/public/cpp/bindings/lib/value_traits.h" | 14 #include "mojo/public/cpp/bindings/array.h" |
| 15 #include "mojo/public/cpp/bindings/lib/map_data_internal.h" |
| 16 #include "mojo/public/cpp/bindings/lib/template_util.h" |
| 17 #include "mojo/public/cpp/bindings/type_converter.h" |
| 15 | 18 |
| 16 namespace mojo { | 19 namespace mojo { |
| 17 | 20 |
| 18 // A move-only map that can handle move-only values. Map has the following | 21 // A move-only map that can handle move-only values. Map has the following |
| 19 // characteristics: | 22 // characteristics: |
| 20 // - The map itself can be null, and this is distinct from empty. | 23 // - The map itself can be null, and this is distinct from empty. |
| 21 // - Keys must not be move-only. | 24 // - Keys must not be move-only. |
| 22 // - The Key-type's "<" operator is used to sort the entries, and also is | 25 // - The Key-type's "<" operator is used to sort the entries, and also is |
| 23 // used to determine equality of the key values. | 26 // used to determine equality of the key values. |
| 24 // - There can only be one entry per unique key. | 27 // - There can only be one entry per unique key. |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 value_vector.push_back(std::move(entry.second)); | 180 value_vector.push_back(std::move(entry.second)); |
| 178 } | 181 } |
| 179 | 182 |
| 180 map_.clear(); | 183 map_.clear(); |
| 181 is_null_ = true; | 184 is_null_ = true; |
| 182 | 185 |
| 183 keys->Swap(&key_vector); | 186 keys->Swap(&key_vector); |
| 184 values->Swap(&value_vector); | 187 values->Swap(&value_vector); |
| 185 } | 188 } |
| 186 | 189 |
| 187 // Returns a new Map that contains a copy of the contents of this map. If the | 190 // Returns a new Map that contains a copy of the contents of this map. If the |
| 188 // values are of a type that is designated move-only, they will be cloned | 191 // key/value type defines a Clone() method, it will be used; otherwise copy |
| 189 // using the Clone() method of the type. Please note that calling this method | 192 // constructor/assignment will be used. |
| 190 // will fail compilation if the value type cannot be cloned (which usually | 193 // |
| 191 // means that it is a Mojo handle type or a type that contains Mojo handles). | 194 // Please note that calling this method will fail compilation if the key/value |
| 195 // type cannot be cloned (which usually means that it is a Mojo handle type or |
| 196 // a type containing Mojo handles). |
| 192 Map Clone() const { | 197 Map Clone() const { |
| 193 Map result; | 198 Map result; |
| 194 result.is_null_ = is_null_; | 199 result.is_null_ = is_null_; |
| 195 Traits::Clone(map_, &result.map_); | 200 for (auto it = map_.begin(); it != map_.end(); ++it) { |
| 201 result.map_.insert(std::make_pair(internal::Clone(it->first), |
| 202 internal::Clone(it->second))); |
| 203 } |
| 196 return result; | 204 return result; |
| 197 } | 205 } |
| 198 | 206 |
| 199 // Indicates whether the contents of this map are equal to those of another | 207 // Indicates whether the contents of this map are equal to those of another |
| 200 // Map (including nullness). Keys are compared by the != operator. Values are | 208 // Map (including nullness). If the key/value type defines an Equals() method, |
| 201 // compared as follows: | 209 // it will be used; otherwise == operator will be used. |
| 202 // - Map, Array, Struct, or StructPtr values are compared by their Equals() | |
| 203 // method. | |
| 204 // - ScopedHandleBase-derived types are compared by their handles. | |
| 205 // - Values of other types are compared by their "==" operator. | |
| 206 bool Equals(const Map& other) const { | 210 bool Equals(const Map& other) const { |
| 207 if (is_null() != other.is_null()) | 211 if (is_null() != other.is_null()) |
| 208 return false; | 212 return false; |
| 209 if (size() != other.size()) | 213 if (size() != other.size()) |
| 210 return false; | 214 return false; |
| 211 auto i = begin(); | 215 auto i = begin(); |
| 212 auto j = other.begin(); | 216 auto j = other.begin(); |
| 213 while (i != end()) { | 217 while (i != end()) { |
| 214 if (i->first != j->first) | 218 if (!internal::Equals(i->first, j->first)) |
| 215 return false; | 219 return false; |
| 216 if (!internal::ValueTraits<Value>::Equals(i->second, j->second)) | 220 if (!internal::Equals(i->second, j->second)) |
| 217 return false; | 221 return false; |
| 218 ++i; | 222 ++i; |
| 219 ++j; | 223 ++j; |
| 220 } | 224 } |
| 221 return true; | 225 return true; |
| 222 } | 226 } |
| 223 | 227 |
| 224 // Provide read-only iteration over map members in a way similar to STL | 228 // Provide read-only iteration over map members in a way similar to STL |
| 225 // collections. | 229 // collections. |
| 226 ConstIterator begin() const { return map_.begin(); } | 230 ConstIterator begin() const { return map_.begin(); } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 237 private: | 241 private: |
| 238 typedef std::map<Key, Value> Map::*Testable; | 242 typedef std::map<Key, Value> Map::*Testable; |
| 239 | 243 |
| 240 public: | 244 public: |
| 241 // The Map may be used in boolean expressions to determine if it is non-null, | 245 // The Map may be used in boolean expressions to determine if it is non-null, |
| 242 // but is not implicitly convertible to an actual bool value (which would be | 246 // but is not implicitly convertible to an actual bool value (which would be |
| 243 // dangerous). | 247 // dangerous). |
| 244 operator Testable() const { return is_null_ ? 0 : &Map::map_; } | 248 operator Testable() const { return is_null_ ? 0 : &Map::map_; } |
| 245 | 249 |
| 246 private: | 250 private: |
| 247 using Traits = | |
| 248 internal::MapCloneTraits<Key, | |
| 249 Value, | |
| 250 internal::IsMoveOnlyType<Value>::value>; | |
| 251 | |
| 252 // Forbid the == and != operators explicitly, otherwise Map will be converted | 251 // Forbid the == and != operators explicitly, otherwise Map will be converted |
| 253 // to Testable to do == or != comparison. | 252 // to Testable to do == or != comparison. |
| 254 template <typename T, typename U> | 253 template <typename T, typename U> |
| 255 bool operator==(const Map<T, U>& other) const = delete; | 254 bool operator==(const Map<T, U>& other) const = delete; |
| 256 template <typename T, typename U> | 255 template <typename T, typename U> |
| 257 bool operator!=(const Map<T, U>& other) const = delete; | 256 bool operator!=(const Map<T, U>& other) const = delete; |
| 258 | 257 |
| 259 void Take(Map* other) { | 258 void Take(Map* other) { |
| 260 operator=(nullptr); | 259 operator=(nullptr); |
| 261 Swap(other); | 260 Swap(other); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 TypeConverter<STLValue, MojoValue>::Convert(it->second))); | 299 TypeConverter<STLValue, MojoValue>::Convert(it->second))); |
| 301 } | 300 } |
| 302 } | 301 } |
| 303 return result; | 302 return result; |
| 304 } | 303 } |
| 305 }; | 304 }; |
| 306 | 305 |
| 307 } // namespace mojo | 306 } // namespace mojo |
| 308 | 307 |
| 309 #endif // MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ | 308 #endif // MOJO_PUBLIC_CPP_BINDINGS_MAP_H_ |
| OLD | NEW |