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 MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_ 6 #define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_ 7 8 #include <map> 9 #include <unordered_map> 10 11 #include "mojo/public/cpp/bindings/map_traits.h" 12 13 namespace mojo { 14 15 template <typename K, typename V, typename Compare> 16 struct MapTraits<std::map<K, V, Compare>> { 17 using Key = K; 18 using Value = V; 19 using Iterator = typename std::map<K, V, Compare>::iterator; 20 using ConstIterator = typename std::map<K, V, Compare>::const_iterator; 21 22 static bool IsNull(const std::map<K, V, Compare>& input) { 23 // std::map<> is always converted to non-null mojom map. 24 return false; 25 } 26 27 static void SetToNull(std::map<K, V, Compare>* output) { 28 // std::map<> doesn't support null state. Set it to empty instead. 29 output->clear(); 30 } 31 32 static size_t GetSize(const std::map<K, V, Compare>& input) { 33 return input.size(); 34 } 35 36 static ConstIterator GetBegin(const std::map<K, V, Compare>& input) { 37 return input.begin(); 38 } 39 static Iterator GetBegin(std::map<K, V, Compare>& input) { 40 return input.begin(); 41 } 42 43 static void AdvanceIterator(ConstIterator& iterator) { iterator++; } 44 static void AdvanceIterator(Iterator& iterator) { iterator++; } 45 46 static const K& GetKey(Iterator& iterator) { return iterator->first; } 47 static const K& GetKey(ConstIterator& iterator) { return iterator->first; } 48 49 static V& GetValue(Iterator& iterator) { return iterator->second; } 50 static const V& GetValue(ConstIterator& iterator) { return iterator->second; } 51 52 static bool Insert(std::map<K, V, Compare>& input, const K& key, V&& value) { 53 input.insert(std::make_pair(key, std::forward<V>(value))); 54 return true; 55 } 56 static bool Insert(std::map<K, V, Compare>& input, 57 const K& key, 58 const V& value) { 59 input.insert(std::make_pair(key, value)); 60 return true; 61 } 62 63 static void SetToEmpty(std::map<K, V, Compare>* output) { output->clear(); } 64 }; 65 66 template <typename K, typename V> 67 struct MapTraits<std::unordered_map<K, V>> { 68 using Key = K; 69 using Value = V; 70 using Iterator = typename std::unordered_map<K, V>::iterator; 71 using ConstIterator = typename std::unordered_map<K, V>::const_iterator; 72 73 static bool IsNull(const std::unordered_map<K, V>& input) { 74 // std::unordered_map<> is always converted to non-null mojom map. 75 return false; 76 } 77 78 static void SetToNull(std::unordered_map<K, V>* output) { 79 // std::unordered_map<> doesn't support null state. Set it to empty instead. 80 output->clear(); 81 } 82 83 static size_t GetSize(const std::unordered_map<K, V>& input) { 84 return input.size(); 85 } 86 87 static ConstIterator GetBegin(const std::unordered_map<K, V>& input) { 88 return input.begin(); 89 } 90 static Iterator GetBegin(std::unordered_map<K, V>& input) { 91 return input.begin(); 92 } 93 94 static void AdvanceIterator(ConstIterator& iterator) { iterator++; } 95 static void AdvanceIterator(Iterator& iterator) { iterator++; } 96 97 static const K& GetKey(Iterator& iterator) { return iterator->first; } 98 static const K& GetKey(ConstIterator& iterator) { return iterator->first; } 99 100 static V& GetValue(Iterator& iterator) { return iterator->second; } 101 static const V& GetValue(ConstIterator& iterator) { return iterator->second; } 102 103 template <typename IK, typename IV> 104 static bool Insert(std::unordered_map<K, V>& input, IK&& key, IV&& value) { 105 input.insert( 106 std::make_pair(std::forward<IK>(key), std::forward<IV>(value))); 107 return true; 108 } 109 110 static void SetToEmpty(std::unordered_map<K, V>* output) { output->clear(); } 111 }; 112 113 } // namespace mojo 114 115 #endif // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_ 116