/*! \file picout.h * \ingroup Core * \~\brief * \~english Universal output to console class * \~russian Универсальный вывод в консоль */ /* PIP - Platform Independent Primitives Universal output to console class Ivan Pelipenko peri4ko@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef PICOUT_H #define PICOUT_H #include "piincludes.h" #ifdef DOXYGEN //! \~english Macro used for conditional (piDebug) output to PICout //! \~russian Макрос для условного (piDebug) вывода в PICout # define piCout //! \relatesalso PIObject //! \~english Macro used for conditional (piDebug && PIObject::debug()) output to PICout for subclasses of PIObject //! \~russian Макрос для условного (piDebug && PIObject::debug()) вывода в PICout для наследников PIObject # define piCoutObj #else # define piCout PICout(piDebug) # define piCoutObj PICout(piDebug && debug()) << (PIStringAscii("[") + className() + (name().isEmpty() ? "]" : PIStringAscii(" \"") + name() + PIStringAscii("\"]"))) #endif class PIObject; //! \relatesalso PICout //! \~english Namespace contains enums that controls PICout //! \~russian Пространство имен содержит перечисления для контроля PICout namespace PICoutManipulators { //! \~english Enum contains special characters //! \~russian Перечисление со спецсимволами enum PICoutSpecialChar { Null /*! \~english Null-character, '\\0' \~russian Нулевой символ, '\\0' */, NewLine /*! \~english New line character, '\\n' \~russian Новая строка, '\\n' */, Tab /*! \~english Tab character, '\\t' \~russian Табуляция, '\\t' */, Esc /*! \~english Escape character, '\\e' \~russian Esc-символ, '\\e' */, Quote /*! \~english Quote character, '\"' \~russian Кавычки, '\"' */ }; //! \~english Enum contains immediate action //! \~russian Перечисление с немедленными действиями enum PICoutAction { Flush /*! \~english Flush the output \~russian Обновить вывод */, Backspace /*! \~english Remove last symbol \~russian Удалить последний символ */, ShowCursor /*! \~english Show cursor \~russian Показать курсор */, HideCursor /*! \~english Hide cursor \~russian Скрыть курсор */, ClearLine /*! \~english Clear current line \~russian Очистить текущую строку */, ClearScreen /*! \~english Clear the screen \~russian Очистить экран */, SaveContol /*! \~english Save control flags, equivalent to \a saveControl() \~russian Сохранить флаги, аналогично \a saveControl() */, RestoreControl /*! \~english Restore control flags, equivalent to \a restoreControl() \~russian Восстановить флаги, аналогично \a restoreControl() */ }; //! \~english Enum contains control of PICout //! \~russian Перечисление с управлением PICout enum PICoutControl { AddNone /*! \~english No controls \~russian Без управления */ = 0x0, AddSpaces /*! \~english Spaces will be appear after each output \~russian Пробел после каждого вывода */ = 0x1, AddNewLine /*! \~english New line will be appear after all output \~russian Новая строка после завершения вывода */ = 0x2, AddQuotes /*! \~english Each string will be quoted \~russian Каждая строка в кавычках */ = 0x4, DefaultControls /*! \~english Default controls \~russian Управление по умолчанию */ = AddSpaces | AddNewLine, AddAll /*! \~english All controls \~russian Всё управление */ = 0xFF, NoLock /*! \~english Don`t use mutex for output \~russian Не использовать мьютекс при выводе */ = 0x100, }; //! \~english Enum contains output format //! \~russian Перечисление с форматом вывода enum PICoutFormat { Bin /*! \~english Binary representation of integers \~russian Двоичное представление для целых чисел */ = 0x01, Oct /*! \~english Octal representation of integers \~russian Восьмеричное представление для целых чисел */ = 0x02, Dec /*! \~english Decimal representation of integers \~russian Десятичное представление для целых чисел */ = 0x04, Hex /*! \~english Hexadecimal representation of integers \~russian Шестнадцатеричное представление для целых чисел */ = 0x08, Bold /*! \~english Bold \~russian Жирный */ = 0x10, Faint /*! \~english \~russian */ = 0x20, Italic /*! \~english \~russian */ = 0x40, Underline /*! \~english Underline \~russian Подчеркнутый */ = 0x80, Blink /*! \~english Blink \~russian Мигающий */ = 0x100, Black /*! \~english Black font \~russian Чёрный */ = 0x400, Red /*! \~english Red font \~russian Красный */ = 0x800, Green /*! \~english Green font \~russian Зелёный */ = 0x1000, Blue /*! \~english Blue font \~russian Синий */ = 0x2000, Yellow /*! \~english Yellow font \~russian Жёлтый */ = 0x4000, Magenta /*! \~english Magenta font \~russian Пурпурный */ = 0x8000, Cyan /*! \~english Cyan font \~russian Голубой */ = 0x10000, White /*! \~english White font \~russian Белый */ = 0x20000, BackBlack /*! \~english Black background \~russian Чёрный фон */ = 0x40000, BackRed /*! \~english Red background \~russian Красный фон */ = 0x80000, BackGreen /*! \~english Green background \~russian Зелёный фон */ = 0x100000, BackBlue /*! \~english Blue background \~russian Синий фон */ = 0x200000, BackYellow /*! \~english Yellow background \~russian Жёлтый фон */ = 0x400000, BackMagenta /*! \~english Magenta background \~russian Пурпурный фон */ = 0x800000, BackCyan /*! \~english Cyan background \~russian Голубой фон */ = 0x1000000, BackWhite /*! \~english White background \~russian Белый фон */ = 0x2000000, Default /*! \~english Default format \~russian Формат по умолчанию */ = 0x4000000 }; typedef PIFlags PICoutControls; } class PIP_EXPORT PICout { public: //! \~english Default constructor with default features (AddSpaces and AddNewLine) //! \~russian Конструктор по умолчанию (AddSpaces и AddNewLine) PICout(int controls = PICoutManipulators::DefaultControls); //! \~english Construct with default features (AddSpaces and AddNewLine), but if \"active\" is false does nothing //! \~russian Конструктор по умолчанию (AddSpaces и AddNewLine), но если не \"active\" то будет неактивным PICout(bool active); //! \~english Construct with external buffer and ID "id". See \a Notifier for details //! \~russian Конструктор с внешним буфером и ID "id". Подробнее \a Notifier PICout(PIString * buffer, int id = 0, PIFlags controls = PICoutManipulators::AddSpaces | PICoutManipulators::AddNewLine); PICout(const PICout & other); ~PICout(); class PIP_EXPORT Notifier { public: //! \~english Singleton access to %PICout::Notifier //! \~russian Синглтон класса %PICout::Notifier static Notifier * instance(); //! \~english Object that emit events from %PICout //! \~russian Объект, который посылает события от %PICout static PIObject * object(); private: Notifier(); PIObject * o; }; //! \~english Enum contains output devices of %PICout //! \~russian Перечисление с устройствами вывода для %PICout enum OutputDevice { NoDevices /** \~english %PICout is disabled \~russian %PICout неактивен */ = 0x0, StdOut /** \~english Standard console output \~russian Стандартный вывод в консоль */ = 0x1, Buffer /** \~english Internal buffer \~russian Внутренний буфер */ = 0x2, AllDevices /** \~english All \~russian Все */ = 0xFFFF, }; typedef PIFlags OutputDevices; //! \~english Output operator for strings with "const char * " type //! \~russian Оператор вывода для строк "const char * " PICout operator <<(const char * v); // ! Output operator for strings with "std::string" type //PICout operator <<(const std::string & v); //! \~english Output operator for boolean values //! \~russian Оператор вывода для логических значений PICout operator <<(const bool v); //! \~english Output operator for "char" values //! \~russian Оператор вывода для "char" значений PICout operator <<(const char v); //! \~english Output operator for "unsigned char" values //! \~russian Оператор вывода для "unsigned char" значений PICout operator <<(const uchar v); //! \~english Output operator for "short" values //! \~russian Оператор вывода для "short" значений PICout operator <<(const short v); //! \~english Output operator for "unsigned short" values //! \~russian Оператор вывода для "unsigned short" значений PICout operator <<(const ushort v); //! \~english Output operator for "int" values //! \~russian Оператор вывода для "int" значений PICout operator <<(const int v); //! \~english Output operator for "unsigned int" values //! \~russian Оператор вывода для "unsigned int" значений PICout operator <<(const uint v); //! \~english Output operator for "long" values //! \~russian Оператор вывода для "long" значений PICout operator <<(const long v); //! \~english Output operator for "unsigned long" values //! \~russian Оператор вывода для "unsigned long" значений PICout operator <<(const ulong v); //! \~english Output operator for "long long" values //! \~russian Оператор вывода для "long long" значений PICout operator <<(const llong v); //! \~english Output operator for "unsigned long long" values //! \~russian Оператор вывода для "unsigned long long" значений PICout operator <<(const ullong v); //! \~english Output operator for "float" values //! \~russian Оператор вывода для "float" значений PICout operator <<(const float v); //! \~english Output operator for "double" values //! \~russian Оператор вывода для "double" значений PICout operator <<(const double v); //! \~english Output operator for pointers //! \~russian Оператор вывода для указателей PICout operator <<(const void * v); //! \~english Output operator for PIObject and ancestors //! \~russian Оператор вывода для PIObject и наследников PICout operator <<(const PIObject * v); //! \~english Output operator for \a PICoutSpecialChar values //! \~russian Оператор вывода для \a PICoutSpecialChar PICout operator <<(const PICoutManipulators::PICoutSpecialChar v); //! \~english Output operator for \a PIFlags values //! \~russian Оператор вывода для \a PIFlags PICout operator <<(const PIFlags & v); //! \~english Output operator for \a PICoutFormat values //! \~russian Оператор вывода для \a PICoutFormat PICout operator <<(const PICoutManipulators::PICoutFormat v); //! \~english Do some action //! \~russian Делает действие PICout operator <<(const PICoutManipulators::PICoutAction v); //! \~english Set control flag "c" is "on" state //! \~russian Установить флаг "c" в "on" состояние PICout & setControl(PICoutManipulators::PICoutControl c, bool on = true) {co_.setFlag(c, on); return *this;} //! \~english Set control flags "c" and if "save" exec \a saveControl() //! \~russian Установить флаг "c" и если "save" то выполнить \a saveControl() PICout & setControl(PICoutManipulators::PICoutControls c, bool save = false) {if (save) saveControl(); co_ = c; return *this;} //! \~english Save control flags to internal stack //! \~russian Сохраняет состояние флагов во внутренний стек //! \~\sa \a restoreControl() PICout & saveControl(); //! \~english Restore control flags from internal stack //! \~russian Восстанавливает состояние флагов из внутреннего стека //! \~\sa \a saveControl() PICout & restoreControl(); //! \~english Conditional put space character to output //! \~russian Условно добавляет пробел PICout & space(); //! \~english Conditional put quote character to output //! \~russian Условно добавляет кавычки PICout & quote(); //! \~english Conditional put new line character to output //! \~russian Условно добавляет новую строку PICout & newLine(); //! \~english Write raw data //! \~russian Пишет сырые символы PICout & write(const char * str, int len); //! \~english Write raw \a PIString //! \~russian Пишет сырой \a PIString PICout & writePIString(const PIString & s); //! \~english Output \a PIString to stdout //! \~russian Вывод \a PIString в stdout static void stdoutPIString(const PIString & s); //! \~english Set output device to \a PICout::Buffer and if "clear" clear it //! \~russian Устанавливает устройство вывода на \a PICout::Buffer и если "clear" то очищает его static bool setBufferActive(bool on, bool clear = false); //! \~english Equivalent to \a isOutputDeviceActive(OutputDevice) //! \~russian Аналог \a isOutputDeviceActive(OutputDevice) static bool isBufferActive(); //! \~english Returns internal PIString buffer and if "clear" clear it //! \~russian Возвращает внутренний PIString буфер и если "clear" то очищает его static PIString buffer(bool clear = false); //! \~english Clear internal PIString buffer //! \~russian Очищает внутренний PIString буфер static void clearBuffer(); //! \~english Set output to device "d" enabled "on". Returns if it was enabled //! \~russian Устройство вывода "d" устанавливается в "on". Возвращает было ли устройство активно static bool setOutputDevice(OutputDevice d, bool on = true); //! \~english Set output to devices to "d" //! \~russian Устанавливает устройства вывода "d" static void setOutputDevices(OutputDevices d); //! \~english Returns if output device "d" is active //! \~russian Возвращает активно ли устройство вывода "d" static bool isOutputDeviceActive(OutputDevice d); static PIMutex & __mutex__(); static PIString & __string__(); private: void init(); void applyFormat(PICoutManipulators::PICoutFormat f); static OutputDevices devs; PRIVATE_DECLARATION(PIP_EXPORT) bool fo_, cc_, fc_, act_; int cnb_, attr_, id_; PIString * buffer_; PICoutManipulators::PICoutControls co_; }; #endif // PICOUT_H