24ResultString
StrCat(
const Strings&... strings) {
25 return [](
auto... string_views) {
26 std::size_t result_size = 0;
27 ((result_size += string_views.size()), ...);
30 result.reserve(result_size);
31 (result.append(string_views), ...);
33 }(std::string_view{strings}...);
41struct HasMappedType<Container, std::void_t<
typename Container::mapped_type>> : std::true_type {};
93 if constexpr (std::is_rvalue_reference_v<
decltype(container)>) {
95 std::make_move_iterator(std::begin(container)),
96 std::make_move_iterator(std::end(container))
99 return ToContainer(std::begin(container), std::end(container));
108struct HasKeyType<Container, std::void_t<
typename Container::key_type>> : std::true_type {};
116auto EraseIf(Container& container, Pred pred) {
117 if constexpr (
impl::kHasKeyType<Container>) {
118 auto old_size = container.size();
119 for (
auto it = std::begin(container), last = std::end(container); it != last;) {
121 it = container.erase(it);
126 return old_size - container.size();
128 auto it = std::remove_if(std::begin(container), std::end(container), pred);
129 const auto removed = std::distance(it, std::end(container));
130 container.erase(it, std::end(container));
137size_t
Erase(Container& container,
const T& elem) {
138 if constexpr (
impl::kHasKeyType<Container>) {
139 return container.erase(elem);
142 auto it = std::remove(std::begin(container), std::end(container), elem);
143 const auto removed = std::distance(it, std::end(container));
144 container.erase(it, std::end(container));