feat: generalize string converter

This commit is contained in:
ToruNiina
2024-07-10 02:37:29 +09:00
parent a77516a2d0
commit 31810136d1

View File

@@ -101,20 +101,22 @@ inline std::string make_string(std::size_t len, char c)
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
template<typename Char, typename Traits, typename Alloc> template<typename Char, typename Traits, typename Alloc,
typename Char2, typename Traits2, typename Alloc2>
struct to_string_of_impl struct to_string_of_impl
{ {
static_assert(sizeof(Char) == sizeof(char), ""); static_assert(sizeof(Char) == sizeof(char), "");
static_assert(sizeof(Char2) == sizeof(char), "");
static std::basic_string<Char, Traits, Alloc> invoke(std::string s) static std::basic_string<Char, Traits, Alloc> invoke(std::basic_string<Char2, Traits2, Alloc2> s)
{ {
std::basic_string<Char, Traits, Alloc> retval; std::basic_string<Char, Traits, Alloc> retval;
std::transform(s.begin(), s.end(), std::back_inserter(retval), std::transform(s.begin(), s.end(), std::back_inserter(retval),
[](const char c) {return static_cast<Char>(c);}); [](const Char2 c) {return static_cast<Char>(c);});
return retval; return retval;
} }
template<std::size_t N> template<std::size_t N>
static std::basic_string<Char, Traits, Alloc> invoke(const char (&s)[N]) static std::basic_string<Char, Traits, Alloc> invoke(const Char2 (&s)[N])
{ {
std::basic_string<Char, Traits, Alloc> retval; std::basic_string<Char, Traits, Alloc> retval;
std::transform(std::begin(s), std::end(s), std::back_inserter(retval), std::transform(std::begin(s), std::end(s), std::back_inserter(retval),
@@ -123,42 +125,38 @@ struct to_string_of_impl
} }
}; };
template<> template<typename Char, typename Traits, typename Alloc>
struct to_string_of_impl<char, std::char_traits<char>, std::allocator<char>> struct to_string_of_impl<Char, Traits, Alloc, Char, Traits, Alloc>
{ {
static std::string invoke(std::string s) static_assert(sizeof(Char) == sizeof(char), "");
static std::basic_string<Char, Traits, Alloc> invoke(std::basic_string<Char, Traits, Alloc> s)
{ {
return s; return s;
} }
template<std::size_t N> template<std::size_t N>
static std::string invoke(const char (&s)[N]) static std::basic_string<Char, Traits, Alloc> invoke(const Char (&s)[N])
{ {
return std::string(s); return std::basic_string<Char, Traits, Alloc>(s);
} }
}; };
template<typename Char, typename Traits = std::char_traits<Char>, template<typename Char,
typename Alloc = std::allocator<Char>> typename Traits = std::char_traits<Char>,
std::basic_string<Char, Traits, Alloc> to_string_of(std::string s) typename Alloc = std::allocator<Char>,
typename Char2, typename Traits2, typename Alloc2>
std::basic_string<Char, Traits, Alloc>
to_string_of(std::basic_string<Char2, Traits2, Alloc2> s)
{ {
return to_string_of_impl<Char, Traits, Alloc>::invoke(std::move(s)); return to_string_of_impl<Char, Traits, Alloc, Char2, Traits2, Alloc2>::invoke(std::move(s));
} }
template<typename Char, std::size_t N, typename Traits = std::char_traits<Char>, template<typename Char,
typename Alloc = std::allocator<Char>> typename Traits = std::char_traits<Char>,
typename Alloc = std::allocator<Char>,
typename Char2, typename Traits2, typename Alloc2, std::size_t N>
std::basic_string<Char, Traits, Alloc> to_string_of(const char (&s)[N]) std::basic_string<Char, Traits, Alloc> to_string_of(const char (&s)[N])
{ {
return to_string_of_impl<Char, Traits, Alloc>::template invoke<N>(s); return to_string_of_impl<Char, Traits, Alloc, Char2, Traits2, Alloc2>::template invoke<N>(s);
}
template<typename Char, typename Traits, typename Alloc>
std::string to_char_string(std::basic_string<Char, Traits, Alloc> s)
{
static_assert(sizeof(Char) == sizeof(char), "");
std::string retval;
std::transform(s.begin(), s.end(), std::back_inserter(retval),
[](const Char c) {return static_cast<char>(c);});
return retval;
} }
} // namespace detail } // namespace detail