Program Listing for File make_histogram.hpp

Return to documentation for file (include/dish2/utility/make_histogram.hpp)

#pragma once
#ifndef DISH2_UTILITY_MAKE_HISTOGRAM_HPP_INCLUDE
#define DISH2_UTILITY_MAKE_HISTOGRAM_HPP_INCLUDE

#include <algorithm>
#include <string>
#include <type_traits>
#include <unordered_map>

#include "../../../third-party/conduit/include/uitsl/polyfill/identity.hpp"
#include "../../../third-party/Empirical/include/emp/base/vector.hpp"

namespace dish2 {

template< typename Iterator, typename UnaryOp>
auto make_histogram(
  const Iterator begin, const Iterator end, UnaryOp transform=std::identity
) {

  using T = typename Iterator::value_type;
  using K = typename std::result_of<UnaryOp(T)>::type;

  std::unordered_map< K, size_t > res;

  std::for_each( begin, end, [&]( const T& val ){
    ++res[ transform( val ) ];
  } );

  return res;

}

} // namespace dish2

#endif // #ifndef DISH2_UTILITY_MAKE_HISTOGRAM_HPP_INCLUDE