// Copyright 2014 The Chromium OS Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef LIBBRILLO_BRILLO_MAP_UTILS_H_ #define LIBBRILLO_BRILLO_MAP_UTILS_H_ #include <map> #include <set> #include <utility> #include <vector> namespace brillo { // Given an STL map, returns a set containing all keys from the map. template<typename T> inline std::set<typename T::key_type> GetMapKeys(const T& map) { std::set<typename T::key_type> keys; for (const auto& pair : map) keys.insert(keys.end(), pair.first); // Map keys are already sorted. return keys; } // Given an STL map, returns a vector containing all keys from the map. // The keys in the vector are sorted. template<typename T> inline std::vector<typename T::key_type> GetMapKeysAsVector(const T& map) { std::vector<typename T::key_type> keys; keys.reserve(map.size()); for (const auto& pair : map) keys.push_back(pair.first); return keys; } // Given an STL map, returns a vector containing all values from the map. template<typename T> inline std::vector<typename T::mapped_type> GetMapValues(const T& map) { std::vector<typename T::mapped_type> values; values.reserve(map.size()); for (const auto& pair : map) values.push_back(pair.second); return values; } // Given an STL map, returns a vector of key-value pairs from the map. template<typename T> inline std::vector<std::pair<typename T::key_type, typename T::mapped_type>> MapToVector(const T& map) { std::vector<std::pair<typename T::key_type, typename T::mapped_type>> vector; vector.reserve(map.size()); for (const auto& pair : map) vector.push_back(pair); return vector; } // Given an STL map, returns the value associated with a given key or a default // value if the key is not present in the map. template<typename T> inline typename T::mapped_type GetOrDefault( const T& map, typename T::key_type key, const typename T::mapped_type& def) { typename T::const_iterator it = map.find(key); if (it == map.end()) return def; return it->second; } } // namespace brillo #endif // LIBBRILLO_BRILLO_MAP_UTILS_H_