#pragma once #include #include #include #include namespace devilution { // Internal namespace that sets up ADL lookup and the container Iterator type. namespace container_internal { using std::begin; using std::end; template using Iterator = decltype(begin(std::declval())); template using Difference = typename std::iterator_traits>::difference_type; template Iterator c_begin(C &c) { return begin(c); } template Iterator c_end(C &c) { return end(c); } } // namespace container_internal template bool c_any_of(const C &c, Predicate &&predicate) { return std::any_of(container_internal::begin(c), container_internal::end(c), std::forward(predicate)); } template bool c_all_of(const C &c, Predicate &&predicate) { return std::all_of(container_internal::begin(c), container_internal::end(c), std::forward(predicate)); } template bool c_none_of(const C &c, Predicate &&predicate) { return std::none_of(container_internal::begin(c), container_internal::end(c), std::forward(predicate)); } template container_internal::Iterator c_find_if(C &c, Predicate &&predicate) { return std::find_if(container_internal::begin(c), container_internal::end(c), std::forward(predicate)); } template container_internal::Difference c_count_if(const C &c, Predicate &&predicate) { return std::count_if(container_internal::c_begin(c), container_internal::c_end(c), std::forward(predicate)); } template container_internal::Difference c_count(const C &c, T &&value) { return std::count(container_internal::c_begin(c), container_internal::c_end(c), std::forward(value)); } } // namespace devilution