Update libtest.
[m6w6/libmemcached] / libtest / stream.h
index 3ad71b1fddbb528fd4bb4b4b878e06c87b52de0c..9917b94df253ed0ae103e834bf0e0ae26e7f3040 100644 (file)
@@ -1,8 +1,8 @@
 /*  vim:expandtab:shiftwidth=2:tabstop=2:smarttab:
- * 
- *  uTest, libtest
  *
- *  Copyright (C) 2011 Data Differential, http://datadifferential.com/
+ *  Data Differential YATL (i.e. libtest)  library
+ *
+ *  Copyright (C) 2012 Data Differential, http://datadifferential.com/
  *
  *  Redistribution and use in source and binary forms, with or without
  *  modification, are permitted provided that the following conditions are
@@ -48,44 +48,66 @@ namespace stream {
 namespace detail {
 
 template<class Ch, class Tr, class A>
-  class cerr {
-  private:
-
-  public:
-    typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
-
-  public:
-    void operator()(const stream_buffer &s)
-    {
-      std::cerr << std::endl << s.str() << std::endl;
-    }
-  };
-
-template<class Ch, class Tr, class A>
-  class cout {
+  class channel {
   private:
 
   public:
     typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
 
   public:
-    void operator()(const stream_buffer &s)
+    void operator()(const stream_buffer& s, std::ostream& _out,
+                    const char* filename, int line_number, const char* func)
     {
-      std::cout << s.str() << std::endl;
+      if (filename)
+      {
+        _out
+          << filename 
+          << ":" 
+          << line_number 
+          << ": in " 
+          << func << "() "
+          << s.str()
+          << std::endl;
+      }
+      else
+      {
+        _out
+          << s.str()
+          << std::endl;
+      }
     }
   };
 
 template<class Ch, class Tr, class A>
-  class clog {
+  class channelln {
   private:
 
   public:
     typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
 
   public:
-    void operator()(const stream_buffer &s)
+    void operator()(const stream_buffer& s, std::ostream& _out,
+                    const char* filename, int line_number, const char* func)
     {
-      std::cerr << s.str() << std::endl;
+      if (filename)
+      {
+        _out
+          << std::endl
+          << filename 
+          << ":" 
+          << line_number 
+          << ": in " 
+          << func << "() "
+          << s.str()
+          << std::endl;
+      }
+      else
+      {
+        _out
+          << std::endl
+          << s.str()
+          << std::endl;
+      }
     }
   };
 
@@ -93,23 +115,24 @@ template<template <class Ch, class Tr, class A> class OutputPolicy, class Ch = c
   class log {
   private:
     typedef OutputPolicy<Ch, Tr, A> output_policy;
+
+  private:
+    std::ostream& _out;
     const char *_filename;
     int _line_number;
+    const char *_func;
 
   public:
-    log(const char *filename, int line_number) :
+    log(std::ostream& out_arg, const char* filename, int line_number, const char* func) :
+      _out(out_arg),
       _filename(filename),
-      _line_number(line_number)
-    {
-      if (_filename)
-      {
-        arg << _filename << ":" << _line_number << " ";
-      }
-    }
+      _line_number(line_number),
+      _func(func)
+    { }
 
     ~log()
     {
-      output_policy()(arg);
+      output_policy()(arg, _out, _filename, _line_number, _func);
     }
 
   public:
@@ -123,36 +146,39 @@ template<template <class Ch, class Tr, class A> class OutputPolicy, class Ch = c
   private:
     typename output_policy::stream_buffer arg;
   };
-}
+} // namespace detail
 
-class cerr : public detail::log<detail::cerr> {
+class make_cerr : public detail::log<detail::channelln> {
 public:
-  cerr(const char *filename, int line_number) :
-    log(filename, line_number)
-  { }
+  make_cerr(const char* filename, int line_number, const char* func);
 };
 
-class clog : public detail::log<detail::clog> {
+class cerr : public detail::log<detail::channel> {
 public:
-  clog(const char *filename, int line_number) :
-    log(filename, line_number)
-  { }
+  cerr(const char* filename, int line_number, const char* func);
 };
 
-class cout : public detail::log<detail::cout> {
+class clog : public detail::log<detail::channel> {
 public:
-  cout(const char *filename, int line_number) :
-    log(filename, line_number)
-  { }
+  clog(const char* filename, int line_number, const char* func);
+};
+
+class cout : public detail::log<detail::channel> {
+public:
+  cout(const char* filename, int line_number, const char* func);
 };
 
 
 } // namespace stream
 
-#define Error stream::cerr(__FILE__, __LINE__)
+#define Error stream::cerr(__FILE__, __LINE__, __func__)
+
+#define Out stream::cout(NULL, __LINE__, __func__)
+
+#define Outn() stream::cout(NULL, __LINE__, __func__) << " "
 
-#define Out stream::cout(NULL, __LINE__)
+#define Log stream::clog(NULL, __LINE__, __func__)
 
-#define Log stream::clog(NULL, __LINE__)
+#define Logn() stream::clog(NULL, __LINE__, __func__) << " "
 
 } // namespace libtest