1645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Copyright 2016 The Chromium Authors. All rights reserved.
2645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
3645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez// found in the LICENSE file.
4645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
5645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#ifndef MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
6645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
7645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
8645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <map>
9645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include <unordered_map>
10645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
11645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#include "mojo/public/cpp/bindings/map_traits.h"
12645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
13645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveznamespace mojo {
14645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
15645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <typename K, typename V>
16645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct MapTraits<std::map<K, V>> {
17645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using Key = K;
18645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using Value = V;
19645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using Iterator = typename std::map<K, V>::iterator;
20645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using ConstIterator = typename std::map<K, V>::const_iterator;
21645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
22645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool IsNull(const std::map<K, V>& input) {
23645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    // std::map<> is always converted to non-null mojom map.
24645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return false;
25645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
26645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
27645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void SetToNull(std::map<K, V>* output) {
28645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    // std::map<> doesn't support null state. Set it to empty instead.
29645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    output->clear();
30645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
31645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
32645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static size_t GetSize(const std::map<K, V>& input) { return input.size(); }
33645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
34645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static ConstIterator GetBegin(const std::map<K, V>& input) {
35645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return input.begin();
36645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
37645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static Iterator GetBegin(std::map<K, V>& input) { return input.begin(); }
38645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
39645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void AdvanceIterator(ConstIterator& iterator) { iterator++; }
40645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void AdvanceIterator(Iterator& iterator) { iterator++; }
41645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
42645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const K& GetKey(Iterator& iterator) { return iterator->first; }
43645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const K& GetKey(ConstIterator& iterator) { return iterator->first; }
44645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
45645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static V& GetValue(Iterator& iterator) { return iterator->second; }
46645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
47645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
48645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Insert(std::map<K, V>& input, const K& key, V&& value) {
49645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    input.insert(std::make_pair(key, std::forward<V>(value)));
50645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return true;
51645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
52645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Insert(std::map<K, V>& input, const K& key, const V& value) {
53645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    input.insert(std::make_pair(key, value));
54645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return true;
55645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
56645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
57645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void SetToEmpty(std::map<K, V>* output) { output->clear(); }
58645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
59645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
60645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chaveztemplate <typename K, typename V>
61645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavezstruct MapTraits<std::unordered_map<K, V>> {
62645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using Key = K;
63645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using Value = V;
64645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using Iterator = typename std::unordered_map<K, V>::iterator;
65645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  using ConstIterator = typename std::unordered_map<K, V>::const_iterator;
66645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
67645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool IsNull(const std::unordered_map<K, V>& input) {
68645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    // std::unordered_map<> is always converted to non-null mojom map.
69645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return false;
70645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
71645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
72645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void SetToNull(std::unordered_map<K, V>* output) {
73645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    // std::unordered_map<> doesn't support null state. Set it to empty instead.
74645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    output->clear();
75645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
76645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
77645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static size_t GetSize(const std::unordered_map<K, V>& input) {
78645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return input.size();
79645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
80645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
81645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static ConstIterator GetBegin(const std::unordered_map<K, V>& input) {
82645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return input.begin();
83645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
84645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static Iterator GetBegin(std::unordered_map<K, V>& input) {
85645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return input.begin();
86645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
87645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
88645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void AdvanceIterator(ConstIterator& iterator) { iterator++; }
89645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void AdvanceIterator(Iterator& iterator) { iterator++; }
90645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
91645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const K& GetKey(Iterator& iterator) { return iterator->first; }
92645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const K& GetKey(ConstIterator& iterator) { return iterator->first; }
93645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
94645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static V& GetValue(Iterator& iterator) { return iterator->second; }
95645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
96645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
97645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Insert(std::unordered_map<K, V>& input, const K& key, V&& value) {
98645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    input.insert(std::make_pair(key, std::forward<V>(value)));
99645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return true;
100645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
101645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static bool Insert(std::unordered_map<K, V>& input,
102645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                     const K& key,
103645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez                     const V& value) {
104645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    input.insert(std::make_pair(key, value));
105645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez    return true;
106645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  }
107645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
108645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez  static void SetToEmpty(std::unordered_map<K, V>* output) { output->clear(); }
109645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez};
110645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
111645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez}  // namespace mojo
112645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez
113645501c2ab19a559ce82a1d5a29ced159a4c30fbLuis Hector Chavez#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STL_H_
114