#ifndef LOG_H__
#define LOG_H__

#include <iostream>
#include <sstream>
#include "Queue.h"

struct LogMsg
{
	std::stringstream s;
	std::ostream& output;	

	LogMsg (std::ostream& o = std::cout): output (o) {};
	
	void Process () 
	{
		output << s.str ();
	}
};

extern i2p::util::MsgQueue<LogMsg> g_Log;

template<typename TValue>
void LogPrint (std::stringstream& s, TValue arg) 
{
	s << arg;
}
 
template<typename TValue, typename... TArgs>
void LogPrint (std::stringstream& s, TValue arg, TArgs... args) 
{
	LogPrint (s, arg);
	LogPrint (s, args...);
}

template<typename... TArgs>
void LogPrint (TArgs... args) 
{
	LogMsg * msg = new LogMsg ();
	LogPrint (msg->s, args...);
	msg->s << std::endl;
	g_Log.Put (msg);
}	

#endif