blob: 8b226ff0bcab322185473b6d8177b9c1c35468ca [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _LOG4CXX_MESSAGE_BUFFER_H
#define _LOG4CXX_MESSAGE_BUFFER_H
#include <log4cxx/log4cxx.h>
#include <log4cxx/logstring.h>
#include <sstream>
#if defined(_MSC_VER)
#pragma warning ( push )
#pragma warning ( disable: 4251 4275 )
#endif
namespace log4cxx
{
namespace helpers
{
void MessageBufferUseStaticStream();
typedef std::ios_base& (*ios_base_manip)(std::ios_base&);
/**
* This class is used by the LOG4CXX_INFO and similar
* macros to support insertion operators in the message parameter.
* The class is not intended for use outside of that context.
*/
class LOG4CXX_EXPORT CharMessageBuffer
{
public:
/**
* Creates a new instance.
*/
CharMessageBuffer();
/**
* Destructor.
*/
~CharMessageBuffer();
/**
* Appends string to buffer.
* @param msg string append.
* @return this buffer.
*/
CharMessageBuffer& operator<<(const std::basic_string<char>& msg);
/**
* Appends string to buffer.
* @param msg string to append.
* @return this buffer.
*/
CharMessageBuffer& operator<<(const char* msg);
/**
* Appends string to buffer.
* @param msg string to append.
* @return this buffer.
*/
CharMessageBuffer& operator<<(char* msg);
/**
* Appends character to buffer.
* @param msg character to append.
* @return this buffer.
*/
CharMessageBuffer& operator<<(const char msg);
/**
* Insertion operator for STL manipulators such as std::fixed.
* @param manip manipulator.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(ios_base_manip manip);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(bool val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(short val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(unsigned int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(unsigned long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(float val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(long double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(void* val);
/**
* Cast to ostream.
*/
operator std::basic_ostream<char>& ();
/**
* Get content of buffer.
* @param os used only to signal that
* the embedded stream was used.
*/
const std::basic_string<char>& str(std::basic_ostream<char>& os);
/**
* Get content of buffer.
* @param buf used only to signal that
* the embedded stream was not used.
*/
const std::basic_string<char>& str(CharMessageBuffer& buf);
/**
* Returns true if buffer has an encapsulated STL stream.
* @return true if STL stream was created.
*/
bool hasStream() const;
private:
/**
* Prevent use of default copy constructor.
*/
CharMessageBuffer(const CharMessageBuffer&);
/**
* Prevent use of default assignment operator.
*/
CharMessageBuffer& operator=(const CharMessageBuffer&);
/**
* Encapsulated std::string.
*/
std::basic_string<char> buf;
/**
* Encapsulated stream, created on demand.
*/
std::basic_ostringstream<char>* stream;
};
template<class V>
std::basic_ostream<char>& operator<<(CharMessageBuffer& os, const V& val)
{
return ((std::basic_ostream<char>&) os) << val;
}
#if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API || LOG4CXX_LOGCHAR_IS_UNICHAR
/**
* This class is designed to support insertion operations
* in the message argument to the LOG4CXX_INFO and similar
* macros and is not designed for general purpose use.
*/
class LOG4CXX_EXPORT UniCharMessageBuffer
{
public:
/**
* Creates a new instance.
*/
UniCharMessageBuffer();
/**
* Destructor.
*/
~UniCharMessageBuffer();
typedef std::basic_ostream<UniChar> uostream;
/**
* Appends string to buffer.
* @param msg string append.
* @return this buffer.
*/
UniCharMessageBuffer& operator<<(const std::basic_string<UniChar>& msg);
/**
* Appends string to buffer.
* @param msg string to append.
* @return this buffer.
*/
UniCharMessageBuffer& operator<<(const UniChar* msg);
/**
* Appends string to buffer.
* @param msg string to append.
* @return this buffer.
*/
UniCharMessageBuffer& operator<<(UniChar* msg);
/**
* Appends character to buffer.
* @param msg character to append.
* @return this buffer.
*/
UniCharMessageBuffer& operator<<(const UniChar msg);
#if LOG4CXX_CFSTRING_API
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
UniCharMessageBuffer& operator<<(const CFStringRef& msg);
#endif
/**
* Insertion operator for STL manipulators such as std::fixed.
* @param manip manipulator.
* @return encapsulated STL stream.
*/
uostream& operator<<(ios_base_manip manip);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(bool val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(short val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(unsigned int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(unsigned long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(float val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(long double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
uostream& operator<<(void* val);
/**
* Cast to ostream.
*/
operator uostream& ();
/**
* Get content of buffer.
* @param os used only to signal that
* the embedded stream was used.
*/
const std::basic_string<UniChar>& str(uostream& os);
/**
* Get content of buffer.
* @param buf used only to signal that
* the embedded stream was not used.
*/
const std::basic_string<UniChar>& str(UniCharMessageBuffer& buf);
/**
* Returns true if buffer has an encapsulated STL stream.
* @return true if STL stream was created.
*/
bool hasStream() const;
private:
/**
* Prevent use of default copy constructor.
*/
UniCharMessageBuffer(const UniCharMessageBuffer&);
/**
* Prevent use of default assignment operator.
*/
UniCharMessageBuffer& operator=(const UniCharMessageBuffer&);
/**
* Encapsulated std::string.
*/
std::basic_string<UniChar> buf;
/**
* Encapsulated stream, created on demand.
*/
std::basic_ostringstream<UniChar>* stream;
};
template<class V>
UniCharMessageBuffer::uostream& operator<<(UniCharMessageBuffer& os, const V& val)
{
return ((UniCharMessageBuffer::uostream&) os) << val;
}
#endif
#if LOG4CXX_WCHAR_T_API
/**
* This class is designed to support insertion operations
* in the message argument to the LOG4CXX_INFO and similar
* macros and is not designed for general purpose use.
*/
class LOG4CXX_EXPORT WideMessageBuffer
{
public:
/**
* Creates a new instance.
*/
WideMessageBuffer();
/**
* Destructor.
*/
~WideMessageBuffer();
/**
* Appends string to buffer.
* @param msg string append.
* @return this buffer.
*/
WideMessageBuffer& operator<<(const std::basic_string<wchar_t>& msg);
/**
* Appends string to buffer.
* @param msg string to append.
* @return this buffer.
*/
WideMessageBuffer& operator<<(const wchar_t* msg);
/**
* Appends string to buffer.
* @param msg string to append.
* @return this buffer.
*/
WideMessageBuffer& operator<<(wchar_t* msg);
/**
* Appends character to buffer.
* @param msg character to append.
* @return this buffer.
*/
WideMessageBuffer& operator<<(const wchar_t msg);
/**
* Insertion operator for STL manipulators such as std::fixed.
* @param manip manipulator.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(ios_base_manip manip);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(bool val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(short val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(unsigned int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(unsigned long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(float val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(long double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::basic_ostream<wchar_t>& operator<<(void* val);
/**
* Cast to ostream.
*/
operator std::basic_ostream<wchar_t>& ();
/**
* Get content of buffer.
* @param os used only to signal that
* the embedded stream was used.
*/
const std::basic_string<wchar_t>& str(std::basic_ostream<wchar_t>& os);
/**
* Get content of buffer.
* @param buf used only to signal that
* the embedded stream was not used.
*/
const std::basic_string<wchar_t>& str(WideMessageBuffer& buf);
/**
* Returns true if buffer has an encapsulated STL stream.
* @return true if STL stream was created.
*/
bool hasStream() const;
private:
/**
* Prevent use of default copy constructor.
*/
WideMessageBuffer(const WideMessageBuffer&);
/**
* Prevent use of default assignment operator.
*/
WideMessageBuffer& operator=(const WideMessageBuffer&);
/**
* Encapsulated std::string.
*/
std::basic_string<wchar_t> buf;
/**
* Encapsulated stream, created on demand.
*/
std::basic_ostringstream<wchar_t>* stream;
};
template<class V>
std::basic_ostream<wchar_t>& operator<<(WideMessageBuffer& os, const V& val)
{
return ((std::basic_ostream<wchar_t>&) os) << val;
}
/**
* This class is used by the LOG4CXX_INFO and similar
* macros to support insertion operators in the message parameter.
* The class is not intended for use outside of that context.
*/
class LOG4CXX_EXPORT MessageBuffer
{
public:
/**
* Creates a new instance.
*/
MessageBuffer();
/**
* Destructor.
*/
~MessageBuffer();
/**
* Cast to ostream.
*/
operator std::ostream& ();
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
CharMessageBuffer& operator<<(const std::string& msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
CharMessageBuffer& operator<<(const char* msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
CharMessageBuffer& operator<<(char* msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
CharMessageBuffer& operator<<(const char msg);
/**
* Get content of buffer.
* @param buf used only to signal
* the character type and that
* the embedded stream was not used.
*/
const std::string& str(CharMessageBuffer& buf);
/**
* Get content of buffer.
* @param os used only to signal
* the character type and that
* the embedded stream was used.
*/
const std::string& str(std::ostream& os);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
WideMessageBuffer& operator<<(const std::wstring& msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
WideMessageBuffer& operator<<(const wchar_t* msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
WideMessageBuffer& operator<<(wchar_t* msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
WideMessageBuffer& operator<<(const wchar_t msg);
#if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
UniCharMessageBuffer& operator<<(const std::basic_string<UniChar>& msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
UniCharMessageBuffer& operator<<(const UniChar* msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
UniCharMessageBuffer& operator<<(UniChar* msg);
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
UniCharMessageBuffer& operator<<(const UniChar msg);
#endif
#if LOG4CXX_CFSTRING_API
/**
* Appends a string into the buffer and
* fixes the buffer to use char characters.
* @param msg message to append.
* @return encapsulated CharMessageBuffer.
*/
UniCharMessageBuffer& operator<<(const CFStringRef& msg);
#endif
/**
* Insertion operator for STL manipulators such as std::fixed.
* @param manip manipulator.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(ios_base_manip manip);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(bool val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(short val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(unsigned int val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(unsigned long val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(float val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(long double val);
/**
* Insertion operator for built-in type.
* @param val build in type.
* @return encapsulated STL stream.
*/
std::ostream& operator<<(void* val);
/**
* Get content of buffer.
* @param buf used only to signal
* the character type and that
* the embedded stream was not used.
*/
const std::wstring& str(WideMessageBuffer& buf);
/**
* Get content of buffer.
* @param os used only to signal
* the character type and that
* the embedded stream was used.
*/
const std::wstring& str(std::basic_ostream<wchar_t>& os);
#if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API
/**
* Get content of buffer.
* @param buf used only to signal
* the character type and that
* the embedded stream was not used.
*/
const std::basic_string<UniChar>& str(UniCharMessageBuffer& buf);
/**
* Get content of buffer.
* @param os used only to signal
* the character type and that
* the embedded stream was used.
*/
const std::basic_string<UniChar>& str(UniCharMessageBuffer::uostream& os);
#endif
/**
* Returns true if buffer has an encapsulated STL stream.
* @return true if STL stream was created.
*/
bool hasStream() const;
private:
/**
* Prevent use of default copy constructor.
*/
MessageBuffer(const MessageBuffer&);
/**
* Prevent use of default assignment operator.
*/
MessageBuffer& operator=(const MessageBuffer&);
/**
* Character message buffer.
*/
CharMessageBuffer cbuf;
/**
* Encapsulated wide message buffer, created on demand.
*/
WideMessageBuffer* wbuf;
#if LOG4CXX_UNICHAR_API || LOG4CXX_CFSTRING_API
/**
* Encapsulated wide message buffer, created on demand.
*/
UniCharMessageBuffer* ubuf;
#endif
};
template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& val)
{
return ((std::ostream&) os) << val;
}
#if LOG4CXX_LOGCHAR_IS_UTF8
typedef CharMessageBuffer LogCharMessageBuffer;
#endif
#if LOG4CXX_LOGCHAR_IS_WCHAR
typedef WideMessageBuffer LogCharMessageBuffer;
#endif
#if LOG4CXX_LOGCHAR_IS_UNICHAR
typedef UniCharMessageBuffer LogCharMessageBuffer;
#endif
#else
typedef CharMessageBuffer MessageBuffer;
typedef CharMessageBuffer LogCharMessageBuffer;
#endif
}
}
#if defined(_MSC_VER)
#pragma warning (pop)
#endif
#endif