libtest: improve output format; makes eyes hurt less
[awesomized/libmemcached] / libtest / stream.h
index dea371b94a51de4ada4296802b21d374e9c10e28..0124b9d256d0242f2c9fb6038771b2c19e18ad22 100644 (file)
@@ -111,6 +111,37 @@ template<class Ch, class Tr, class A>
     }
   };
 
+template<class Ch, class Tr, class A>
+  class channelfl {
+  private:
+
+  public:
+    typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
+
+  public:
+    void operator()(const stream_buffer& s, std::ostream& _out,
+                    const char* filename, int line_number, const char* func)
+    {
+      if (filename)
+      {
+        _out
+          << filename
+          << ":"
+          << line_number
+          << ": in "
+          << func << "() "
+          << s.str()
+          << std::flush;
+      }
+      else
+      {
+        _out
+          << s.str()
+          << std::flush;
+      }
+    }
+  };
+
 template<template <class Ch, class Tr, class A> class OutputPolicy, class Ch = char, class Tr = std::char_traits<Ch>, class A = std::allocator<Ch> >
   class log {
   private:
@@ -130,7 +161,7 @@ template<template <class Ch, class Tr, class A> class OutputPolicy, class Ch = c
       _func(func)
     { }
 
-    ~log()
+    virtual ~log()
     {
       output_policy()(arg, _out, _filename, _line_number, _func);
     }
@@ -145,6 +176,10 @@ template<template <class Ch, class Tr, class A> class OutputPolicy, class Ch = c
 
   private:
     typename output_policy::stream_buffer arg;
+
+  private:
+    log( const log& );
+    const log& operator=( const log& );
   };
 } // namespace detail
 
@@ -154,6 +189,9 @@ public:
     detail::log<detail::channelln>(std::cerr, filename, line_number, func)
   { }
 
+private:
+  make_cerr( const make_cerr& );
+  const make_cerr& operator=( const make_cerr& );
 };
 
 class cerr : public detail::log<detail::channel> {
@@ -162,6 +200,9 @@ public:
     detail::log<detail::channel>(std::cout, filename, line_number, func)
   { }
 
+private:
+  cerr( const cerr& );
+  const cerr& operator=( const cerr& );
 };
 
 class clog : public detail::log<detail::channel> {
@@ -169,6 +210,10 @@ public:
   clog(const char* filename, int line_number, const char* func) :
     detail::log<detail::channel>(std::clog, filename, line_number, func)
   { }
+
+private:
+  clog( const clog& );
+  const clog& operator=( const clog& );
 };
 
 class make_cout : public detail::log<detail::channelln> {
@@ -177,6 +222,9 @@ public:
     detail::log<detail::channelln>(std::cout, filename, line_number, func)
   { }
 
+private:
+  make_cout( const make_cout& );
+  const make_cout& operator=( const make_cout& );
 };
 
 class cout : public detail::log<detail::channel> {
@@ -184,13 +232,29 @@ public:
   cout(const char* filename, int line_number, const char* func) :
     detail::log<detail::channel>(std::cout, filename, line_number, func)
   { }
+
+private:
+  cout( const cout& );
+  const cout& operator=( const cout& );
 };
 
+class cecho : public detail::log<detail::channelfl> {
+public:
+  cecho(const char* filename, int line_number, const char* func) :
+    detail::log<detail::channelfl>(std::cout, filename, line_number, func)
+  { }
+
+private:
+  cecho( const cecho& );
+  const cecho& operator=( const cecho& );
+};
 
 } // namespace stream
 
 #define Error stream::cerr(__FILE__, __LINE__, __func__)
 
+#define Echo stream::cecho(NULL, __LINE__, __func__)
+
 #define Out stream::cout(NULL, __LINE__, __func__)
 
 #define Outn() stream::cout(NULL, __LINE__, __func__) << " "