PICout improvement:

* renamed private members for more clear code
 * registerExternalBufferID() method to obtain unique ID for withExternalBuffer()
 * PICoutManipulators::PICoutStdStream enum for select stream (stdout or stderr)
 * Constructors now accept optional stream
 * piCerr and piCerrObj macros

PIDir::temporary() moved to "mkdtemp"

PILog:
 * now 4 levels
 * you can set max level
 * Error writes to piCerr
This commit is contained in:
2024-09-16 16:06:07 +03:00
parent 9d4357c066
commit 000ce2a54d
11 changed files with 357 additions and 320 deletions

View File

@@ -141,7 +141,7 @@ PIString & PICout::__string__() {
return *ret;
}
PICout::OutputDevices PICout::devs = PICout::StdOut;
PICout::OutputDevices PICout::devs = PICout::Console;
PRIVATE_DEFINITION_START(PICout)
PIStack<PICoutControls> cos_;
@@ -158,35 +158,53 @@ WORD PICout::__Private__::dattr = 0;
DWORD PICout::__Private__::smode = 0;
#endif
PICout::PICout(int controls): fo_(true), cc_(false), fc_(false), act_(true), cnb_(10), co_(controls) {
buffer_ = nullptr;
std::ostream & getStdStream(PICoutManipulators::PICoutStdStream s) {
switch (s) {
case PICoutManipulators::StdOut: return std::cout;
case PICoutManipulators::StdErr: return std::cerr;
default: break;
}
return std::cout;
}
std::wostream & getStdWStream(PICoutManipulators::PICoutStdStream s) {
switch (s) {
case PICoutManipulators::StdOut: return std::wcout;
case PICoutManipulators::StdErr: return std::wcerr;
default: break;
}
return std::wcout;
}
PICout::PICout(int controls, PICoutStdStream stream): ctrl_(controls), stream_(stream) {
init();
}
PICout::PICout(bool active): fo_(true), cc_(false), fc_(false), act_(active), cnb_(10), co_(PICoutManipulators::DefaultControls) {
buffer_ = nullptr;
if (act_) init();
PICout::PICout(bool active, PICoutStdStream stream): actve_(active), stream_(stream) {
if (actve_) init();
}
PICout::PICout(const PICout & other)
: fo_(other.fo_)
, cc_(true)
, fc_(false)
, act_(other.act_)
, cnb_(other.cnb_)
, attr_(other.attr_)
: first_out_(other.first_out_)
, is_copy_(true)
, actve_(other.actve_)
, int_base_(other.int_base_)
, win_attr_(other.win_attr_)
, id_(other.id_)
, buffer_(other.buffer_)
, co_(other.co_) {}
, ctrl_(other.ctrl_)
, stream_(other.stream_) {}
PICout::~PICout() {
if (!act_) return;
if (fc_) applyFormat(PICoutManipulators::Default);
if (cc_) return;
if (!actve_) return;
if (format_changed_) applyFormat(PICoutManipulators::Default);
if (is_copy_) return;
newLine();
if ((co_ & NoLock) != NoLock) {
if ((ctrl_ & NoLock) != NoLock) {
PICout::__mutex__().unlock();
}
if (buffer_) {
@@ -196,7 +214,7 @@ PICout::~PICout() {
PICout & PICout::operator<<(PICoutAction v) {
if (!act_) return *this;
if (!actve_) return *this;
#ifdef WINDOWS
CONSOLE_SCREEN_BUFFER_INFO sbi;
COORD coord;
@@ -204,12 +222,12 @@ PICout & PICout::operator<<(PICoutAction v) {
#endif
switch (v) {
case PICoutManipulators::Flush:
if (!buffer_ && isOutputDeviceActive(StdOut)) {
std::cout << std::flush;
if (!buffer_ && isOutputDeviceActive(Console)) {
getStdStream(stream_) << std::flush;
}
break;
case PICoutManipulators::Backspace:
if (isOutputDeviceActive(StdOut)) {
if (isOutputDeviceActive(Console)) {
#ifdef WINDOWS
GetConsoleScreenBufferInfo(__Private__::hOut, &sbi);
coord = sbi.dwCursorPosition;
@@ -223,7 +241,7 @@ PICout & PICout::operator<<(PICoutAction v) {
}
break;
case PICoutManipulators::ShowCursor:
if (isOutputDeviceActive(StdOut)) {
if (isOutputDeviceActive(Console)) {
#ifdef WINDOWS
GetConsoleCursorInfo(__Private__::hOut, &curinfo);
curinfo.bVisible = true;
@@ -234,7 +252,7 @@ PICout & PICout::operator<<(PICoutAction v) {
}
break;
case PICoutManipulators::HideCursor:
if (isOutputDeviceActive(StdOut)) {
if (isOutputDeviceActive(Console)) {
#ifdef WINDOWS
GetConsoleCursorInfo(__Private__::hOut, &curinfo);
curinfo.bVisible = false;
@@ -245,7 +263,7 @@ PICout & PICout::operator<<(PICoutAction v) {
}
break;
case PICoutManipulators::ClearLine:
if (isOutputDeviceActive(StdOut)) {
if (isOutputDeviceActive(Console)) {
#ifdef WINDOWS
GetConsoleScreenBufferInfo(__Private__::hOut, &sbi);
coord = sbi.dwCursorPosition;
@@ -266,7 +284,7 @@ PICout & PICout::operator<<(PICoutAction v) {
}
break;
case PICoutManipulators::ClearScreen:
if (isOutputDeviceActive(StdOut)) {
if (isOutputDeviceActive(Console)) {
#ifdef WINDOWS
/// TODO : wondows ClearScreen !!!
#else
@@ -282,12 +300,31 @@ PICout & PICout::operator<<(PICoutAction v) {
}
PICout & PICout::setControl(PICoutManipulators::PICoutControl c, bool on) {
ctrl_.setFlag(c, on);
return *this;
}
PICout & PICout::setControls(PICoutManipulators::PICoutControls c) {
ctrl_ = c;
return *this;
}
PICout & PICout::saveAndSetControls(PICoutManipulators::PICoutControls c) {
saveControls();
ctrl_ = c;
return *this;
}
PICout & PICout::operator<<(PICoutManipulators::PICoutFormat v) {
switch (v) {
case PICoutManipulators::Bin: cnb_ = 2; break;
case PICoutManipulators::Oct: cnb_ = 8; break;
case PICoutManipulators::Dec: cnb_ = 10; break;
case PICoutManipulators::Hex: cnb_ = 16; break;
case PICoutManipulators::Bin: int_base_ = 2; break;
case PICoutManipulators::Oct: int_base_ = 8; break;
case PICoutManipulators::Dec: int_base_ = 10; break;
case PICoutManipulators::Hex: int_base_ = 16; break;
default: applyFormat(v);
};
return *this;
@@ -295,10 +332,10 @@ PICout & PICout::operator<<(PICoutManipulators::PICoutFormat v) {
PICout & PICout::operator<<(PIFlags<PICoutManipulators::PICoutFormat> v) {
if (v[PICoutManipulators::Bin]) cnb_ = 2;
if (v[PICoutManipulators::Oct]) cnb_ = 8;
if (v[PICoutManipulators::Dec]) cnb_ = 10;
if (v[PICoutManipulators::Hex]) cnb_ = 16;
if (v[PICoutManipulators::Bin]) int_base_ = 2;
if (v[PICoutManipulators::Oct]) int_base_ = 8;
if (v[PICoutManipulators::Dec]) int_base_ = 10;
if (v[PICoutManipulators::Hex]) int_base_ = 16;
if (v[PICoutManipulators::Bold]) applyFormat(PICoutManipulators::Bold);
if (v[PICoutManipulators::Faint]) applyFormat(PICoutManipulators::Faint);
if (v[PICoutManipulators::Italic]) applyFormat(PICoutManipulators::Italic);
@@ -324,31 +361,78 @@ PICout & PICout::operator<<(PIFlags<PICoutManipulators::PICoutFormat> v) {
return *this;
}
#define PIINTCOUT(v) \
{ \
if (!act_) return *this; \
space(); \
if (cnb_ == 10) { \
if (buffer_) { \
(*buffer_) += PIString::fromNumber(v); \
} else { \
if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v); \
if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() += PIString::fromNumber(v); \
} \
} else \
write(PIString::fromNumber(v, cnb_)); \
return *this; \
void PICout::stdoutPIString(const PIString & str, PICoutStdStream s) {
#ifdef HAS_LOCALE
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> utf8conv;
getStdStream(s) << utf8conv.to_bytes((char16_t *)&(const_cast<PIString &>(str).front()),
(char16_t *)&(const_cast<PIString &>(str).front()) + str.size());
#else
for (PIChar c: str)
getStdWStream(s).put(c.toWChar());
#endif
}
PICout & PICout::write(const char * str, int len) {
if (!actve_ || !str) return *this;
if (buffer_) {
buffer_->append(PIString(str, len));
} else {
if (isOutputDeviceActive(Console)) getStdStream(stream_).write(str, len);
if (isOutputDeviceActive(Buffer)) PICout::__string__().append(PIString(str, len));
}
return *this;
}
PICout & PICout::write(const PIString & s) {
if (!actve_) return *this;
if (buffer_) {
buffer_->append(s);
} else {
if (isOutputDeviceActive(Console)) stdoutPIString(s, stream_);
if (isOutputDeviceActive(Buffer)) PICout::__string__().append(s);
}
return *this;
}
void PICout::writeChar(char c) {
if (buffer_) {
buffer_->append(c);
} else {
if (isOutputDeviceActive(Console)) getStdStream(stream_) << c;
if (isOutputDeviceActive(Buffer)) PICout::__string__().append(c);
}
}
#define PIINTCOUT(v) \
{ \
if (!actve_) return *this; \
space(); \
if (int_base_ == 10) { \
if (buffer_) { \
(*buffer_) += PIString::fromNumber(v); \
} else { \
if (isOutputDeviceActive(Console)) getStdStream(stream_) << (v); \
if (isOutputDeviceActive(Buffer)) PICout::__string__() += PIString::fromNumber(v); \
} \
} else \
write(PIString::fromNumber(v, int_base_)); \
return *this; \
}
#define PIFLOATCOUT(v) \
{ \
if (buffer_) { \
(*buffer_) += PIString::fromNumber(v, 'g'); \
} else { \
if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v); \
if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() += PIString::fromNumber(v, 'g'); \
} \
} \
#define PIFLOATCOUT(v) \
{ \
if (buffer_) { \
(*buffer_) += PIString::fromNumber(v, 'g'); \
} else { \
if (isOutputDeviceActive(Console)) getStdStream(stream_) << (v); \
if (isOutputDeviceActive(Buffer)) PICout::__string__() += PIString::fromNumber(v, 'g'); \
} \
} \
return *this;
@@ -361,7 +445,7 @@ PICout & PICout::operator<<(const PIString & v) {
}
PICout & PICout::operator<<(const char * v) {
if (!act_ || !v) return *this;
if (!actve_ || !v) return *this;
if (v[0] == '\0') return *this;
space();
quote();
@@ -371,7 +455,7 @@ PICout & PICout::operator<<(const char * v) {
}
PICout & PICout::operator<<(bool v) {
if (!act_) return *this;
if (!actve_) return *this;
space();
if (v)
write("true");
@@ -381,7 +465,7 @@ PICout & PICout::operator<<(bool v) {
}
PICout & PICout::operator<<(char v) {
if (!act_) return *this;
if (!actve_) return *this;
space();
write(v);
return *this;
@@ -406,32 +490,32 @@ PICout & PICout::operator<<(llong v){PIINTCOUT(v)}
PICout & PICout::operator<<(ullong v){PIINTCOUT(v)}
PICout & PICout::operator<<(float v) {
if (!act_) return *this;
if (!actve_) return *this;
space();
PIFLOATCOUT(v)
}
PICout & PICout::operator<<(double v) {
if (!act_) return *this;
if (!actve_) return *this;
space();
PIFLOATCOUT(v)
}
PICout & PICout::operator<<(ldouble v) {
if (!act_) return *this;
if (!actve_) return *this;
space();
PIFLOATCOUT(v)
}
PICout & PICout::operator<<(const void * v) {
if (!act_) return *this;
if (!actve_) return *this;
space();
write("0x" + PIString::fromNumber(ullong(v), 16));
return *this;
}
PICout & PICout::operator<<(const PIObject * v) {
if (!act_) return *this;
if (!actve_) return *this;
space();
if (v == 0)
write("PIObject*(0x0)");
@@ -443,74 +527,38 @@ PICout & PICout::operator<<(const PIObject * v) {
}
PICout & PICout::operator<<(PICoutSpecialChar v) {
if (!act_) return *this;
if (!actve_) return *this;
switch (v) {
case Null:
if (buffer_) {
(*buffer_) += PIChar();
} else {
if (isOutputDeviceActive(StdOut)) std::cout << char(0);
if (isOutputDeviceActive(Buffer)) PICout::__string__() += PIChar();
}
break;
case Null: writeChar(char(0)); break;
case NewLine:
if (buffer_) {
(*buffer_) += "\n";
} else {
if (isOutputDeviceActive(StdOut)) std::cout << '\n';
if (isOutputDeviceActive(Buffer)) PICout::__string__() += "\n";
}
fo_ = true;
break;
case Tab:
if (buffer_) {
(*buffer_) += "\t";
} else {
if (isOutputDeviceActive(StdOut)) std::cout << '\t';
if (isOutputDeviceActive(Buffer)) PICout::__string__() += "\t";
}
first_out_ = true;
writeChar('\n');
break;
case Tab: writeChar('\t'); break;
case Esc:
#ifdef CC_VC
if (buffer_) {
(*buffer_) += PIChar(27);
} else {
if (isOutputDeviceActive(StdOut)) std::cout << char(27);
if (isOutputDeviceActive(Buffer)) PICout::__string__() += PIChar(27);
}
writeChar(char(27));
#else
if (buffer_) {
(*buffer_) += "\e";
} else {
if (isOutputDeviceActive(StdOut)) std::cout << '\e';
if (isOutputDeviceActive(Buffer)) PICout::__string__() += "\e";
}
writeChar('\e');
#endif
break;
case Quote:
if (buffer_) {
(*buffer_) += "\"";
} else {
if (isOutputDeviceActive(StdOut)) std::cout << '"';
if (isOutputDeviceActive(Buffer)) PICout::__string__() += "\"";
}
break;
case Quote: writeChar('"'); break;
};
return *this;
}
PICout & PICout::saveControls() {
if (!act_) return *this;
PRIVATE->cos_.push(co_);
if (!actve_) return *this;
PRIVATE->cos_.push(ctrl_);
return *this;
}
PICout & PICout::restoreControls() {
if (!act_) return *this;
if (!actve_) return *this;
if (!PRIVATE->cos_.isEmpty()) {
co_ = PRIVATE->cos_.top();
ctrl_ = PRIVATE->cos_.top();
PRIVATE->cos_.pop();
}
return *this;
@@ -524,16 +572,11 @@ PICout & PICout::restoreControls() {
//! Добавляет пробел если это не первый вывод и установлен флаг \a AddSpaces
//! \~\sa \a quote(), \a newLine()
PICout & PICout::space() {
if (!act_) return *this;
if (!fo_ && co_[AddSpaces]) {
if (buffer_) {
(*buffer_) += " ";
} else {
if (isOutputDeviceActive(StdOut)) std::cout << ' ';
if (isOutputDeviceActive(Buffer)) PICout::__string__() += " ";
}
if (!actve_) return *this;
if (!first_out_ && ctrl_[AddSpaces]) {
writeChar(' ');
}
fo_ = false;
first_out_ = false;
return *this;
}
@@ -544,16 +587,11 @@ PICout & PICout::space() {
//! Добавляет кавычки если установлен флаг \a AddQuotes
//! \~\sa \a space(), \a newLine()
PICout & PICout::quote() {
if (!act_) return *this;
if (co_[AddQuotes]) {
if (buffer_) {
(*buffer_) += "\"";
} else {
if (isOutputDeviceActive(StdOut)) std::cout << '"';
if (isOutputDeviceActive(Buffer)) PICout::__string__() += "\"";
}
if (!actve_) return *this;
if (ctrl_[AddQuotes]) {
writeChar('"');
}
fo_ = false;
first_out_ = false;
return *this;
}
@@ -564,74 +602,28 @@ PICout & PICout::quote() {
//! Добавляет новую строку если установлен флаг \a AddNewLine
//! \~\sa \a space(), \a quote()
PICout & PICout::newLine() {
if (!act_) return *this;
if (co_[AddNewLine]) {
if (buffer_) {
(*buffer_) += "\n";
} else {
if (isOutputDeviceActive(StdOut)) std::cout << std::endl;
if (isOutputDeviceActive(Buffer)) PICout::__string__() += "\n";
}
if (!actve_) return *this;
if (ctrl_[AddNewLine]) {
writeChar('\n');
}
fo_ = false;
first_out_ = false;
return *this;
}
PICout & PICout::write(char c) {
if (!act_) return *this;
if (buffer_) {
buffer_->append(c);
} else {
if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << c;
if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__().append(c);
}
if (!actve_) return *this;
writeChar(c);
return *this;
}
PICout & PICout::write(const char * str) {
if (!act_ || !str) return *this;
if (!actve_ || !str) return *this;
return write(str, strlen(str));
}
PICout & PICout::write(const char * str, int len) {
if (!act_ || !str) return *this;
if (buffer_) {
buffer_->append(PIString(str, len));
} else {
if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout.write(str, len);
if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__().append(PIString(str, len));
}
return *this;
}
PICout & PICout::write(const PIString & s) {
if (!act_) return *this;
if (buffer_) {
buffer_->append(s);
} else {
if (PICout::isOutputDeviceActive(PICout::StdOut)) stdoutPIString(s);
if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__().append(s);
}
return *this;
}
void PICout::stdoutPIString(const PIString & s) {
#ifdef HAS_LOCALE
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> utf8conv;
std::cout << utf8conv.to_bytes((char16_t *)&(const_cast<PIString &>(s).front()),
(char16_t *)&(const_cast<PIString &>(s).front()) + s.size());
#else
for (PIChar c: s)
std::wcout.put(c.toWChar());
#endif
}
void PICout::init() {
#ifdef WINDOWS
if (__Private__::hOut == 0) {
@@ -640,19 +632,18 @@ void PICout::init() {
GetConsoleScreenBufferInfo(__Private__::hOut, &sbi);
__Private__::dattr = sbi.wAttributes;
}
attr_ = __Private__::dattr;
win_attr_ = __Private__::dattr;
#endif
id_ = 0;
if ((co_ & NoLock) != NoLock) {
if ((ctrl_ & NoLock) != NoLock) {
PICout::__mutex__().lock();
}
}
void PICout::applyFormat(PICoutFormat f) {
if (!act_) return;
if (buffer_ || !isOutputDeviceActive(StdOut)) return;
fc_ = true;
if (!actve_) return;
if (buffer_ || !isOutputDeviceActive(Console)) return;
format_changed_ = true;
#ifdef WINDOWS
static int mask_fore = ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
static int mask_back = ~(BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);
@@ -661,28 +652,28 @@ void PICout::applyFormat(PICoutFormat f) {
case Oct:
case Dec:
case Hex: break;
case PICoutManipulators::Bold: attr_ |= FOREGROUND_INTENSITY; break;
case PICoutManipulators::Underline: attr_ |= COMMON_LVB_UNDERSCORE; break;
case PICoutManipulators::Black: attr_ = (attr_ & mask_fore); break;
case PICoutManipulators::Red: attr_ = (attr_ & mask_fore) | FOREGROUND_RED; break;
case PICoutManipulators::Green: attr_ = (attr_ & mask_fore) | FOREGROUND_GREEN; break;
case PICoutManipulators::Blue: attr_ = (attr_ & mask_fore) | FOREGROUND_BLUE; break;
case PICoutManipulators::Yellow: attr_ = (attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_GREEN; break;
case PICoutManipulators::Magenta: attr_ = (attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_BLUE; break;
case PICoutManipulators::Cyan: attr_ = (attr_ & mask_fore) | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case PICoutManipulators::White: attr_ = (attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case PICoutManipulators::BackBlack: attr_ = (attr_ & mask_back); break;
case PICoutManipulators::BackRed: attr_ = (attr_ & mask_back) | BACKGROUND_RED; break;
case PICoutManipulators::BackGreen: attr_ = (attr_ & mask_back) | BACKGROUND_GREEN; break;
case PICoutManipulators::BackBlue: attr_ = (attr_ & mask_back) | BACKGROUND_BLUE; break;
case PICoutManipulators::BackYellow: attr_ = (attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_GREEN; break;
case PICoutManipulators::BackMagenta: attr_ = (attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_BLUE; break;
case PICoutManipulators::BackCyan: attr_ = (attr_ & mask_back) | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
case PICoutManipulators::BackWhite: attr_ = (attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
case PICoutManipulators::Default: attr_ = __Private__::dattr; break;
case PICoutManipulators::Bold: win_attr_ |= FOREGROUND_INTENSITY; break;
case PICoutManipulators::Underline: win_attr_ |= COMMON_LVB_UNDERSCORE; break;
case PICoutManipulators::Black: win_attr_ = (win_attr_ & mask_fore); break;
case PICoutManipulators::Red: win_attr_ = (win_attr_ & mask_fore) | FOREGROUND_RED; break;
case PICoutManipulators::Green: win_attr_ = (win_attr_ & mask_fore) | FOREGROUND_GREEN; break;
case PICoutManipulators::Blue: win_attr_ = (win_attr_ & mask_fore) | FOREGROUND_BLUE; break;
case PICoutManipulators::Yellow: win_attr_ = (win_attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_GREEN; break;
case PICoutManipulators::Magenta: win_attr_ = (win_attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_BLUE; break;
case PICoutManipulators::Cyan: win_attr_ = (win_attr_ & mask_fore) | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case PICoutManipulators::White: win_attr_ = (win_attr_ & mask_fore) | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break;
case PICoutManipulators::BackBlack: win_attr_ = (win_attr_ & mask_back); break;
case PICoutManipulators::BackRed: win_attr_ = (win_attr_ & mask_back) | BACKGROUND_RED; break;
case PICoutManipulators::BackGreen: win_attr_ = (win_attr_ & mask_back) | BACKGROUND_GREEN; break;
case PICoutManipulators::BackBlue: win_attr_ = (win_attr_ & mask_back) | BACKGROUND_BLUE; break;
case PICoutManipulators::BackYellow: win_attr_ = (win_attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_GREEN; break;
case PICoutManipulators::BackMagenta: win_attr_ = (win_attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_BLUE; break;
case PICoutManipulators::BackCyan: win_attr_ = (win_attr_ & mask_back) | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
case PICoutManipulators::BackWhite: win_attr_ = (win_attr_ & mask_back) | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE; break;
case PICoutManipulators::Default: win_attr_ = __Private__::dattr; break;
default: break;
}
SetConsoleTextAttribute(__Private__::hOut, attr_);
SetConsoleTextAttribute(__Private__::hOut, win_attr_);
#else
switch (f) {
case Bin:
@@ -761,3 +752,8 @@ PICout PICout::withExternalBuffer(PIString * buffer, int id, PIFlags<PICoutManip
c.id_ = id;
return c;
}
int PICout::registerExternalBufferID() {
return Notifier::instance()->new_id.fetch_add(1);
}