1677fd363947087862167cfbb0737214255801a35Alex Vakulenko// Copyright 2014 The Chromium OS Authors. All rights reserved.
2677fd363947087862167cfbb0737214255801a35Alex Vakulenko// Use of this source code is governed by a BSD-style license that can be
3677fd363947087862167cfbb0737214255801a35Alex Vakulenko// found in the LICENSE file.
4677fd363947087862167cfbb0737214255801a35Alex Vakulenko
5fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#ifndef LIBBRILLO_BRILLO_MAP_UTILS_H_
6fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#define LIBBRILLO_BRILLO_MAP_UTILS_H_
7677fd363947087862167cfbb0737214255801a35Alex Vakulenko
8677fd363947087862167cfbb0737214255801a35Alex Vakulenko#include <map>
91d734c244b0ed85352fabdbc812a6ab837a358bdAlex Vakulenko#include <set>
10677fd363947087862167cfbb0737214255801a35Alex Vakulenko#include <utility>
11677fd363947087862167cfbb0737214255801a35Alex Vakulenko#include <vector>
12677fd363947087862167cfbb0737214255801a35Alex Vakulenko
139ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenkonamespace brillo {
14677fd363947087862167cfbb0737214255801a35Alex Vakulenko
151d734c244b0ed85352fabdbc812a6ab837a358bdAlex Vakulenko// Given an STL map, returns a set containing all keys from the map.
16677fd363947087862167cfbb0737214255801a35Alex Vakulenkotemplate<typename T>
17847b871c166235af441bd59572dd9aabcd8ae976Alex Vakulenkoinline std::set<typename T::key_type> GetMapKeys(const T& map) {
181d734c244b0ed85352fabdbc812a6ab837a358bdAlex Vakulenko  std::set<typename T::key_type> keys;
19677fd363947087862167cfbb0737214255801a35Alex Vakulenko  for (const auto& pair : map)
201d734c244b0ed85352fabdbc812a6ab837a358bdAlex Vakulenko    keys.insert(keys.end(), pair.first);  // Map keys are already sorted.
21677fd363947087862167cfbb0737214255801a35Alex Vakulenko  return keys;
22677fd363947087862167cfbb0737214255801a35Alex Vakulenko}
23677fd363947087862167cfbb0737214255801a35Alex Vakulenko
24f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko// Given an STL map, returns a vector containing all keys from the map.
25f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko// The keys in the vector are sorted.
26f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenkotemplate<typename T>
27f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenkoinline std::vector<typename T::key_type> GetMapKeysAsVector(const T& map) {
28f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko  std::vector<typename T::key_type> keys;
29f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko  keys.reserve(map.size());
30f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko  for (const auto& pair : map)
31f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko    keys.push_back(pair.first);
32f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko  return keys;
33f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko}
34f7fd94d500c436164b2d74e713182f2ce4d9b334Alex Vakulenko
351d734c244b0ed85352fabdbc812a6ab837a358bdAlex Vakulenko// Given an STL map, returns a vector containing all values from the map.
36677fd363947087862167cfbb0737214255801a35Alex Vakulenkotemplate<typename T>
37847b871c166235af441bd59572dd9aabcd8ae976Alex Vakulenkoinline std::vector<typename T::mapped_type> GetMapValues(const T& map) {
38677fd363947087862167cfbb0737214255801a35Alex Vakulenko  std::vector<typename T::mapped_type> values;
39677fd363947087862167cfbb0737214255801a35Alex Vakulenko  values.reserve(map.size());
40677fd363947087862167cfbb0737214255801a35Alex Vakulenko  for (const auto& pair : map)
41677fd363947087862167cfbb0737214255801a35Alex Vakulenko    values.push_back(pair.second);
42677fd363947087862167cfbb0737214255801a35Alex Vakulenko  return values;
43677fd363947087862167cfbb0737214255801a35Alex Vakulenko}
44677fd363947087862167cfbb0737214255801a35Alex Vakulenko
451d734c244b0ed85352fabdbc812a6ab837a358bdAlex Vakulenko// Given an STL map, returns a vector of key-value pairs from the map.
46677fd363947087862167cfbb0737214255801a35Alex Vakulenkotemplate<typename T>
47847b871c166235af441bd59572dd9aabcd8ae976Alex Vakulenkoinline std::vector<std::pair<typename T::key_type, typename T::mapped_type>>
4805d29044d14a60775ed6c51c75a414eb0cb50347Alex VakulenkoMapToVector(const T& map) {
49677fd363947087862167cfbb0737214255801a35Alex Vakulenko  std::vector<std::pair<typename T::key_type, typename T::mapped_type>> vector;
50677fd363947087862167cfbb0737214255801a35Alex Vakulenko  vector.reserve(map.size());
51677fd363947087862167cfbb0737214255801a35Alex Vakulenko  for (const auto& pair : map)
52677fd363947087862167cfbb0737214255801a35Alex Vakulenko    vector.push_back(pair);
53677fd363947087862167cfbb0737214255801a35Alex Vakulenko  return vector;
54677fd363947087862167cfbb0737214255801a35Alex Vakulenko}
55677fd363947087862167cfbb0737214255801a35Alex Vakulenko
56993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET// Given an STL map, returns the value associated with a given key or a default
57993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET// value if the key is not present in the map.
58993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNETtemplate<typename T>
5905d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenkoinline typename T::mapped_type GetOrDefault(
6005d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko    const T& map,
6105d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko    typename T::key_type key,
6205d29044d14a60775ed6c51c75a414eb0cb50347Alex Vakulenko    const typename T::mapped_type& def) {
63993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET  typename T::const_iterator it = map.find(key);
64993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET  if (it == map.end())
65993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET    return def;
66993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET  return it->second;
67993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET}
68993233e3e9a6e2d8ea08f16a18c4ebbd5c3f6bacBertrand SIMONNET
699ed0cab99f18acb3570a35e9408f24355f6b8324Alex Vakulenko}  // namespace brillo
70677fd363947087862167cfbb0737214255801a35Alex Vakulenko
71fed60b0c640828b320f56293c8bebc43fd2b1da8Alex Vakulenko#endif  // LIBBRILLO_BRILLO_MAP_UTILS_H_
72