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"
|
#include "libimp/platform/win/codecvt.h"
|
||||||
#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_
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user