#pragma once #include #include namespace util { template concept reservable = requires(C &c, typename C::size_type i) { {c.reserve(i)}; }; template concept back_insertible = requires(C &c, const std::ranges::range_value_t &t) { { std::back_inserter(c) } -> std::same_as>; {c.push_back(t)}; }; template concept front_insertible = requires(C &c, const std::ranges::range_value_t &t) { { std::front_inserter(c) } -> std::same_as>; {c.push_front(t)}; }; template concept insertible = requires(C &c, std::ranges::iterator_t i, const std::ranges::range_value_t &t) { { std::inserter(c, i) } -> std::same_as>; {c.insert(i, t)}; }; template concept emplaceable = requires(C &c, Ts... t) { {c.emplace(std::move(t...))}; }; template concept back_emplaceable = requires(C &c, Ts... t) { {c.emplace_back(std::move(t...))}; }; } // namespace util