libmoost
|
00001 /* vim:set ts=3 sw=3 sts=3 et: */ 00028 #ifndef MOOST_UTILS_STRINGIFY_HPP__ 00029 #define MOOST_UTILS_STRINGIFY_HPP__ 00030 00031 #include <map> 00032 #include <set> 00033 #include <vector> 00034 #include <ostream> 00035 #include <string> 00036 00037 #include <boost/lexical_cast.hpp> 00038 00039 #include "foreach.hpp" 00040 00041 // TODO: overload for google:: thingies, std::list 00042 00043 namespace moost { namespace utils { 00044 00045 template <class T> 00046 std::string stringify(const T& val, size_t truncate = 0); 00047 00048 template <class T> 00049 void streamstringify(std::ostream& os, const T& val, size_t = 0); 00050 00051 template <class T1, class T2> 00052 void streamstringify(std::ostream& os, const std::pair<T1, T2>& val, size_t truncate = 0); 00053 00054 template <class T> 00055 void streamstringify(std::ostream& os, const std::set<T>& val, size_t truncate = 0); 00056 00057 template <class T> 00058 void streamstringify(std::ostream& os, const std::vector<T>& val, size_t truncate = 0); 00059 00060 template <class T1, class T2> 00061 void streamstringify(std::ostream& os, const std::map<T1, T2>& val, size_t truncate = 0); 00062 00072 template <class T> 00073 std::string stringify(const T& val, size_t truncate) 00074 { 00075 std::ostringstream oss; 00076 streamstringify(oss, val, truncate); 00077 return oss.str(); 00078 } 00079 00080 template <class T> 00081 void streamstringify(std::ostream& os, const T& val, size_t) 00082 { 00083 os << val; 00084 } 00085 00086 template <class T1, class T2> 00087 void streamstringify(std::ostream& os, const std::pair<T1, T2>& val, size_t truncate) 00088 { 00089 os << "("; 00090 streamstringify(os, val.first, truncate); 00091 os << ", "; 00092 streamstringify(os, val.second, truncate); 00093 os << ")"; 00094 } 00095 00096 template <class T> 00097 void streamstringify(std::ostream& os, const std::set<T>& val, size_t truncate) 00098 { 00099 size_t count = 0; 00100 os << "("; 00101 foreach (const T& v, val) 00102 { 00103 if (count) 00104 os << ", "; 00105 streamstringify(os, v, truncate); 00106 if (++count == truncate && count < val.size()) 00107 { 00108 os << ", <+" << val.size() - count << ">"; 00109 break; 00110 } 00111 } 00112 os << ")"; 00113 } 00114 00115 template <class T> 00116 void streamstringify(std::ostream& os, const std::vector<T>& val, size_t truncate) 00117 { 00118 size_t count = 0; 00119 os << "["; 00120 foreach (const T& v, val) 00121 { 00122 if (count) 00123 os << ", "; 00124 streamstringify(os, v, truncate); 00125 if (++count == truncate && count < val.size()) 00126 { 00127 os << ", <+" << val.size() - count << ">"; 00128 break; 00129 } 00130 } 00131 os << "]"; 00132 } 00133 00134 template <class T1, class T2> 00135 void streamstringify(std::ostream& os, const std::map<T1, T2>& val, size_t truncate) 00136 { 00137 typedef typename std::map<T1, T2>::value_type type_pair; 00138 size_t count = 0; 00139 os << "{"; 00140 foreach (const type_pair& p, val) 00141 { 00142 if (count) 00143 os << ", "; 00144 streamstringify(os, p, truncate); 00145 if (++count == truncate && count < val.size()) 00146 { 00147 os << ", <+" << val.size() - count << ">"; 00148 break; 00149 } 00150 } 00151 os << "}"; 00152 } 00153 00154 }} 00155 00156 #endif