mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-06 16:56:45 +08:00
add: [codecvt] conversion for the same character type
This commit is contained in:
parent
9f333c8b0f
commit
e9742ab28a
@ -3,4 +3,35 @@
|
||||
#include "libimp/platform/win/codecvt.h"
|
||||
#else
|
||||
#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_
|
||||
|
||||
@ -22,8 +22,22 @@ TEST(codecvt, cvt_cstr) {
|
||||
{
|
||||
auto cvt_len = imp::cvt_cstr(utf16, std::wcslen(utf16), (char *)nullptr, 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_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);
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user