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