#include #include #include "wcharptr.h" #include "win.h" wchar_ptr::wchar_ptr() noexcept {} wchar_ptr::wchar_ptr(wchar_t* const s) noexcept : m_p(s) {} wchar_ptr& wchar_ptr::operator=(wchar_t* const s) noexcept { if (m_p != s) { delete m_p; m_p = s; } return *this; } wchar_ptr::wchar_ptr(wchar_ptr&& other) noexcept : m_p(std::exchange(other.m_p, nullptr)) {} wchar_ptr& wchar_ptr::operator=(wchar_ptr&& other) noexcept { std::swap(m_p, other.m_p); return *this; } wchar_ptr::operator wchar_t*() noexcept { return m_p; } wchar_t* wchar_ptr::release() noexcept { wchar_t* p2 = m_p; m_p = nullptr; return p2; } wchar_ptr::~wchar_ptr() noexcept { delete m_p; } wchar_ptr wchar_ptr::from_narrow(const char* const src, const int cp) { int cbMultiByte = strlen(src)+1; int cchWideChar = MultiByteToWideChar(cp, 0, src, cbMultiByte, NULL, 0); wchar_t* dst = new wchar_t[cchWideChar]; if (!MultiByteToWideChar(cp, 0, src, cbMultiByte, dst, cchWideChar)) { delete dst; throw Win32Error(); } return dst; } wchar_ptr wchar_ptr::copy(const wchar_t* const src) { const int cb = wcslen(src)+1; wchar_t* dst = new wchar_t[cb]; memcpy(dst, src, cb*sizeof(wchar_t)); return dst; }