libmoost
/home/mhx/git/github/libmoost/include/moost/utils/stringify.hpp
Go to the documentation of this file.
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