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_STANDARD_H_
6#define MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STANDARD_H_
7
8#include "mojo/public/cpp/bindings/map.h"
9#include "mojo/public/cpp/bindings/map_traits.h"
10
11namespace mojo {
12
13template <typename K, typename V>
14struct MapTraits<Map<K, V>> {
15  using Key = K;
16  using Value = V;
17  using Iterator = typename Map<K, V>::Iterator;
18  using ConstIterator = typename Map<K, V>::ConstIterator;
19
20  static bool IsNull(const Map<K, V>& input) { return input.is_null(); }
21  static void SetToNull(Map<K, V>* output) { *output = nullptr; }
22
23  static size_t GetSize(const Map<K, V>& input) { return input.size(); }
24
25  static ConstIterator GetBegin(const Map<K, V>& input) {
26    return input.begin();
27  }
28  static Iterator GetBegin(Map<K, V>& input) { return input.begin(); }
29
30  static void AdvanceIterator(ConstIterator& iterator) { iterator++; }
31  static void AdvanceIterator(Iterator& iterator) { iterator++; }
32
33  static const K& GetKey(Iterator& iterator) { return iterator->first; }
34  static const K& GetKey(ConstIterator& iterator) { return iterator->first; }
35
36  static V& GetValue(Iterator& iterator) { return iterator->second; }
37  static const V& GetValue(ConstIterator& iterator) { return iterator->second; }
38
39  static bool Insert(Map<K, V>& input, const K& key, V&& value) {
40    input.insert(key, std::forward<V>(value));
41    return true;
42  }
43  static bool Insert(Map<K, V>& input, const K& key, const V& value) {
44    input.insert(key, value);
45    return true;
46  }
47
48  static void SetToEmpty(Map<K, V>* output) { output->SetToEmpty(); }
49};
50
51}  // namespace mojo
52
53#endif  // MOJO_PUBLIC_CPP_BINDINGS_MAP_TRAITS_STANDARD_H_
54