Skip to content

Commit 973e33b

Browse files
Merge pull request #1645 from vsg-dev/char8_t_Support
Added support for compiling against C++ 17, 20, 23 and 26 using the CMAKE_CXX_STANDARD CMake variable.
2 parents 05bb15b + 96c388a commit 973e33b

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

include/vsg/io/convert_utf.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,37 @@ namespace vsg
2727

2828
inline void convert_utf(const std::string& src, std::string& dst) { dst = src; }
2929
inline void convert_utf(const std::wstring& src, std::wstring& dst) { dst = src; }
30+
31+
#if defined(__cpp_char8_t)
32+
inline void convert_utf(const std::u8string& src, std::u8string& dst) { dst = src; }
33+
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()); }
34+
inline void convert_utf(const std::u8string& src, std::wstring& dst) { std::string temp_src(src.begin(), src.end()); convert_utf(temp_src, dst); }
35+
36+
inline void convert_utf(const char8_t c, std::u8string& dst)
37+
{
38+
dst.clear();
39+
dst.push_back(c);
40+
}
41+
inline void convert_utf(const char8_t c, std::string& dst)
42+
{
43+
dst.clear();
44+
dst.push_back(c);
45+
}
46+
inline void convert_utf(const char8_t c, std::wstring& dst)
47+
{
48+
dst.clear();
49+
dst.push_back(static_cast<wchar_t>(c));
50+
}
51+
52+
template<typename T>
53+
T convert_utf(const std::u8string& src)
54+
{
55+
T dst;
56+
convert_utf(src, dst);
57+
return dst;
58+
}
59+
#endif
60+
3061
inline void convert_utf(const char c, std::string& dst)
3162
{
3263
dst.clear();

src/vsg/CMakeLists.txt

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,24 @@ ASSIGN_SOURCE_GROUPS("Header Files" "${VSG_SOURCE_DIR}/include/vsg" ${HEADERS})
411411
set_property(TARGET vsg PROPERTY VERSION ${VSG_VERSION_MAJOR}.${VSG_VERSION_MINOR}.${VSG_VERSION_PATCH})
412412
set_property(TARGET vsg PROPERTY SOVERSION ${VSG_SOVERSION})
413413
set_property(TARGET vsg PROPERTY POSITION_INDEPENDENT_CODE ON)
414-
target_compile_features(vsg PUBLIC cxx_std_17)
414+
415+
# set up the C++ Standard used
416+
if (NOT CMAKE_CXX_STANDARD)
417+
# no CMAKE_CXX_STANDARD explicitly defined so default to 17
418+
target_compile_features(vsg PUBLIC cxx_std_17)
419+
elseif (${CMAKE_CXX_STANDARD} EQUAL 17)
420+
target_compile_features(vsg PUBLIC cxx_std_17)
421+
elseif (${CMAKE_CXX_STANDARD} EQUAL 20)
422+
target_compile_features(vsg PUBLIC cxx_std_20) # CMake minimum version 3.12
423+
elseif (${CMAKE_CXX_STANDARD} EQUAL 23)
424+
target_compile_features(vsg PUBLIC cxx_std_23) # CMake minimum version 3.20
425+
elseif (${CMAKE_CXX_STANDARD} EQUAL 26)
426+
target_compile_features(vsg PUBLIC cxx_std_26) # CMake minimum version 3.30
427+
else()
428+
message(FATAL_ERROR "Invalid CMAKE_CXX_STANDARD value of " ${CMAKE_CXX_STANDARD} ", supported values are 17, 20 or 23.")
429+
endif()
430+
431+
415432
if(WIN32)
416433
set_property(TARGET vsg PROPERTY RUNTIME_OUTPUT_NAME vsg-${VSG_SOVERSION})
417434
endif()

0 commit comments

Comments
 (0)