GrabBag/VrUtils/log4cpp/include/log4cpp/CategoryStream.hh
2025-07-23 01:35:14 +08:00

147 lines
4.2 KiB
C++

/*
* CategoryStream.hh
*
* Copyright 2001, LifeLine Networks BV (www.lifeline.nl). All rights reserved.
* Copyright 2001, Bastiaan Bakker. All rights reserved.
*
* See the COPYING file for the terms of usage and distribution.
*/
#ifndef _LOG4CPP_CATEGORYSTREAM_HH
#define _LOG4CPP_CATEGORYSTREAM_HH
#include <log4cpp/Portability.hh>
#include <log4cpp/Priority.hh>
#include <ios>
#ifdef LOG4CPP_HAVE_SSTREAM
#include <sstream>
#endif
#include <log4cpp/Manipulator.hh>
namespace log4cpp {
class LOG4CPP_EXPORT Category;
class LOG4CPP_EXPORT CategoryStream;
/**
* eol manipulator
**/
LOG4CPP_EXPORT CategoryStream& eol (CategoryStream& os);
/**
* left manipulator
**/
LOG4CPP_EXPORT CategoryStream& left (CategoryStream& os);
/**
* This class enables streaming simple types and objects to a category.
* Use category.errorStream(), etc. to obtain a CategoryStream class.
**/
class LOG4CPP_EXPORT CategoryStream {
public:
/**
* Construct a CategoryStream for given Category with given priority.
* @param category The category this stream will send log messages to.
* @param priority The priority the log messages will get or
* Priority::NOTSET to silently discard any streamed in messages.
**/
CategoryStream(Category& category, Priority::Value priority);
/**
* Destructor for CategoryStream
**/
~CategoryStream();
/**
* Returns the destination Category for this stream.
* @returns The Category.
**/
inline Category& getCategory() const { return _category; };
/**
* Returns the priority for this stream.
* @returns The priority.
**/
inline Priority::Value getPriority() const throw() {
return _priority;
};
/**
* Flush the contents of the stream buffer to the Category and
* empties the buffer.
**/
void flush();
/**
* Stream in arbitrary types and objects.
* @param t The value or object to stream in.
* @returns A reference to itself.
**/
template<typename T>
CategoryStream& operator<<(const T& t) {
if (getPriority() != Priority::NOTSET) {
if (!_buffer) {
if (!(_buffer = new std::ostringstream)) {
// XXX help help help
}
}
(*_buffer) << t;
}
return *this;
}
CategoryStream& operator<<(const char* t);
template<typename T>
CategoryStream& operator<<(const std::string& t) {
if (getPriority() != Priority::NOTSET) {
if (!_buffer) {
if (!(_buffer = new std::ostringstream)) {
// XXX help help help
}
}
(*_buffer) << t;
}
return *this;
}
#if LOG4CPP_HAS_WCHAR_T != 0
template<typename T>
CategoryStream& operator<<(const std::wstring& t) {
if (getPriority() != Priority::NOTSET) {
if (!_wbuffer) {
if (!(_wbuffer = new std::wostringstream)) {
// XXX help help help
}
}
(*_wbuffer) << t;
}
return *this;
}
#endif
/**
* Set the width output on CategoryStream
**/
std::streamsize width(std::streamsize wide );
private:
Category& _category;
Priority::Value _priority;
union {
std::ostringstream* _buffer;
#if LOG4CPP_HAS_WCHAR_T != 0
std::wostringstream* _wbuffer;
#endif
};
public:
typedef CategoryStream& (*cspf) (CategoryStream&);
CategoryStream& operator << (cspf);
LOG4CPP_EXPORT friend CategoryStream& eol (CategoryStream& os);
LOG4CPP_EXPORT friend CategoryStream& left (CategoryStream& os);
};
}
#endif // _LOG4CPP_CATEGORYSTREAM_HH