diff options
| author | Phil Nash | 2014-04-22 08:19:11 +0100 |
|---|---|---|
| committer | Phil Nash | 2014-04-22 08:19:11 +0100 |
| commit | 48153e8e1007b661e41ac6eeb8a6e3d255eca63a (patch) | |
| tree | a87b3b859040678b32a80989981e7bd2ea654c2e /include | |
| parent | 878c257de7cbf11b72daccd54d49041a68ac8826 (diff) | |
| download | catch3-48153e8e1007b661e41ac6eeb8a6e3d255eca63a.tar.gz | |
Considers endianness when printing raw memory into a string
Diffstat (limited to 'include')
| -rw-r--r-- | include/internal/catch_tostring.hpp | 27 |
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(); } |