Home | History | Annotate | Download | only in brillo
      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 
     13 namespace brillo {
     14 
     15 // Given an STL map, returns a set containing all keys from the map.
     16 template<typename T>
     17 inline 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.
     26 template<typename T>
     27 inline 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.
     36 template<typename T>
     37 inline 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.
     46 template<typename T>
     47 inline std::vector<std::pair<typename T::key_type, typename T::mapped_type>>
     48 MapToVector(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.
     58 template<typename T>
     59 inline 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