mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Add StringMaker for std::variant, std::monostate (#1380)
The StringMaker is off by default and can be enabled by a new macro `CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER`, to avoid increasing the footprint of stringification machinery by default.
This commit is contained in:
		 melak47
					melak47
				
			
				
					committed by
					
						 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
			
				
	
			
			
			 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
						parent
						
							a575536abe
						
					
				
				
					commit
					c638c57209
				
			| @@ -163,6 +163,23 @@ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| //////////////////////////////////////////////////////////////////////////////// | ||||
| // Check if variant is available and usable | ||||
| #if defined(__has_include) | ||||
| #  if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) | ||||
| #    if defined(__clang__) && (__clang_major__ < 8) | ||||
|        // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 | ||||
|        // fix should be in clang 8, workaround in libstdc++ 8.2 | ||||
| #      include <ciso646> | ||||
| #      if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) | ||||
| #        define CATCH_CONFIG_NO_CPP17_VARIANT | ||||
| #     else | ||||
| #        define CATCH_INTERNAL_CONFIG_CPP17_VARIANT | ||||
| #      endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) | ||||
| #    endif // defined(__clang__) && (__clang_major__ < 8) | ||||
| #  endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER) | ||||
| #endif // __has_include | ||||
|  | ||||
|  | ||||
| #if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) | ||||
| #   define CATCH_CONFIG_COUNTER | ||||
| @@ -191,6 +208,10 @@ | ||||
| #  define CATCH_CONFIG_CPP17_STRING_VIEW | ||||
| #endif | ||||
|  | ||||
| #if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) | ||||
| #  define CATCH_CONFIG_CPP17_VARIANT | ||||
| #endif | ||||
|  | ||||
| #if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) | ||||
| #  define CATCH_INTERNAL_CONFIG_NEW_CAPTURE | ||||
| #endif | ||||
|   | ||||
| @@ -354,6 +354,7 @@ namespace Catch { | ||||
| #if defined(CATCH_CONFIG_ENABLE_ALL_STRINGMAKERS) | ||||
| #  define CATCH_CONFIG_ENABLE_PAIR_STRINGMAKER | ||||
| #  define CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER | ||||
| #  define CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER | ||||
| #  define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER | ||||
| #endif | ||||
|  | ||||
| @@ -418,6 +419,34 @@ namespace Catch { | ||||
| } | ||||
| #endif // CATCH_CONFIG_ENABLE_TUPLE_STRINGMAKER | ||||
|  | ||||
| #if defined(CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER) && defined(CATCH_CONFIG_CPP17_VARIANT) | ||||
| #include <variant> | ||||
| namespace Catch { | ||||
|     template<> | ||||
|     struct StringMaker<std::monostate> { | ||||
|         static std::string convert(const std::monostate&) { | ||||
|             return "{ }"; | ||||
|         } | ||||
|     }; | ||||
|  | ||||
|     template<typename... Elements> | ||||
|     struct StringMaker<std::variant<Elements...>> { | ||||
|         static std::string convert(const std::variant<Elements...>& variant) { | ||||
|             if (variant.valueless_by_exception()) { | ||||
|                 return "{valueless variant}"; | ||||
|             } else { | ||||
|                 return std::visit( | ||||
|                     [](const auto& value) { | ||||
|                         return ::Catch::Detail::stringify(value); | ||||
|                     }, | ||||
|                     variant | ||||
|                 ); | ||||
|             } | ||||
|         } | ||||
|     }; | ||||
| } | ||||
| #endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER | ||||
|  | ||||
| namespace Catch { | ||||
|     struct not_this_one {}; // Tag type for detecting which begin/ end are being selected | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user