diff --git a/include/vsg/io/convert_utf.h b/include/vsg/io/convert_utf.h index 5a58a9f2c6..53ff429340 100644 --- a/include/vsg/io/convert_utf.h +++ b/include/vsg/io/convert_utf.h @@ -27,6 +27,37 @@ namespace vsg inline void convert_utf(const std::string& src, std::string& dst) { dst = src; } inline void convert_utf(const std::wstring& src, std::wstring& dst) { dst = src; } + + #if defined(__cpp_char8_t) + inline void convert_utf(const std::u8string& src, std::u8string& dst) { dst = src; } + inline void convert_utf(const std::wstring& src, std::u8string& dst) { std::string temp_dst; convert_utf(src, temp_dst); dst.assign(temp_dst.begin(), temp_dst.end()); } + inline void convert_utf(const std::u8string& src, std::wstring& dst) { std::string temp_src(src.begin(), src.end()); convert_utf(temp_src, dst); } + + inline void convert_utf(const char8_t c, std::u8string& dst) + { + dst.clear(); + dst.push_back(c); + } + inline void convert_utf(const char8_t c, std::string& dst) + { + dst.clear(); + dst.push_back(c); + } + inline void convert_utf(const char8_t c, std::wstring& dst) + { + dst.clear(); + dst.push_back(static_cast(c)); + } + + template + T convert_utf(const std::u8string& src) + { + T dst; + convert_utf(src, dst); + return dst; + } + #endif + inline void convert_utf(const char c, std::string& dst) { dst.clear(); diff --git a/src/vsg/CMakeLists.txt b/src/vsg/CMakeLists.txt index 753b6156a7..8b515214bb 100644 --- a/src/vsg/CMakeLists.txt +++ b/src/vsg/CMakeLists.txt @@ -411,7 +411,24 @@ ASSIGN_SOURCE_GROUPS("Header Files" "${VSG_SOURCE_DIR}/include/vsg" ${HEADERS}) set_property(TARGET vsg PROPERTY VERSION ${VSG_VERSION_MAJOR}.${VSG_VERSION_MINOR}.${VSG_VERSION_PATCH}) set_property(TARGET vsg PROPERTY SOVERSION ${VSG_SOVERSION}) set_property(TARGET vsg PROPERTY POSITION_INDEPENDENT_CODE ON) -target_compile_features(vsg PUBLIC cxx_std_17) + +# set up the C++ Standard used +if (NOT CMAKE_CXX_STANDARD) + # no CMAKE_CXX_STANDARD explicitly defined so default to 17 + target_compile_features(vsg PUBLIC cxx_std_17) +elseif (${CMAKE_CXX_STANDARD} EQUAL 17) + target_compile_features(vsg PUBLIC cxx_std_17) +elseif (${CMAKE_CXX_STANDARD} EQUAL 20) + target_compile_features(vsg PUBLIC cxx_std_20) # CMake minimum version 3.12 +elseif (${CMAKE_CXX_STANDARD} EQUAL 23) + target_compile_features(vsg PUBLIC cxx_std_23) # CMake minimum version 3.20 +elseif (${CMAKE_CXX_STANDARD} EQUAL 26) + target_compile_features(vsg PUBLIC cxx_std_26) # CMake minimum version 3.30 +else() + message(FATAL_ERROR "Invalid CMAKE_CXX_STANDARD value of " ${CMAKE_CXX_STANDARD} ", supported values are 17, 20 or 23.") +endif() + + if(WIN32) set_property(TARGET vsg PROPERTY RUNTIME_OUTPUT_NAME vsg-${VSG_SOVERSION}) endif()