aboutsummaryrefslogtreecommitdiffstats
path: root/test/libsolidity/FormattedScope.h
blob: 78560848e8d9780f1356d2c971dfaf9eb7e1e3f6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
    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 <http://www.gnu.org/licenses/>.
*/

#pragma once

#include <boost/noncopyable.hpp>

#include <ostream>
#include <vector>

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* 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<char const*> 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<typename T>
    std::ostream& operator<<(T&& _t) { return m_stream << std::forward<T>(_t); }
private:
    std::ostream& m_stream;
    bool m_enabled;
};

}
}
}