#pragma once

#include "Common.h"
#include <string>

#if defined(_WIN32)
#include <windows.h>
#endif

namespace DotNetDupe {
    namespace System {
        class String;

        namespace Utils {
            class StringConvert {
            public:
                // Converts UTF-16 (wchar_t) string to std::string UTF-8
                static inline std::string WCharToUtf8(const wchar_t* pWStr) {
                    if (!pWStr || pWStr[0] == 0) return std::string("");
#if defined(_WIN32)
                    int iSizeNeeded = ::WideCharToMultiByte(CP_UTF8, 0, pWStr, -1, NULL, 0, NULL, NULL);
                    if (iSizeNeeded <= 0) return std::string("");
                    std::string sResult(iSizeNeeded, 0);
                    ::WideCharToMultiByte(CP_UTF8, 0, pWStr, -1, &sResult[0], iSizeNeeded, NULL, NULL);
                    if (!sResult.empty() && sResult.back() == '\0') sResult.pop_back();
                    return sResult;
#else
                    std::string sResult;
                    for (; *pWStr; ++pWStr) {
                        sResult.push_back(static_cast<char>(*pWStr));
                    }
                    return sResult;
#endif
                }

                // Converts UTF-8 (char) string to std::wstring UTF-16
                static inline std::wstring Utf8ToWChar(const char* pUtf8Str) {
                    if (!pUtf8Str || pUtf8Str[0] == 0) return std::wstring(L"");
#if defined(_WIN32)
                    int iSizeNeeded = ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Str, -1, NULL, 0);
                    if (iSizeNeeded <= 0) return std::wstring(L"");
                    std::wstring sResult(iSizeNeeded, 0);
                    ::MultiByteToWideChar(CP_UTF8, 0, pUtf8Str, -1, &sResult[0], iSizeNeeded);
                    if (!sResult.empty() && sResult.back() == L'\0') sResult.pop_back();
                    return sResult;
#else
                    std::wstring sResult;
                    for (; *pUtf8Str; ++pUtf8Str) {
                        sResult.push_back(static_cast<wchar_t>(*pUtf8Str));
                    }
                    return sResult;
#endif
                }
            };
        }
    }
}

Generated by OpenCppCoverage (Version: 0.9.9.0)