Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/include/internal
diff options
context:
space:
mode:
authorAndy Sawyer2014-09-01 17:35:01 +0100
committerAndy Sawyer2014-09-01 17:38:17 +0100
commitcd2a5aa688be79226f646aeb94f7bd27c39f033f (patch)
tree2a29215218ef8e6408942c5d629960688e501c63 /include/internal
parent142f8f4b1e7f75aadae7df54ffd5f0a384bd70c0 (diff)
downloadcatch3-cd2a5aa688be79226f646aeb94f7bd27c39f033f.tar.gz
catch_tostring: tostring for enum class types
Diffstat (limited to 'include/internal')
-rw-r--r--include/internal/catch_tostring.h36
1 files changed, 33 insertions, 3 deletions
diff --git a/include/internal/catch_tostring.h b/include/internal/catch_tostring.h
index e8e38296..dbb31423 100644
--- a/include/internal/catch_tostring.h
+++ b/include/internal/catch_tostring.h
@@ -22,6 +22,11 @@
#endif
namespace Catch {
+
+// Why we're here.
+template<typename T>
+std::string toString( T const& value );
+
namespace Detail {
// SFINAE is currently disabled by default for all compilers.
@@ -64,10 +69,38 @@ namespace Detail {
#endif
+#if defined(CATCH_CPP11_OR_GREATER)
+ template<typename T,
+ bool IsEmum = std::is_enum<T>::value
+ >
+ struct EnumStringMaker
+ {
+ static std::string convert( T const& ) { return "{?}"; }
+ };
+
+ template<typename T>
+ struct EnumStringMaker<T,true>
+ {
+ static std::string convert( T const& v )
+ {
+ return ::Catch::toString(
+ static_cast<typename std::underlying_type<T>::type>(v)
+ );
+ }
+ };
+#endif
template<bool C>
struct StringMakerBase {
+#if defined(CATCH_CPP11_OR_GREATER)
+ template<typename T>
+ static std::string convert( T const& v )
+ {
+ return EnumStringMaker<T>::convert( v );
+ }
+#else
template<typename T>
static std::string convert( T const& ) { return "{?}"; }
+#endif
};
template<>
@@ -90,9 +123,6 @@ namespace Detail {
} // end namespace Detail
template<typename T>
-std::string toString( T const& value );
-
-template<typename T>
struct StringMaker :
Detail::StringMakerBase<Detail::IsStreamInsertable<T>::value> {};