diff --git a/src_main/core/picout.cpp b/src_main/core/picout.cpp index c200d0b2..1d199f24 100644 --- a/src_main/core/picout.cpp +++ b/src_main/core/picout.cpp @@ -54,7 +54,7 @@ using namespace PICoutManipulators; PIMutex & PICout::__mutex__() {static PIMutex ret; return ret;} PIString & PICout::__string__() {static PIString ret; return ret;} -bool PICout::buffer_ = false; +PICout::OutputDevices PICout::devs = PICout::StdOut; PRIVATE_DEFINITION_START(PICout) PIStack cos_; @@ -105,11 +105,11 @@ PICout PICout::operator <<(const PICoutAction v) { #endif switch (v) { case PICoutManipulators::Flush: - if (!PICout::buffer_) + if (isOutputDeviceActive(StdOut)) std::cout << std::flush; break; case PICoutManipulators::Backspace: - if (!PICout::buffer_) { + if (isOutputDeviceActive(StdOut)) { #ifdef WINDOWS GetConsoleScreenBufferInfo(__Private__::hOut, &sbi); coord = sbi.dwCursorPosition; @@ -123,7 +123,7 @@ PICout PICout::operator <<(const PICoutAction v) { } break; case PICoutManipulators::ShowCursor: - if (!PICout::buffer_) { + if (isOutputDeviceActive(StdOut)) { #ifdef WINDOWS GetConsoleCursorInfo(__Private__::hOut, &curinfo); curinfo.bVisible = true; @@ -134,7 +134,7 @@ PICout PICout::operator <<(const PICoutAction v) { } break; case PICoutManipulators::HideCursor: - if (!PICout::buffer_) { + if (isOutputDeviceActive(StdOut)) { #ifdef WINDOWS GetConsoleCursorInfo(__Private__::hOut, &curinfo); curinfo.bVisible = false; @@ -145,7 +145,7 @@ PICout PICout::operator <<(const PICoutAction v) { } break; case PICoutManipulators::ClearLine: - if (!PICout::buffer_) { + if (isOutputDeviceActive(StdOut)) { #ifdef WINDOWS GetConsoleScreenBufferInfo(__Private__::hOut, &sbi); coord = sbi.dwCursorPosition; @@ -166,7 +166,7 @@ PICout PICout::operator <<(const PICoutAction v) { } break; case PICoutManipulators::ClearScreen: - if (!PICout::buffer_) { + if (isOutputDeviceActive(StdOut)) { #ifdef WINDOWS /// TODO : wondows ClearScreen !!! /*GetConsoleCursorInfo(__Private__::hOut, &curinfo); @@ -189,15 +189,21 @@ PICout PICout::operator <<(const PICoutAction v) { } -#define PICOUTTOTARGET(v) {if (PICout::buffer_) PICout::__string__() << (v); else std::cout << (v);} -#define PICOUTTOTARGETS(v) {if (PICout::buffer_) PICout::__string__() << (v); else std::cout << (v).dataConsole();} -//#define PICOUTTOTARGETS(v) {if (PICout::buffer_) PICout::__string__() << (v); else printf("%s", (v).dataConsole());} +#define PICOUTTOTARGET(v) { \ + if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v);\ + if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << (v);\ +} +#define PICOUTTOTARGETS(v) { \ + if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v).dataConsole();\ + if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << (v);\ +} +//#define PICOUTTOTARGETS(v) {if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << (v); else printf("%s", (v).dataConsole());} #define PINUMERICCOUT if (cnb_ == 10) PICOUTTOTARGET(v) else PICOUTTOTARGETS(PIString::fromNumber(v, cnb_)) PICout PICout::operator <<(const char * v) {if (v[0] == '\0') return *this; space(); quote(); PICOUTTOTARGET(v) quote(); return *this;} -//PICout PICout::operator <<(const std::string & v) {space(); quote(); if (PICout::buffer_) PICout::__string__() << StdString2PIString(v); else std::cout << (v); quote(); return *this;} +//PICout PICout::operator <<(const std::string & v) {space(); quote(); if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << StdString2PIString(v); else std::cout << (v); quote(); return *this;} PICout PICout::operator <<(const bool v) {space(); if (v) PICOUTTOTARGET("true") else PICOUTTOTARGET("false") return *this;} @@ -244,30 +250,30 @@ PICout PICout::operator <<(const PIObject * v) { PICout PICout::operator <<(const PICoutSpecialChar v) { switch (v) { case Null: - if (PICout::buffer_) PICout::__string__() << PIChar(0); - else std::cout << char(0); + if (isOutputDeviceActive(StdOut)) std::cout << char(0); + if (isOutputDeviceActive(Buffer)) PICout::__string__() << PIChar(0); break; case NewLine: - if (PICout::buffer_) PICout::__string__() << "\n"; - else std::cout << '\n'; + if (isOutputDeviceActive(StdOut)) std::cout << '\n'; + if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\n"; fo_ = true; break; case Tab: - if (PICout::buffer_) PICout::__string__() << "\t"; - else std::cout << '\t'; + if (isOutputDeviceActive(StdOut)) std::cout << '\t'; + if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\t"; break; case Esc: #ifdef CC_VC - if (PICout::buffer_) PICout::__string__() << PIChar(27); - else std::cout << char(27); + if (isOutputDeviceActive(StdOut)) std::cout << char(27); + if (isOutputDeviceActive(Buffer)) PICout::__string__() << PIChar(27); #else - if (PICout::buffer_) PICout::__string__() << "\e"; - else std::cout << '\e'; + if (isOutputDeviceActive(StdOut)) std::cout << '\e'; + if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\e"; #endif break; case Quote: - if (PICout::buffer_) PICout::__string__() << "\""; - else std::cout << '"'; + if (isOutputDeviceActive(StdOut)) std::cout << '"'; + if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\""; break; }; return *this; @@ -294,8 +300,8 @@ PICout & PICout::restoreControl() { PICout & PICout::space() { if (!fo_ && co_[AddSpaces]) { - if (PICout::buffer_) PICout::__string__() << " "; - else std::cout << ' '; + if (isOutputDeviceActive(StdOut)) std::cout << ' '; + if (isOutputDeviceActive(Buffer)) PICout::__string__() << " "; } fo_ = false; return *this; @@ -303,8 +309,8 @@ PICout & PICout::space() { PICout & PICout::quote() { if (co_[AddQuotes]) { - if (PICout::buffer_) PICout::__string__() << "\""; - else std::cout << '"'; + if (isOutputDeviceActive(StdOut)) std::cout << '"'; + if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\""; } fo_ = false; return *this; @@ -312,8 +318,8 @@ PICout & PICout::quote() { PICout & PICout::newLine() { if (co_[AddNewLine]) { - if (PICout::buffer_) PICout::__string__() << "\n"; - else std::cout << std::endl; + if (isOutputDeviceActive(StdOut)) std::cout << std::endl; + if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\n"; } fo_ = false; return *this; @@ -321,7 +327,7 @@ PICout & PICout::newLine() { void PICout::applyFormat(PICoutFormat f) { - if (PICout::buffer_) return; + if (!isOutputDeviceActive(StdOut)) return; fc_ = true; #ifdef WINDOWS static int mask_fore = ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); @@ -383,15 +389,15 @@ void PICout::applyFormat(PICoutFormat f) { bool PICout::setBufferActive(bool on, bool clear) { PIMutexLocker ml(PICout::__mutex__()); - bool ret = PICout::buffer_; + bool ret = isBufferActive(); if (clear) PICout::__string__().clear(); - PICout::buffer_ = on; + setOutputDevice(Buffer, on); return ret; } bool PICout::isBufferActive() { - return PICout::buffer_; + return isOutputDeviceActive(Buffer); } @@ -407,3 +413,18 @@ void PICout::clearBuffer() { PIMutexLocker ml(PICout::__mutex__()); PICout::__string__().clear(); } + + +bool PICout::setOutputDevice(PICout::OutputDevice d, bool on) { + devs.setFlag(d, on); +} + + +void PICout::setOutputDevices(PICout::OutputDevices d) { + devs = d; +} + + +bool PICout::isOutputDeviceActive(PICout::OutputDevice d) { + return devs[d]; +} diff --git a/src_main/core/picout.h b/src_main/core/picout.h index 12940094..146db289 100644 --- a/src_main/core/picout.h +++ b/src_main/core/picout.h @@ -116,6 +116,15 @@ public: ~PICout(); + //! \brief Enum contains output devices of PICout + enum OutputDevice { + NoDevices /** PICout is disabled */ = 0x0, + StdOut /** Standard console output */ = 0x1, + Buffer /** Internal buffer */ = 0x2, + AllDevices /** All */ = 0xFFFF, + }; + + typedef PIFlags OutputDevices; //! Output operator for strings with "const char * " type PICout operator <<(const char * v); @@ -249,13 +258,17 @@ public: static PIString buffer(bool clear = false); static void clearBuffer(); + static bool setOutputDevice(OutputDevice d, bool on = true); + static void setOutputDevices(OutputDevices d); + static bool isOutputDeviceActive(OutputDevice d); + static PIMutex & __mutex__(); static PIString & __string__(); private: void applyFormat(PICoutManipulators::PICoutFormat f); - static bool buffer_; + static OutputDevices devs; PRIVATE_DECLARATION bool fo_, cc_, fc_; int cnb_, attr_;