git-svn-id: svn://db.shs.com.ru/pip@621 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2018-06-28 11:24:24 +00:00
parent afee38f094
commit 5ce2499968
2 changed files with 68 additions and 34 deletions

View File

@@ -54,7 +54,7 @@ using namespace PICoutManipulators;
PIMutex & PICout::__mutex__() {static PIMutex ret; return ret;} PIMutex & PICout::__mutex__() {static PIMutex ret; return ret;}
PIString & PICout::__string__() {static PIString 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) PRIVATE_DEFINITION_START(PICout)
PIStack<PICoutControls> cos_; PIStack<PICoutControls> cos_;
@@ -105,11 +105,11 @@ PICout PICout::operator <<(const PICoutAction v) {
#endif #endif
switch (v) { switch (v) {
case PICoutManipulators::Flush: case PICoutManipulators::Flush:
if (!PICout::buffer_) if (isOutputDeviceActive(StdOut))
std::cout << std::flush; std::cout << std::flush;
break; break;
case PICoutManipulators::Backspace: case PICoutManipulators::Backspace:
if (!PICout::buffer_) { if (isOutputDeviceActive(StdOut)) {
#ifdef WINDOWS #ifdef WINDOWS
GetConsoleScreenBufferInfo(__Private__::hOut, &sbi); GetConsoleScreenBufferInfo(__Private__::hOut, &sbi);
coord = sbi.dwCursorPosition; coord = sbi.dwCursorPosition;
@@ -123,7 +123,7 @@ PICout PICout::operator <<(const PICoutAction v) {
} }
break; break;
case PICoutManipulators::ShowCursor: case PICoutManipulators::ShowCursor:
if (!PICout::buffer_) { if (isOutputDeviceActive(StdOut)) {
#ifdef WINDOWS #ifdef WINDOWS
GetConsoleCursorInfo(__Private__::hOut, &curinfo); GetConsoleCursorInfo(__Private__::hOut, &curinfo);
curinfo.bVisible = true; curinfo.bVisible = true;
@@ -134,7 +134,7 @@ PICout PICout::operator <<(const PICoutAction v) {
} }
break; break;
case PICoutManipulators::HideCursor: case PICoutManipulators::HideCursor:
if (!PICout::buffer_) { if (isOutputDeviceActive(StdOut)) {
#ifdef WINDOWS #ifdef WINDOWS
GetConsoleCursorInfo(__Private__::hOut, &curinfo); GetConsoleCursorInfo(__Private__::hOut, &curinfo);
curinfo.bVisible = false; curinfo.bVisible = false;
@@ -145,7 +145,7 @@ PICout PICout::operator <<(const PICoutAction v) {
} }
break; break;
case PICoutManipulators::ClearLine: case PICoutManipulators::ClearLine:
if (!PICout::buffer_) { if (isOutputDeviceActive(StdOut)) {
#ifdef WINDOWS #ifdef WINDOWS
GetConsoleScreenBufferInfo(__Private__::hOut, &sbi); GetConsoleScreenBufferInfo(__Private__::hOut, &sbi);
coord = sbi.dwCursorPosition; coord = sbi.dwCursorPosition;
@@ -166,7 +166,7 @@ PICout PICout::operator <<(const PICoutAction v) {
} }
break; break;
case PICoutManipulators::ClearScreen: case PICoutManipulators::ClearScreen:
if (!PICout::buffer_) { if (isOutputDeviceActive(StdOut)) {
#ifdef WINDOWS #ifdef WINDOWS
/// TODO : wondows ClearScreen !!! /// TODO : wondows ClearScreen !!!
/*GetConsoleCursorInfo(__Private__::hOut, &curinfo); /*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 PICOUTTOTARGET(v) { \
#define PICOUTTOTARGETS(v) {if (PICout::buffer_) PICout::__string__() << (v); else std::cout << (v).dataConsole();} if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v);\
//#define PICOUTTOTARGETS(v) {if (PICout::buffer_) PICout::__string__() << (v); else printf("%s", (v).dataConsole());} 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_)) #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 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;} 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) { PICout PICout::operator <<(const PICoutSpecialChar v) {
switch (v) { switch (v) {
case Null: case Null:
if (PICout::buffer_) PICout::__string__() << PIChar(0); if (isOutputDeviceActive(StdOut)) std::cout << char(0);
else std::cout << char(0); if (isOutputDeviceActive(Buffer)) PICout::__string__() << PIChar(0);
break; break;
case NewLine: case NewLine:
if (PICout::buffer_) PICout::__string__() << "\n"; if (isOutputDeviceActive(StdOut)) std::cout << '\n';
else std::cout << '\n'; if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\n";
fo_ = true; fo_ = true;
break; break;
case Tab: case Tab:
if (PICout::buffer_) PICout::__string__() << "\t"; if (isOutputDeviceActive(StdOut)) std::cout << '\t';
else std::cout << '\t'; if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\t";
break; break;
case Esc: case Esc:
#ifdef CC_VC #ifdef CC_VC
if (PICout::buffer_) PICout::__string__() << PIChar(27); if (isOutputDeviceActive(StdOut)) std::cout << char(27);
else std::cout << char(27); if (isOutputDeviceActive(Buffer)) PICout::__string__() << PIChar(27);
#else #else
if (PICout::buffer_) PICout::__string__() << "\e"; if (isOutputDeviceActive(StdOut)) std::cout << '\e';
else std::cout << '\e'; if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\e";
#endif #endif
break; break;
case Quote: case Quote:
if (PICout::buffer_) PICout::__string__() << "\""; if (isOutputDeviceActive(StdOut)) std::cout << '"';
else std::cout << '"'; if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\"";
break; break;
}; };
return *this; return *this;
@@ -294,8 +300,8 @@ PICout & PICout::restoreControl() {
PICout & PICout::space() { PICout & PICout::space() {
if (!fo_ && co_[AddSpaces]) { if (!fo_ && co_[AddSpaces]) {
if (PICout::buffer_) PICout::__string__() << " "; if (isOutputDeviceActive(StdOut)) std::cout << ' ';
else std::cout << ' '; if (isOutputDeviceActive(Buffer)) PICout::__string__() << " ";
} }
fo_ = false; fo_ = false;
return *this; return *this;
@@ -303,8 +309,8 @@ PICout & PICout::space() {
PICout & PICout::quote() { PICout & PICout::quote() {
if (co_[AddQuotes]) { if (co_[AddQuotes]) {
if (PICout::buffer_) PICout::__string__() << "\""; if (isOutputDeviceActive(StdOut)) std::cout << '"';
else std::cout << '"'; if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\"";
} }
fo_ = false; fo_ = false;
return *this; return *this;
@@ -312,8 +318,8 @@ PICout & PICout::quote() {
PICout & PICout::newLine() { PICout & PICout::newLine() {
if (co_[AddNewLine]) { if (co_[AddNewLine]) {
if (PICout::buffer_) PICout::__string__() << "\n"; if (isOutputDeviceActive(StdOut)) std::cout << std::endl;
else std::cout << std::endl; if (isOutputDeviceActive(Buffer)) PICout::__string__() << "\n";
} }
fo_ = false; fo_ = false;
return *this; return *this;
@@ -321,7 +327,7 @@ PICout & PICout::newLine() {
void PICout::applyFormat(PICoutFormat f) { void PICout::applyFormat(PICoutFormat f) {
if (PICout::buffer_) return; if (!isOutputDeviceActive(StdOut)) return;
fc_ = true; fc_ = true;
#ifdef WINDOWS #ifdef WINDOWS
static int mask_fore = ~(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); 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) { bool PICout::setBufferActive(bool on, bool clear) {
PIMutexLocker ml(PICout::__mutex__()); PIMutexLocker ml(PICout::__mutex__());
bool ret = PICout::buffer_; bool ret = isBufferActive();
if (clear) PICout::__string__().clear(); if (clear) PICout::__string__().clear();
PICout::buffer_ = on; setOutputDevice(Buffer, on);
return ret; return ret;
} }
bool PICout::isBufferActive() { bool PICout::isBufferActive() {
return PICout::buffer_; return isOutputDeviceActive(Buffer);
} }
@@ -407,3 +413,18 @@ void PICout::clearBuffer() {
PIMutexLocker ml(PICout::__mutex__()); PIMutexLocker ml(PICout::__mutex__());
PICout::__string__().clear(); 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];
}

View File

@@ -116,6 +116,15 @@ public:
~PICout(); ~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<OutputDevice> OutputDevices;
//! Output operator for strings with <tt>"const char * "</tt> type //! Output operator for strings with <tt>"const char * "</tt> type
PICout operator <<(const char * v); PICout operator <<(const char * v);
@@ -249,13 +258,17 @@ public:
static PIString buffer(bool clear = false); static PIString buffer(bool clear = false);
static void clearBuffer(); 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 PIMutex & __mutex__();
static PIString & __string__(); static PIString & __string__();
private: private:
void applyFormat(PICoutManipulators::PICoutFormat f); void applyFormat(PICoutManipulators::PICoutFormat f);
static bool buffer_; static OutputDevices devs;
PRIVATE_DECLARATION PRIVATE_DECLARATION
bool fo_, cc_, fc_; bool fo_, cc_, fc_;
int cnb_, attr_; int cnb_, attr_;