class cerr {
private:
+ public:
+ typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
+
+ public:
+ void operator()(const stream_buffer &s)
+ {
+ std::cerr << s.str() << std::endl;
+ }
+ };
+
+template<class Ch, class Tr, class A>
+ class make_cerr {
+ private:
+
public:
typedef std::basic_ostringstream<Ch, Tr, A> stream_buffer;
public:
void operator()(const stream_buffer &s)
{
- std::cerr << s.str() << std::endl;
+ std::cerr<< s.str() << std::endl;
}
};
typedef OutputPolicy<Ch, Tr, A> output_policy;
const char *_filename;
int _line_number;
+ const char *_func;
public:
- log(const char *filename, int line_number) :
- _filename(filename),
- _line_number(line_number)
+ log() :
+ _filename(NULL),
+ _line_number(0)
+ { }
+
+ void set_filename(const char *filename, int line_number, const char *func)
{
- if (_filename)
- {
- arg << _filename << ":" << _line_number << " ";
- }
+ _filename= filename;
+ _line_number= line_number;
+ _func= func;
}
~log()
template<class T>
log &operator<<(const T &x)
{
+ if (_filename)
+ {
+ arg << _filename << ":" << _line_number << ": in " << _func << "() ";
+ _filename= NULL;
+ }
arg << x;
return *this;
}
};
}
+class make_cerr : public detail::log<detail::make_cerr> {
+public:
+ make_cerr(const char *filename, int line_number, const char *func)
+ {
+ set_filename(filename, line_number, func);
+ }
+};
+
class cerr : public detail::log<detail::cerr> {
public:
- cerr(const char *filename, int line_number) :
- log(filename, line_number)
- { }
+ cerr(const char *filename, int line_number, const char *func)
+ {
+ set_filename(filename, line_number, func);
+ }
};
class clog : public detail::log<detail::clog> {
public:
- clog(const char *filename, int line_number) :
- log(filename, line_number)
+ clog(const char *, int, const char*)
{ }
};
class cout : public detail::log<detail::cout> {
public:
- cout(const char *filename, int line_number) :
- log(filename, line_number)
+ cout(const char *, int, const char *)
{ }
};
} // 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