Program Listing for File common.h
↰ Return to documentation for file (src/pcms/utility/common.h)
#ifndef PCMS_COUPLING_COMMON_H
#define PCMS_COUPLING_COMMON_H
#include "pcms/utility/assert.h"
#include <map>
#include <string>
#include <vector>
#include <algorithm>
namespace pcms
{
namespace detail
{
// helper function for dealing with field maps
template <typename T, typename U>
auto& find_or_error(const std::string& name, const std::map<T, U>& map)
{
auto it = map.find(name);
PCMS_ALWAYS_ASSERT(it != map.end());
return it->second;
}
template <typename T, typename U>
auto& find_or_error(const std::string& name, std::map<T, U>& map)
{
auto it = map.find(name);
PCMS_ALWAYS_ASSERT(it != map.end());
return it->second;
}
template <typename T, typename U>
auto find_many_or_error(const std::vector<T>& keys, const std::map<T, U>& map)
{
std::vector<std::reference_wrapper<U>> results;
results.reserve(keys.size());
std::transform(keys.begin(), keys.end(), std::back_inserter(results),
[&map](const std::string& key) {
return std::ref(detail::find_or_error(key, map));
});
return results;
}
template <typename T, typename U>
auto find_many_or_error(const std::vector<T>& keys, std::map<T, U>& map)
{
std::vector<std::reference_wrapper<U>> results;
results.reserve(keys.size());
std::transform(keys.begin(), keys.end(), std::back_inserter(results),
[&map](const std::string& key) {
return std::ref(detail::find_or_error(key, map));
});
return results;
}
} // namespace detail
} // namespace pcms
#endif // PCMS_COUPLING_COMMON_H