1// Copyright 2014 The Chromium OS 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 LIBBRILLO_BRILLO_MAP_UTILS_H_ 6#define LIBBRILLO_BRILLO_MAP_UTILS_H_ 7 8#include <map> 9#include <set> 10#include <utility> 11#include <vector> 12 13namespace brillo { 14 15// Given an STL map, returns a set containing all keys from the map. 16template<typename T> 17inline std::set<typename T::key_type> GetMapKeys(const T& map) { 18 std::set<typename T::key_type> keys; 19 for (const auto& pair : map) 20 keys.insert(keys.end(), pair.first); // Map keys are already sorted. 21 return keys; 22} 23 24// Given an STL map, returns a vector containing all keys from the map. 25// The keys in the vector are sorted. 26template<typename T> 27inline std::vector<typename T::key_type> GetMapKeysAsVector(const T& map) { 28 std::vector<typename T::key_type> keys; 29 keys.reserve(map.size()); 30 for (const auto& pair : map) 31 keys.push_back(pair.first); 32 return keys; 33} 34 35// Given an STL map, returns a vector containing all values from the map. 36template<typename T> 37inline std::vector<typename T::mapped_type> GetMapValues(const T& map) { 38 std::vector<typename T::mapped_type> values; 39 values.reserve(map.size()); 40 for (const auto& pair : map) 41 values.push_back(pair.second); 42 return values; 43} 44 45// Given an STL map, returns a vector of key-value pairs from the map. 46template<typename T> 47inline std::vector<std::pair<typename T::key_type, typename T::mapped_type>> 48MapToVector(const T& map) { 49 std::vector<std::pair<typename T::key_type, typename T::mapped_type>> vector; 50 vector.reserve(map.size()); 51 for (const auto& pair : map) 52 vector.push_back(pair); 53 return vector; 54} 55 56// Given an STL map, returns the value associated with a given key or a default 57// value if the key is not present in the map. 58template<typename T> 59inline typename T::mapped_type GetOrDefault( 60 const T& map, 61 typename T::key_type key, 62 const typename T::mapped_type& def) { 63 typename T::const_iterator it = map.find(key); 64 if (it == map.end()) 65 return def; 66 return it->second; 67} 68 69} // namespace brillo 70 71#endif // LIBBRILLO_BRILLO_MAP_UTILS_H_ 72