optimize StartsWith,EndsWith
All checks were successful
linux-x64-gcc / linux-gcc (Debug) (push) Successful in 36s
linux-x64-gcc / linux-gcc (Release) (push) Successful in 38s

This commit is contained in:
tqcq 2024-03-04 18:20:17 +08:00
parent f31657640f
commit fcce11249b
2 changed files with 62 additions and 11 deletions

58
include/sled/apply.h Normal file
View File

@ -0,0 +1,58 @@
#pragma once
#ifndef SLED_APPLY_H
#define SLED_APPLY_H
#include <functional>
#include <tuple>
namespace sled {
namespace detail {
template<int... Seq>
struct Sequence {};
template<int N, int... Seq>
struct MakeSeq : MakeSeq<N - 1, N - 1, Seq...> {};
template<int... Seq>
struct MakeSeq<0, Seq...> {
using type = Sequence<Seq...>;
};
template<typename ReturnT, typename Func, typename Tuple, int... Seq>
ReturnT
ApplyImpl(const Func &func, const Tuple &tuple, const Sequence<Seq...> &)
{
return std::bind(func, std::get<Seq>(tuple)...)();
}
struct VoidTag {};
}// namespace detail
template<typename ReturnT,
typename Func,
typename Tuple,
typename std::enable_if<!std::is_void<ReturnT>::value, ReturnT>::type
* = nullptr>
ReturnT
apply(const Func &func, const Tuple &tuple)
{
return detail::ApplyImpl<ReturnT>(
func, tuple,
typename detail::MakeSeq<std::tuple_size<Tuple>::value>::type());
}
template<typename ReturnT = void,
typename Func,
typename Tuple,
typename std::enable_if<std::is_void<ReturnT>::value,
detail::VoidTag>::type * = nullptr>
void
apply(const Func &func, const Tuple &tuple)
{
detail::ApplyImpl<ReturnT>(
func, tuple,
typename detail::MakeSeq<std::tuple_size<Tuple>::value>::type());
}
}// namespace sled
#endif// SLED_APPLY_H

View File

@ -50,22 +50,15 @@ Trim(const std::string &str, const std::string &chars)
std::string
TrimLeft(const std::string &str, const std::string &chars)
{
size_t start = 0;
while (start < str.size()
&& chars.find_first_of(str[start]) != std::string::npos) {
++start;
}
return str.substr(start);
size_t start = str.find_first_not_of(chars);
return start == std::string::npos ? "" : str.substr(start);
}
std::string
TrimRight(const std::string &str, const std::string &chars)
{
size_t end = str.size();
while (end > 0 && chars.find_first_of(str[end - 1]) != std::string::npos) {
--end;
}
return str.substr(0, end);
size_t end = str.find_last_not_of(chars);
return end == std::string::npos ? "" : str.substr(0, end + 1);
}
bool