add: [codecvt] conversion for the same character type

This commit is contained in:
mutouyun 2022-08-13 15:23:23 +08:00
parent 9f333c8b0f
commit e9742ab28a
2 changed files with 47 additions and 2 deletions

View File

@ -4,3 +4,34 @@
#else #else
#include "libimp/platform/posix/codecvt.h" #include "libimp/platform/posix/codecvt.h"
#endif #endif
#include <algorithm>
#include <cstring>
LIBIMP_NAMESPACE_BEG_
namespace {
template <typename CharT>
std::size_t cpy_cstr(CharT *des, std::size_t dlen, CharT const *src, std::size_t slen) noexcept {
if ((des == nullptr) || (dlen == 0)) {
return slen;
}
std::size_t r = (std::min)(slen, dlen);
std::memcpy(des, src, r * sizeof(CharT));
return r;
}
} // namespace
template <>
std::size_t cvt_cstr(char const *src, std::size_t slen, char *des, std::size_t dlen) noexcept {
return cpy_cstr(des, dlen, src, slen);
}
template <>
std::size_t cvt_cstr(wchar_t const *src, std::size_t slen, wchar_t *des, std::size_t dlen) noexcept {
return cpy_cstr(des, dlen, src, slen);
}
LIBIMP_NAMESPACE_END_

View File

@ -22,8 +22,22 @@ TEST(codecvt, cvt_cstr) {
{ {
auto cvt_len = imp::cvt_cstr(utf16, std::wcslen(utf16), (char *)nullptr, 0); auto cvt_len = imp::cvt_cstr(utf16, std::wcslen(utf16), (char *)nullptr, 0);
EXPECT_NE(cvt_len, 0); EXPECT_NE(cvt_len, 0);
std::string str(cvt_len, L'\0'); std::string str(cvt_len, '\0');
EXPECT_EQ(imp::cvt_cstr(utf16, std::wcslen(utf16), &str[0], str.size()), cvt_len); EXPECT_EQ(imp::cvt_cstr(utf16, std::wcslen(utf16), &str[0], str.size()), cvt_len);
EXPECT_STREQ(str.c_str(), utf8); EXPECT_STREQ(str.c_str(), utf8);
} }
{
auto cvt_len = imp::cvt_cstr(utf8, std::strlen(utf8), (char *)nullptr, 0);
EXPECT_EQ(cvt_len, std::strlen(utf8));
std::string str(cvt_len, '\0');
EXPECT_EQ(imp::cvt_cstr(utf8, cvt_len, &str[0], str.size()), cvt_len);
EXPECT_STREQ(str.c_str(), utf8);
}
{
auto cvt_len = imp::cvt_cstr(utf16, std::wcslen(utf16), (wchar_t *)nullptr, 0);
EXPECT_EQ(cvt_len, std::wcslen(utf16));
std::wstring wstr(cvt_len, L'\0');
EXPECT_EQ(imp::cvt_cstr(utf16, cvt_len, &wstr[0], wstr.size()), cvt_len);
EXPECT_STREQ(wstr.c_str(), utf16);
}
} }