diff --git a/src/strbuffer.h b/src/strbuffer.h index 4157842b..7f6772a5 100644 --- a/src/strbuffer.h +++ b/src/strbuffer.h @@ -27,241 +27,244 @@ #include -namespace NCurses +namespace NCurses { + +/// Buffer template class that can store text along with its +/// format attributes. The content can be easily printed to +/// window or taken as raw string at any time. +/// +template class basic_buffer { - /// Buffer template class that can store text along with its - /// format attributes. The content can be easily printed to - /// window or taken as raw string at any time. + /// Struct used for storing information about + /// one color/format flag along with its position /// - template class basic_buffer + struct FormatPos { - /// Struct used for storing information about - /// one color/format flag along with its position - /// - struct FormatPos + size_t Position; + short Value; + + bool operator<(const FormatPos &f) { - size_t Position; - short Value; - - bool operator<(const FormatPos &f) - { - return Position < f.Position; - } - - bool operator==(const FormatPos &f) - { - return Position == f.Position && Value == f.Value; - } - }; + return Position < f.Position; + } - /// Internal buffer for storing raw text - /// - std::basic_string itsString; - - /// List used for storing formatting informations - /// - std::list itsFormat; - - /// Pointer to temporary string - /// @see SetTemp() - /// - std::basic_string *itsTempString; - - public: - /// Constructs an empty buffer - /// - basic_buffer() : itsTempString(0) { } - - /// Constructs a buffer from the existed one - /// @param b copied buffer - /// - basic_buffer(const basic_buffer &b); - - /// @return raw content of the buffer without formatting informations - /// - const std::basic_string &Str() const; - - /// Searches for given string in buffer and sets format/color at the - /// beginning and end of it using val_b and val_e flags accordingly - /// @param val_b flag set at the beginning of found occurence of string - /// @param s string that function seaches for - /// @param val_e flag set at the end of found occurence of string - /// @param case_sensitive indicates whether algorithm should care about case sensitivity - /// @param for_each indicates whether function searches through whole buffer and sets - /// the format for all occurences of given string or stops after the first one - /// @return true if at least one occurence of the string was found, false otherwise - /// - bool SetFormatting(short val_b, std::basic_string s, short val_e, - bool case_sensitive, bool for_each = 1); - - /// Searches for given string in buffer and removes given - /// format/color from the beginning and end of its occurence - /// @param val_b flag to be removed from the beginning of the string - /// @param s string that function seaches for - /// @param val_e flag to be removed from the end of the string - /// @param case_sensitive indicates whether algorithm should care about case sensitivity - /// @param for_each indicates whether function searches through whole buffer and removes - /// given format from all occurences of given string or stops after the first one - /// - void RemoveFormatting(short val_b, std::basic_string pattern, short val_e, - bool case_sensitive, bool for_each = 1); - - /// Removes all formating applied to string in buffer. - /// - void RemoveFormatting(); - - /// Sets the pointer to string, that will be passed in operator<<() to window - /// object instead of the internal buffer. This is useful if you took the content - /// of the buffer, modified it somehow and want to print the modified version instead - /// of the original one, but with the original formatting informations. Note that after - /// you're done with the printing etc., this pointer has to be set to null. - /// @param tmp address of the temporary string - /// - void SetTemp(std::basic_string *tmp); - - /// Prints to window object given part of the string, loading all needed formatting info - /// and cleaning up after. The main goal of this function is to provide interface for - /// colorful scrollers. - /// @param w window object that we want to print to - /// @param start_pos reference to start position of the string. note that this variable is - /// incremented by one after each call or set to 0 if end of string is reached - /// @param width width of the string to be printed - /// @param separator additional text to be placed between the end and the beginning of - /// the string - /// - void Write(Window &w, size_t &start_pos, size_t width, - const std::basic_string &separator) const; - - /// Clears the content of the buffer and its formatting informations - /// - void Clear(); - - basic_buffer &operator<<(int n) - { - itsString += intTo< std::basic_string >::apply(n); - return *this; - } - - basic_buffer &operator<<(long int n) - { - itsString += longIntTo< std::basic_string >::apply(n); - return *this; - } - - basic_buffer &operator<<(unsigned int n) - { - itsString += unsignedIntTo< std::basic_string >::apply(n); - return *this; - } - - basic_buffer &operator<<(unsigned long int n) - { - itsString += unsignedLongIntTo< std::basic_string >::apply(n); - return *this; - } - - basic_buffer &operator<<(char c) - { - itsString += c; - return *this; - } - - basic_buffer &operator<<(wchar_t wc) - { - itsString += wc; - return *this; - } - - basic_buffer &operator<<(const C *s) - { - itsString += s; - return *this; - } - - basic_buffer &operator<<(const std::basic_string &s) - { - itsString += s; - return *this; - } - - /// Handles colors - /// @return reference to itself - /// - basic_buffer &operator<<(Color color); - - /// Handles format flags - /// @return reference to itself - /// - basic_buffer &operator<<(Format f); - - /// Handles copying one buffer to another using operator<<() - /// @param buf buffer to be copied - /// @return reference to itself - /// - basic_buffer &operator<<(const basic_buffer &buf); - - /// Friend operator that handles printing - /// the content of buffer to window object - friend Window &operator<<(Window &w, const basic_buffer &buf) - { - const std::basic_string &s = buf.itsTempString ? *buf.itsTempString : buf.itsString; - if (buf.itsFormat.empty()) - w << s; - else - { - std::basic_string tmp; - auto b = buf.itsFormat.begin(), e = buf.itsFormat.end(); - for (size_t i = 0; i < s.length() || b != e; ++i) - { - while (b != e && i == b->Position) - { - if (!tmp.empty()) - { - w << tmp; - tmp.clear(); - } - buf.LoadAttribute(w, b->Value); - b++; - } - if (i < s.length()) - tmp += s[i]; - } - if (!tmp.empty()) - w << tmp; - } - return w; - } - - private: - /// Loads an attribute to given window object - /// @param w window object we want to load attribute to - /// @param value value of attribute to be loaded - /// - void LoadAttribute(Window &w, short value) const; + bool operator==(const FormatPos &f) + { + return Position == f.Position && Value == f.Value; + } }; - /// Standard buffer that uses narrow characters + /// Internal buffer for storing raw text /// - typedef basic_buffer Buffer; + std::basic_string itsString; - /// Standard buffer that uses wide characters + /// List used for storing formatting informations /// - typedef basic_buffer WBuffer; -} + std::list itsFormat; + + /// Pointer to temporary string + /// @see SetTemp() + /// + std::basic_string *itsTempString; + + public: + /// Constructs an empty buffer + /// + basic_buffer() : itsTempString(0) { } + + /// Constructs a buffer from the existed one + /// @param b copied buffer + /// + basic_buffer(const basic_buffer &b); + + /// @return raw content of the buffer without formatting informations + /// + const std::basic_string &Str() const; + + /// Searches for given string in buffer and sets format/color at the + /// beginning and end of it using val_b and val_e flags accordingly + /// @param val_b flag set at the beginning of found occurence of string + /// @param s string that function seaches for + /// @param val_e flag set at the end of found occurence of string + /// @param case_sensitive indicates whether algorithm should care about case sensitivity + /// @param for_each indicates whether function searches through whole buffer and sets + /// the format for all occurences of given string or stops after the first one + /// @return true if at least one occurence of the string was found, false otherwise + /// + bool SetFormatting(short val_b, std::basic_string s, short val_e, + bool case_sensitive, bool for_each = 1); + + /// Searches for given string in buffer and removes given + /// format/color from the beginning and end of its occurence + /// @param val_b flag to be removed from the beginning of the string + /// @param s string that function seaches for + /// @param val_e flag to be removed from the end of the string + /// @param case_sensitive indicates whether algorithm should care about case sensitivity + /// @param for_each indicates whether function searches through whole buffer and removes + /// given format from all occurences of given string or stops after the first one + /// + void RemoveFormatting(short val_b, std::basic_string pattern, short val_e, + bool case_sensitive, bool for_each = 1); + + /// Removes all formating applied to string in buffer. + /// + void RemoveFormatting(); + + /// Sets the pointer to string, that will be passed in operator<<() to window + /// object instead of the internal buffer. This is useful if you took the content + /// of the buffer, modified it somehow and want to print the modified version instead + /// of the original one, but with the original formatting informations. Note that after + /// you're done with the printing etc., this pointer has to be set to null. + /// @param tmp address of the temporary string + /// + void SetTemp(std::basic_string *tmp); + + /// Prints to window object given part of the string, loading all needed formatting info + /// and cleaning up after. The main goal of this function is to provide interface for + /// colorful scrollers. + /// @param w window object that we want to print to + /// @param start_pos reference to start position of the string. note that this variable is + /// incremented by one after each call or set to 0 if end of string is reached + /// @param width width of the string to be printed + /// @param separator additional text to be placed between the end and the beginning of + /// the string + /// + void Write(Window &w, size_t &start_pos, size_t width, + const std::basic_string &separator) const; + + /// Clears the content of the buffer and its formatting informations + /// + void Clear(); + + basic_buffer &operator<<(int n) + { + itsString += intTo< std::basic_string >::apply(n); + return *this; + } + + basic_buffer &operator<<(long int n) + { + itsString += longIntTo< std::basic_string >::apply(n); + return *this; + } + + basic_buffer &operator<<(unsigned int n) + { + itsString += unsignedIntTo< std::basic_string >::apply(n); + return *this; + } + + basic_buffer &operator<<(unsigned long int n) + { + itsString += unsignedLongIntTo< std::basic_string >::apply(n); + return *this; + } + + basic_buffer &operator<<(char c) + { + itsString += c; + return *this; + } + + basic_buffer &operator<<(wchar_t wc) + { + itsString += wc; + return *this; + } + + basic_buffer &operator<<(const C *s) + { + itsString += s; + return *this; + } + + basic_buffer &operator<<(const std::basic_string &s) + { + itsString += s; + return *this; + } + + /// Handles colors + /// @return reference to itself + /// + basic_buffer &operator<<(Color color); + + /// Handles format flags + /// @return reference to itself + /// + basic_buffer &operator<<(Format f); + + /// Handles copying one buffer to another using operator<<() + /// @param buf buffer to be copied + /// @return reference to itself + /// + basic_buffer &operator<<(const basic_buffer &buf); + + /// Friend operator that handles printing + /// the content of buffer to window object + friend Window &operator<<(Window &w, const basic_buffer &buf) + { + const std::basic_string &s = buf.itsTempString ? *buf.itsTempString : buf.itsString; + if (buf.itsFormat.empty()) + w << s; + else + { + std::basic_string tmp; + auto b = buf.itsFormat.begin(), e = buf.itsFormat.end(); + for (size_t i = 0; i < s.length() || b != e; ++i) + { + while (b != e && i == b->Position) + { + if (!tmp.empty()) + { + w << tmp; + tmp.clear(); + } + buf.LoadAttribute(w, b->Value); + b++; + } + if (i < s.length()) + tmp += s[i]; + } + if (!tmp.empty()) + w << tmp; + } + return w; + } + + private: + /// Loads an attribute to given window object + /// @param w window object we want to load attribute to + /// @param value value of attribute to be loaded + /// + void LoadAttribute(Window &w, short value) const; +}; -template NCurses::basic_buffer::basic_buffer(const basic_buffer &b) : itsString(b.itsString), itsFormat(b.itsFormat), itsTempString(b.itsTempString) { } +/// Standard buffer that uses narrow characters +/// +typedef basic_buffer Buffer; -template const std::basic_string &NCurses::basic_buffer::Str() const +/// Standard buffer that uses wide characters +/// +typedef basic_buffer WBuffer; + + + +template basic_buffer::basic_buffer(const basic_buffer &b) + : itsString(b.itsString), itsFormat(b.itsFormat), itsTempString(b.itsTempString) { } + +template const std::basic_string &basic_buffer::Str() const { return itsString; } -template bool NCurses::basic_buffer::SetFormatting( short val_b, - std::basic_string s, - short val_e, - bool case_sensitive, - bool for_each - ) +template bool basic_buffer::SetFormatting( + short val_b, + std::basic_string s, + short val_e, + bool case_sensitive, + bool for_each + ) { if (s.empty()) return false; @@ -290,12 +293,13 @@ template bool NCurses::basic_buffer::SetFormatting( short val_b, return result; } -template void NCurses::basic_buffer::RemoveFormatting( short val_b, - std::basic_string pattern, - short val_e, - bool case_sensitive, - bool for_each - ) +template void basic_buffer::RemoveFormatting( + short val_b, + std::basic_string pattern, + short val_e, + bool case_sensitive, + bool for_each + ) { if (pattern.empty()) return; @@ -320,21 +324,22 @@ template void NCurses::basic_buffer::RemoveFormatting( short val } } -template void NCurses::basic_buffer::RemoveFormatting() +template void basic_buffer::RemoveFormatting() { itsFormat.clear(); } -template void NCurses::basic_buffer::SetTemp(std::basic_string *tmp) +template void basic_buffer::SetTemp(std::basic_string *tmp) { itsTempString = tmp; } -template void NCurses::basic_buffer::Write( Window &w, - size_t &start_pos, - size_t width, - const std::basic_string &separator - ) const +template void basic_buffer::Write( + Window &w, + size_t &start_pos, + size_t width, + const std::basic_string &separator + ) const { std::basic_string s = itsString; size_t len = Window::Length(s); @@ -387,21 +392,21 @@ template void NCurses::basic_buffer::Write( Window &w, w << *this; } -template void NCurses::basic_buffer::Clear() +template void basic_buffer::Clear() { itsString.clear(); itsFormat.clear(); } -template void NCurses::basic_buffer::LoadAttribute(Window &w, short value) const +template void basic_buffer::LoadAttribute(Window &w, short value) const { - if (value < NCurses::fmtNone) - w << NCurses::Color(value); + if (value < fmtNone) + w << Color(value); else - w << NCurses::Format(value); + w << Format(value); } -template NCurses::basic_buffer &NCurses::basic_buffer::operator<<(Color color) +template basic_buffer &basic_buffer::operator<<(Color color) { FormatPos f; f.Position = itsString.length(); @@ -410,12 +415,12 @@ template NCurses::basic_buffer &NCurses::basic_buffer::operat return *this; } -template NCurses::basic_buffer &NCurses::basic_buffer::operator<<(Format f) +template basic_buffer &basic_buffer::operator<<(Format f) { return operator<<(Color(f)); } -template NCurses::basic_buffer &NCurses::basic_buffer::operator<<(const NCurses::basic_buffer &buf) +template basic_buffer &basic_buffer::operator<<(const basic_buffer &buf) { size_t length = itsString.length(); itsString += buf.itsString; @@ -427,4 +432,6 @@ template NCurses::basic_buffer &NCurses::basic_buffer::operat return *this; } +} + #endif