Skip to content

Commit

Permalink
refactor: remove shit from StringMisc
Browse files Browse the repository at this point in the history
  • Loading branch information
MistEO committed Dec 12, 2023
1 parent 3ddd057 commit 9de4484
Showing 1 changed file with 32 additions and 79 deletions.
111 changes: 32 additions & 79 deletions source/include/Utils/StringMisc.hpp
Original file line number Diff line number Diff line change
@@ -1,136 +1,89 @@
#pragma once

#include <algorithm>
#include <functional>
#include <initializer_list>
#include <iterator>
#include <locale>
#include <map>
#include <memory>
#include <string>
#include <string_view>
#include <type_traits>
#include <utility>
#include <vector>

#include "Ranges.hpp"

MAA_NS_BEGIN

namespace string_detail
{
template <typename StringT>
using sv_type = std::basic_string_view<typename std::remove_reference_t<StringT>::value_type,
typename std::remove_reference_t<StringT>::traits_type>;

template <typename StringT>
using sv_pair = std::pair<sv_type<StringT>, sv_type<StringT>>;
} // namespace string_detail

template <typename StringT, typename CharT = MAA_RNS::ranges::range_value_t<StringT>>
concept IsSomeKindOfString = std::same_as<CharT, char> || std::same_as<CharT, wchar_t>;

template <typename StringArrayT, typename StringT = MAA_RNS::ranges::range_value_t<StringArrayT>>
concept IsSomeKindOfStringArray = IsSomeKindOfString<StringT>;
concept IsSomeKindOfString = std::same_as<typename StringT::value_type, char> || std::same_as<typename StringT::value_type, wchar_t>;

template <typename StringT>
requires IsSomeKindOfString<StringT>
inline constexpr void string_replace_all_(StringT& str, string_detail::sv_type<StringT> from,
string_detail::sv_type<StringT> to)
requires IsSomeKindOfString<StringT>
inline void string_replace_all_(StringT& str, const StringT& from, const StringT& to)
{
for (size_t pos(0);; pos += to.length()) {
if ((pos = str.find(from, pos)) == StringT::npos) return;
str.replace(pos, from.length(), to);
for (size_t pos = str.find(from); pos != StringT::npos; pos = str.find(from, pos + to.size())) {
str.replace(pos, from.size(), to);
}
}

template <typename StringT, typename MapT>
requires IsSomeKindOfString<StringT>
inline constexpr void string_replace_all_(StringT& str, const MapT& replace_map)
requires IsSomeKindOfString<StringT>
inline void string_replace_all_(StringT& str, const MapT& replace_map)
{
for (const auto& [from, to] : replace_map) {
string_replace_all_(str, from, to);
}
}

#ifdef MAA_USE_RANGES_RANGE_V3
// workaround for P2210R2
template <MAA_RNS::ranges::forward_range Rng>
requires(requires(Rng rng) { std::basic_string_view(std::addressof(*rng.begin()), MAA_RNS::ranges::distance(rng)); })
inline auto make_string_view(Rng rng)
{
return std::basic_string_view(std::addressof(*rng.begin()), MAA_RNS::ranges::distance(rng));
}

template <std::forward_iterator It, std::sized_sentinel_for<It> End>
requires(requires(It beg, End end) { std::basic_string_view(std::addressof(*beg), std::distance(beg, end)); })
inline auto make_string_view(It beg, End end)
{
return std::basic_string_view(std::addressof(*beg), std::distance(beg, end));
}
#else
template <MAA_RNS::ranges::contiguous_range Rng>
inline auto make_string_view(Rng rng)
{
return std::basic_string_view(rng.begin(), rng.end());
}

template <std::contiguous_iterator It, std::sized_sentinel_for<It> End>
requires(requires(It beg, End end) { std::basic_string_view(beg, end); })
inline auto make_string_view(It beg, End end)
{
return std::basic_string_view(beg, end);
}
#endif

template <typename StringT>
requires IsSomeKindOfString<StringT>
[[nodiscard]] inline constexpr auto string_replace_all(StringT&& str, string_detail::sv_type<StringT> from,
string_detail::sv_type<StringT> to)
requires IsSomeKindOfString<StringT>
[[nodiscard]] inline auto string_replace_all(StringT&& str, const StringT& from, const StringT& to)
{
std::decay_t<StringT> result = std::forward<StringT>(str);
string_replace_all_(result, from, to);
return result;
}

template <typename StringT, typename MapT>
requires IsSomeKindOfString<StringT>
[[nodiscard]] inline constexpr auto string_replace_all(const StringT& str, const MapT& replace_map)
requires IsSomeKindOfString<StringT>
[[nodiscard]] inline auto string_replace_all(const StringT& str, const MapT& replace_map)
{
StringT result = str;
string_replace_all_(result, replace_map);
return result;
}

template <typename StringT, typename CharT = MAA_RNS::ranges::range_value_t<StringT>,
typename Pred = decltype([](CharT c) -> bool { return c != ' '; })>
requires IsSomeKindOfString<StringT>
inline void string_trim_(StringT& str, Pred not_space = Pred {})
template <typename StringT, typename CharT = typename StringT::value_type,
typename Pred = decltype([](CharT c) -> bool { return c != ' '; }) >
requires IsSomeKindOfString<StringT>
inline void string_trim_(StringT& str, Pred not_space = Pred{})
{
str.erase(MAA_RNS::ranges::find_if(str | MAA_RNS::views::reverse, not_space).base(), str.end());
str.erase(str.begin(), MAA_RNS::ranges::find_if(str, not_space));
}

template <typename StringT, typename CharT = MAA_RNS::ranges::range_value_t<StringT>>
requires IsSomeKindOfString<StringT>
template <typename StringT>
requires IsSomeKindOfString<StringT>
inline void tolowers_(StringT& str)
{
MAA_RNS::ranges::for_each(str, [](CharT& ch) -> void { ch = static_cast<CharT>(std::tolower(ch)); });
using CharT = typename StringT::value_type;
for (auto& ch : str) {
ch = static_cast<CharT>(std::tolower(ch));
}
}

template <typename StringT, typename CharT = MAA_RNS::ranges::range_value_t<StringT>>
requires IsSomeKindOfString<StringT>
template <typename StringT>
requires IsSomeKindOfString<StringT>
inline void touppers_(StringT& str)
{
MAA_RNS::ranges::for_each(str, [](CharT& ch) -> void { ch = static_cast<CharT>(std::toupper(ch)); });
using CharT = typename StringT::value_type;
for (auto& ch : str) {
ch = static_cast<CharT>(std::toupper(ch));
}
}

template <typename StringT, typename DelimT>
requires IsSomeKindOfString<StringT>
[[nodiscard]] inline constexpr auto string_split(StringT&& str, DelimT&& delim)
requires IsSomeKindOfString<StringT>
[[nodiscard]] inline std::vector<StringT> string_split(const StringT& str, const DelimT& delim)
{
std::vector<std::decay_t<StringT>> result;
std::vector<StringT> result;
auto views = str | MAA_RNS::views::split(delim) |
MAA_RNS::views::transform([](auto&& rng) { return make_string_view(rng); });
MAA_RNS::views::transform([](auto&& rng) { return std::basic_string_view(rng.begin(), rng.end()); });
for (auto v : views) {
result.emplace_back(v);
}
Expand Down

0 comments on commit 9de4484

Please sign in to comment.