#ifndef MIGRAPH_GUARD_MIGRAPHLIB_RANGES_HPP #define MIGRAPH_GUARD_MIGRAPHLIB_RANGES_HPP #include #include #include namespace migraph { 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 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 bool all_of(const C& c, const Predicate& p) { return std::all_of(c.begin(), c.end(), p); } template bool all_of(const std::initializer_list& c, const Predicate& p) { return std::all_of(c.begin(), c.end(), p); } 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}; } template iterator_range range(std::pair p) { return {p.first, p.second}; } } // namespace migraph #endif