comparison dep/toml11/toml/color.hpp @ 318:3b355fa948c7

config: use TOML instead of INI unfortunately, INI is not enough, and causes some paths including semicolons to break with our current storage of the library folders. so, I decided to switch to TOML which does support real arrays...
author Paper <paper@paper.us.eu.org>
date Wed, 12 Jun 2024 05:25:41 -0400
parents
children
comparison
equal deleted inserted replaced
317:b1f4d1867ab1 318:3b355fa948c7
1 #ifndef TOML11_COLOR_HPP
2 #define TOML11_COLOR_HPP
3 #include <cstdint>
4 #include <ostream>
5
6 #ifdef TOML11_COLORIZE_ERROR_MESSAGE
7 #define TOML11_ERROR_MESSAGE_COLORIZED true
8 #else
9 #define TOML11_ERROR_MESSAGE_COLORIZED false
10 #endif
11
12 namespace toml
13 {
14
15 // put ANSI escape sequence to ostream
16 namespace color_ansi
17 {
18 namespace detail
19 {
20
21 inline int colorize_index()
22 {
23 static const int index = std::ios_base::xalloc();
24 return index;
25 }
26
27 // Control color mode globally
28 class color_mode
29 {
30 public:
31 inline void enable()
32 {
33 should_color_ = true;
34 }
35 inline void disable()
36 {
37 should_color_ = false;
38 }
39
40 inline bool should_color() const
41 {
42 return should_color_;
43 }
44
45 static color_mode& status()
46 {
47 static color_mode status_;
48 return status_;
49 }
50
51 private:
52 bool should_color_ = false;
53 };
54
55 } // detail
56
57 inline std::ostream& colorize(std::ostream& os)
58 {
59 // by default, it is zero.
60 os.iword(detail::colorize_index()) = 1;
61 return os;
62 }
63 inline std::ostream& nocolorize(std::ostream& os)
64 {
65 os.iword(detail::colorize_index()) = 0;
66 return os;
67 }
68 inline std::ostream& reset (std::ostream& os)
69 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[00m";} return os;}
70 inline std::ostream& bold (std::ostream& os)
71 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[01m";} return os;}
72 inline std::ostream& grey (std::ostream& os)
73 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[30m";} return os;}
74 inline std::ostream& red (std::ostream& os)
75 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[31m";} return os;}
76 inline std::ostream& green (std::ostream& os)
77 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[32m";} return os;}
78 inline std::ostream& yellow (std::ostream& os)
79 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[33m";} return os;}
80 inline std::ostream& blue (std::ostream& os)
81 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[34m";} return os;}
82 inline std::ostream& magenta(std::ostream& os)
83 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[35m";} return os;}
84 inline std::ostream& cyan (std::ostream& os)
85 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[36m";} return os;}
86 inline std::ostream& white (std::ostream& os)
87 {if(os.iword(detail::colorize_index()) == 1) {os << "\033[37m";} return os;}
88
89 inline void enable()
90 {
91 return detail::color_mode::status().enable();
92 }
93 inline void disable()
94 {
95 return detail::color_mode::status().disable();
96 }
97
98 inline bool should_color()
99 {
100 return detail::color_mode::status().should_color();
101 }
102
103 } // color_ansi
104
105 // ANSI escape sequence is the only and default colorization method currently
106 namespace color = color_ansi;
107
108 } // toml
109 #endif// TOML11_COLOR_HPP