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