diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2020-10-18 02:38:23 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2020-10-18 03:12:02 +0300 |
commit | 25f39c16c2024bd7c9e03b4bc84625d0c8eed849 (patch) | |
tree | e00ddafc6d887c6f4d8c7fa709d51d0edea965d3 | |
parent | more convenience overloads (diff) | |
download | winapi-utf8-25f39c16c2024bd7c9e03b4bc84625d0c8eed849.tar.gz winapi-utf8-25f39c16c2024bd7c9e03b4bc84625d0c8eed849.zip |
much more type-safe & generic overloads
-rw-r--r-- | include/winapi/utf8.hpp | 14 | ||||
-rw-r--r-- | src/convert.cpp | 14 |
2 files changed, 12 insertions, 16 deletions
diff --git a/include/winapi/utf8.hpp b/include/winapi/utf8.hpp index c6fc77b..9469fd7 100644 --- a/include/winapi/utf8.hpp +++ b/include/winapi/utf8.hpp @@ -6,18 +6,26 @@ #pragma once #include <cstddef> +#include <memory> #include <string> #include <vector> namespace winapi { std::wstring widen(const std::string&); -std::wstring widen(const std::vector<unsigned char>&); std::wstring widen(const void*, std::size_t nb); +template <typename T, typename Alloc = std::allocator<T>> +std::wstring widen(const std::vector<T, Alloc>& src) { + return widen(src.data(), src.size() * sizeof(T)); +} + std::string narrow(const std::wstring&); -std::string narrow(const wchar_t*, std::size_t nch); -std::string narrow(const std::vector<unsigned char>&); std::string narrow(const void*, std::size_t nb); +template <typename T, typename Alloc = std::allocator<T>> +std::string narrow(const std::vector<T, Alloc>& src) { + return narrow(src.data(), src.size() * sizeof(T)); +} + } // namespace winapi diff --git a/src/convert.cpp b/src/convert.cpp index f3f0730..0d24424 100644 --- a/src/convert.cpp +++ b/src/convert.cpp @@ -86,10 +86,6 @@ std::wstring widen(const std::string& src) { return widen(src.c_str(), src.size()); } -std::wstring widen(const std::vector<unsigned char>& src) { - return widen(src.data(), src.size()); -} - std::wstring widen(const void* src, std::size_t in_nb) { const DWORD flags = MB_ERR_INVALID_CHARS; @@ -116,16 +112,8 @@ std::wstring widen(const void* src, std::size_t in_nb) { } std::string narrow(const std::wstring& src) { - return narrow(src.c_str(), src.size()); -} - -std::string narrow(const wchar_t* src, std::size_t nch) { static_assert(sizeof(wchar_t) == sizeof(WCHAR), "wchar_t != WCHAR"); - return narrow(src, nch * sizeof(wchar_t)); -} - -std::string narrow(const std::vector<unsigned char>& src) { - return narrow(src.data(), src.size()); + return narrow(src.c_str(), src.size() * sizeof(std::wstring::value_type)); } std::string narrow(const void* src, std::size_t in_nb) { |