diff options
| author | Phil Nash | 2018-01-04 10:21:52 +0000 |
|---|---|---|
| committer | Phil Nash | 2018-01-04 10:21:52 +0000 |
| commit | 32eb90b9bdaf45bb1d76ca8bc4efaa3aeaf9a134 (patch) | |
| tree | 56575c4e1199eca7cf0a7062c4c2368e7d61538a /include | |
| parent | 702cfdaf6e3e79f4485190d7f3b4beb2d12ac854 (diff) | |
| download | catch3-32eb90b9bdaf45bb1d76ca8bc4efaa3aeaf9a134.tar.gz | |
Fix stringifying of unknown enums
Diffstat (limited to 'include')
| -rw-r--r-- | include/internal/catch_tostring.h | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/include/internal/catch_tostring.h b/include/internal/catch_tostring.h index 2e7091ad..5ca019fc 100644 --- a/include/internal/catch_tostring.h +++ b/include/internal/catch_tostring.h @@ -57,25 +57,38 @@ namespace Catch { static const bool value = decltype(test<std::ostream, const T&>(0))::value; }; + template<typename E> + std::string convertUnknownEnumToString( E e ); + + template<typename T> + typename std::enable_if<!std::is_enum<T>::value, std::string>::type convertUnstreamable( T const& ) { + return Detail::unprintableString; + }; + template<typename T> + typename std::enable_if<std::is_enum<T>::value, std::string>::type convertUnstreamable( T const& value ) { + return convertUnknownEnumToString( value ); + }; + } // namespace Detail + // If we decide for C++14, change these to enable_if_ts template <typename T, typename = void> struct StringMaker { template <typename Fake = T> static typename std::enable_if<::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type - convert(const Fake& t) { + convert(const Fake& value) { ReusableStringStream rss; - rss << t; + rss << value; return rss.str(); } template <typename Fake = T> static typename std::enable_if<!::Catch::Detail::IsStreamInsertable<Fake>::value, std::string>::type - convert(const Fake&) { - return Detail::unprintableString; + convert( const Fake& value ) { + return Detail::convertUnstreamable( value ); } }; @@ -88,8 +101,12 @@ namespace Catch { return ::Catch::StringMaker<typename std::remove_cv<typename std::remove_reference<T>::type>::type>::convert(e); } - } // namespace Detail + template<typename E> + std::string convertUnknownEnumToString( E e ) { + return ::Catch::Detail::stringify(static_cast<typename std::underlying_type<E>::type>(e)); + } + } // namespace Detail // Some predefined specializations @@ -233,13 +250,6 @@ namespace Catch { } } - template<typename T> - struct EnumStringMaker { - static std::string convert(const T& t) { - return ::Catch::Detail::stringify(static_cast<typename std::underlying_type<T>::type>(t)); - } - }; - #ifdef __OBJC__ template<> struct StringMaker<NSString*> { |