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

summaryrefslogtreecommitdiffhomepage
path: root/include/internal
diff options
context:
space:
mode:
authorPhil Nash2014-04-22 08:19:11 +0100
committerPhil Nash2014-04-22 08:19:11 +0100
commit48153e8e1007b661e41ac6eeb8a6e3d255eca63a (patch)
treea87b3b859040678b32a80989981e7bd2ea654c2e /include/internal
parent878c257de7cbf11b72daccd54d49041a68ac8826 (diff)
downloadcatch3-48153e8e1007b661e41ac6eeb8a6e3d255eca63a.tar.gz
Considers endianness when printing raw memory into a string
Diffstat (limited to 'include/internal')
-rw-r--r--include/internal/catch_tostring.hpp27
1 files changed, 23 insertions, 4 deletions
diff --git a/include/internal/catch_tostring.hpp b/include/internal/catch_tostring.hpp
index c081e944..788850ff 100644
--- a/include/internal/catch_tostring.hpp
+++ b/include/internal/catch_tostring.hpp
@@ -79,8 +79,21 @@ namespace Detail {
}
};
- // For display purposes only.
- // Does not consider endian-ness
+ struct Endianness {
+ enum Arch { Big, Little };
+
+ static Arch which() {
+ union {
+ int asInt;
+ char asChar[sizeof (int)];
+ };
+
+ asInt = 1;
+ return ( asChar[sizeof(int)-1] == 1 ) ? Big : Little;
+ }
+ };
+
+ // Writes the raw memory into a string, considering endianness
template<typename T>
std::string rawMemoryToString( T value ) {
union {
@@ -92,8 +105,14 @@ namespace Detail {
std::ostringstream oss;
oss << "0x";
- for( unsigned char* cp = bytes; cp < bytes+sizeof(T); ++cp )
- oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)*cp;
+
+ int i = 0, end = sizeof(T), inc = 1;
+ if( Endianness::which() == Endianness::Little ) {
+ i = end-1;
+ end = inc = -1;
+ }
+ for( ; i != end; i += inc )
+ oss << std::hex << std::setw(2) << std::setfill('0') << (unsigned int)bytes[i];
return oss.str();
}