#pragma once #include "../macro/os_detector.hpp" #include "../macro/stl_detector.hpp" #include #include #include #include namespace yycc::encoding::windows { /// @brief The type of Windows code page. using CodePage = uint32_t; /// @brief The possible error kind occurs in this module. enum class ConvError { TooLargeLength, ///< The length of given string is too large exceeding the maximum capacity of Win32 function. NoDesiredSize, ///< Can not compute the desired size of result string. BadWrittenSize, ///< The size of written data is not matched with expected size. InvalidUtf32, ///< Given char is invalid in UTF32. InvalidUtf16, ///< Given char is invalid in UTF16. EncodeUtf8, ///< Error occurs when encoding UTF8. IncompleteUtf8, ///< Given UTF8 string is incomplete. }; /// @brief The result type in this module. template using ConvResult = std::expected; #if defined(YYCC_OS_WINDOWS) /** * @brief WChar -> Char * @param src * @param code_page * @return */ ConvResult to_char(const std::wstring_view& src, CodePage code_page); /** * @brief Char -> WChar * @param src * @param code_page * @return */ ConvResult to_wchar(const std::string_view& src, CodePage code_page); /** * @brief Char -> Char * @details This is the combination of "WChar -> Char" and "Char -> WChar" * @param src * @param src_code_page * @param dst_code_page * @return */ ConvResult to_char(const std::string_view& src, CodePage src_code_page, CodePage dst_code_page); /** * @brief WChar -> UTF8 * @details This is the specialization of "WChar -> Char" * @param src * @return */ ConvResult to_utf8(const std::wstring_view& src); /** * @brief UTF8 -> WChar * @details This is the specialization of "Char -> WChar" * @param src * @return */ ConvResult to_wchar(const std::u8string_view& src); /** * @brief Char -> UTF8 * @details This is the specialization of "Char -> Char" * @param src * @param code_page * @return */ ConvResult to_utf8(const std::string_view& src, CodePage code_page); /** * @brief UTF8 -> Char * @details This is the specialization of "Char -> Char" * @param src * @param code_page * @return */ ConvResult to_char(const std::u8string_view& src, CodePage code_page); // YYC MARK: // UTF convertion only works on Microsoft STL. // See implementation for more details #if defined(YYCC_STL_MSSTL) /** * @brief UTF8 -> UTF16 * @param src * @return */ ConvResult to_utf16(const std::u8string_view& src); /** * @brief UTF16 -> UTF8 * @param src * @return */ ConvResult to_utf8(const std::u16string_view& src); /** * @brief UTF8 -> UTF32 * @param src * @return */ ConvResult to_utf32(const std::u8string_view& src); /** * @brief UTF32 -> UTF8 * @param src * @return */ ConvResult to_utf8(const std::u32string_view& src); #endif #endif } // namespace yycc::encoding::windows