00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _SK_UTIL_INSPECT_
00009 #define _SK_UTIL_INSPECT_
00010
00011 #include <sk/util/String.h>
00012
00013 #include <sstream>
00014 #include <algorithm>
00015 #include <functional>
00016 #include <iomanip>
00017
00018 namespace sk {
00019 namespace util {
00020 namespace {
00021 struct Converter
00022 : public std::unary_function<char, void>
00023 {
00024 Converter(std::ostream& stream)
00025 : _stream(stream) {}
00026
00027 void operator() (const char& character) {
00028 switch(character) {
00029 case '\r': {
00030 _stream << "\\r";
00031 break;
00032 }
00033 case '\n': {
00034 _stream << "\\n";
00035 break;
00036 }
00037 case '\t': {
00038 _stream << "\\t";
00039 break;
00040 }
00041 case '\b': {
00042 _stream << "\\b";
00043 break;
00044 }
00045 case '\f': {
00046 _stream << "\\f";
00047 break;
00048 }
00049 case '\"': {
00050 _stream << "\\\"";
00051 break;
00052 }
00053 default: {
00054 if(!(character&0x80) && isprint(character)) {
00055 _stream << character;
00056 }
00057 else {
00058 _stream << "\\x" << std::hex << std::setw(2) << std::setfill('0') << std::uppercase;
00059 _stream << (int(character) & 0xff);
00060 }
00061 break;
00062 }
00063 }
00064 }
00065 std::ostream& _stream;
00066 };
00067 }
00068
00069 template<class T>
00070 const sk::util::String inspect(T& container)
00071 {
00072 std::stringstream stream;
00073 std::for_each(container.begin(), container.end(), Converter(stream));
00074
00075 return '"' + stream.str() + '"';
00076 }
00077 }
00078 }
00079
00080 #endif