blob: fc52fc3783017936cc50d5b3969139f29ac7eb0e [file] [log] [blame]
#pragma once
#include <algorithm>
#include <iterator>
namespace utils
{
namespace detail
{
template <class T>
concept has_member_reserve = requires(T t)
{
t.reserve(size_t{});
};
} // namespace detail
template <template <class, class...> class R, class Container, class Functor>
inline auto transform(const Container& container, Functor&& f)
{
auto result = R<decltype(f(*container.begin()))>{};
if constexpr (detail::has_member_reserve<decltype(result)>)
{
result.reserve(container.size());
}
std::transform(container.begin(), container.end(),
std::inserter(result, result.end()),
std::forward<Functor>(f));
return result;
}
template <template <class, class...> class Container, class Functor,
class... Args>
inline auto transform(const Container<Args...>& container, Functor&& f)
{
return transform<Container, Container<Args...>, Functor>(
container, std::forward<Functor>(f));
}
} // namespace utils