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