/*
 * 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>

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

}
}
#endif

