#ifndef MIGRAPH_GUARD_MIGRAPHLIB_RANGES_HPP #define MIGRAPH_GUARD_MIGRAPHLIB_RANGES_HPP #include #include namespace migraph { template struct rank : rank { }; template <> struct rank<0> { }; namespace detail { template auto generic_find_impl(rank<2>, String&& s, const T& x) -> decltype(s.begin() + s.find(x), s.npos) { auto index = s.find(x); if(index == s.npos) return s.end(); else return s.begin() + index; } template auto generic_find_impl(rank<1>, C&& c, const T& x) -> decltype(c.find(x)) { return c.find(x); } template auto generic_find_impl(rank<0>, C&& c, const T& x) { return std::find(c.begin(), c.end(), x); } } // namespace detail template auto generic_find(C&& c, const T& x) { return detail::generic_find_impl(rank<2>{}, c, x); } template bool contains(const C& c, const T& x) { return generic_find(c, x) != c.end(); } template bool contains(const std::initializer_list& c, const U& x) { return generic_find(c, x) != c.end(); } template void copy(Range&& r, Iterator it) { std::copy(r.begin(), r.end(), it); } template void replace(Range&& r, const T& old, const T& new_x) { std::replace(r.begin(), r.end(), old, new_x); } template struct iterator_range { Iterator start; Iterator last; Iterator begin() const { return start; } Iterator end() const { return last; } }; template iterator_range range(Iterator start, Iterator last) { return {start, last}; } } // namespace migraph #endif