Listing 1

template <typename R, typename T>
size_t r_count_impl(R r, const T &val, notional_range_tag const &)
{
  size_t n;
  for(n = 0; r; ++r)
  {
    if(val == *r)

    {
      ++n;
    }
  }
  return n;
}
template <typename R, typename T>
size_t r_count_impl(R r, const T &val, iterable_range_tag const &)
{
  return std::count(r.begin(), r.end(), val);
}
template <typename R, typename T>
size_t r_count_impl(R r, const T &val, indirect_range_tag const &)
{
  return r.count(val);
}
template <typename R, typename T>
size_t r_count(R r, const T &val)
{
  return r_count_impl(r, val, r);
}