/*
	This file is part of solidity.
	solidity is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.
	solidity is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.
	You should have received a copy of the GNU General Public License
	along with solidity.  If not, see .
*/
#pragma once
#include 
#include 
#include 
namespace dev
{
namespace solidity
{
namespace test
{
namespace formatting
{
static constexpr char const* RESET = "\033[0m";
static constexpr char const* RED  = "\033[1;31m";
static constexpr char const* GREEN = "\033[1;32m";
static constexpr char const* YELLOW = "\033[1;33m";
static constexpr char const* CYAN = "\033[1;36m";
static constexpr char const* BOLD = "\033[1m";
static constexpr char const* RED_BACKGROUND  = "\033[48;5;160m";
static constexpr char const* ORANGE_BACKGROUND  = "\033[48;5;166m";
static constexpr char const* INVERSE = "\033[7m";
}
class FormattedScope: boost::noncopyable
{
public:
	/// @arg _formatting List of formatting strings (e.g. colors) defined in the formatting namespace.
	FormattedScope(std::ostream& _stream, bool const _enabled, std::vector const& _formatting):
		m_stream(_stream), m_enabled(_enabled)
	{
		if (m_enabled)
			for (auto const& format: _formatting)
				m_stream << format;
	}
	~FormattedScope() { if (m_enabled) m_stream << formatting::RESET; }
	template
	std::ostream& operator<<(T&& _t) { return m_stream << std::forward(_t); }
private:
	std::ostream& m_stream;
	bool m_enabled;
};
}
}
}