feat: add string converter

This commit is contained in:
ToruNiina
2024-07-10 02:22:50 +09:00
parent 826e6414a0
commit a77516a2d0

View File

@@ -99,6 +99,68 @@ inline std::string make_string(std::size_t len, char c)
return std::string(len, c);
}
// ---------------------------------------------------------------------------
template<typename Char, typename Traits, typename Alloc>
struct to_string_of_impl
{
static_assert(sizeof(Char) == sizeof(char), "");
static std::basic_string<Char, Traits, Alloc> invoke(std::string s)
{
std::basic_string<Char, Traits, Alloc> retval;
std::transform(s.begin(), s.end(), std::back_inserter(retval),
[](const char c) {return static_cast<Char>(c);});
return retval;
}
template<std::size_t N>
static std::basic_string<Char, Traits, Alloc> invoke(const char (&s)[N])
{
std::basic_string<Char, Traits, Alloc> retval;
std::transform(std::begin(s), std::end(s), std::back_inserter(retval),
[](const char c) {return static_cast<Char>(c);});
return retval;
}
};
template<>
struct to_string_of_impl<char, std::char_traits<char>, std::allocator<char>>
{
static std::string invoke(std::string s)
{
return s;
}
template<std::size_t N>
static std::string invoke(const char (&s)[N])
{
return std::string(s);
}
};
template<typename Char, typename Traits = std::char_traits<Char>,
typename Alloc = std::allocator<Char>>
std::basic_string<Char, Traits, Alloc> to_string_of(std::string s)
{
return to_string_of_impl<Char, Traits, Alloc>::invoke(std::move(s));
}
template<typename Char, std::size_t N, typename Traits = std::char_traits<Char>,
typename Alloc = std::allocator<Char>>
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);
}
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 toml
#endif // TOML11_UTILITY_HPP