diff --git a/src/highlighters.cc b/src/highlighters.cc index 409e07dd..676e3b56 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -128,7 +128,7 @@ HighlighterAndId colorize_regex_factory(const HighlighterParameters params, cons ColorSpec colors; for (auto it = params.begin() + 1; it != params.end(); ++it) { - boost::match_results res; + boost::smatch res; if (not boost::regex_match(it->begin(), it->end(), res, color_spec_ex)) throw runtime_error("wrong colorspec: '" + *it + "' expected :[,]"); diff --git a/src/input_handler.cc b/src/input_handler.cc index 3e5c30c9..ddc3035d 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -500,7 +500,7 @@ static BufferCompletion complete_opt(const BufferIterator& pos, OptionManager& o auto& desc = opt[0]; Regex re(R"((\d+):(\d+)@(\d+))"); - boost::match_results match; + boost::smatch match; if (boost::regex_match(desc.begin(), desc.end(), match, re)) { LineCount line = str_to_int(String(match[1].first, match[1].second)) - 1; diff --git a/src/ncurses.cc b/src/ncurses.cc index c7eeffa1..330d9508 100644 --- a/src/ncurses.cc +++ b/src/ncurses.cc @@ -128,7 +128,7 @@ void NCursesUI::redraw() doupdate(); } using Utf8Policy = utf8::InvalidBytePolicy::Pass; -using Utf8Iterator = utf8::utf8_iterator; +using Utf8Iterator = utf8::utf8_iterator; void addutf8str(WINDOW* win, Utf8Iterator begin, Utf8Iterator end) { waddstr(win, std::string(begin.underlying_iterator(), end.underlying_iterator()).c_str()); @@ -290,7 +290,7 @@ void NCursesUI::draw_status() move((int)m_dimensions.line, 0); clrtoeol(); if (m_status_cursor == -1) - addutf8str(stdscr, m_status_line.begin(), m_status_line.end()); + addutf8str(stdscr, m_status_line.cbegin(), m_status_line.cend()); else { Utf8Iterator begin{m_status_line.begin()}; @@ -298,7 +298,7 @@ void NCursesUI::draw_status() Utf8Iterator cursor_it{begin}; cursor_it.advance(m_status_cursor, end); - addutf8str(stdscr, m_status_line.begin(), cursor_it); + addutf8str(stdscr, m_status_line.cbegin(), cursor_it); set_attribute(A_REVERSE, 1); if (cursor_it == end) addch(' '); @@ -345,8 +345,8 @@ void NCursesUI::draw_menu() wattron(m_menu_win, COLOR_PAIR(menu_fg)); auto& choice = m_choices[choice_idx]; - auto begin = choice.begin(); - auto end = utf8::advance(begin, choice.end(), column_width); + auto begin = choice.cbegin(); + auto end = utf8::advance(begin, choice.cend(), column_width); addutf8str(m_menu_win, begin, end); for (auto pad = column_width - utf8::distance(begin, end); pad > 0; --pad) waddch(m_menu_win, ' '); diff --git a/src/option_types.cc b/src/option_types.cc index 89289752..bacf4562 100644 --- a/src/option_types.cc +++ b/src/option_types.cc @@ -31,7 +31,7 @@ void option_from_string(const String& str, LineAndFlag& opt) { static Regex re{R"((\d+):(\w+):(.+))"}; - boost::match_results res; + boost::smatch res; if (not boost::regex_match(str.begin(), str.end(), res, re)) throw runtime_error("wrong syntax, expected ::"); diff --git a/src/shell_manager.cc b/src/shell_manager.cc index 31ff0b1b..dce3a13a 100644 --- a/src/shell_manager.cc +++ b/src/shell_manager.cc @@ -79,8 +79,8 @@ String ShellManager::pipe(const String& input, dup2(error_pipe[1], 2); close(error_pipe[1]); dup2(write_pipe[0], 0); close(write_pipe[0]); - boost::regex_iterator it(cmdline.begin(), cmdline.end(), m_regex); - boost::regex_iterator end; + boost::regex_iterator it(cmdline.begin(), cmdline.end(), m_regex); + boost::regex_iterator end; while (it != end) { diff --git a/src/string.cc b/src/string.cc index 2152cb15..8664ce16 100644 --- a/src/string.cc +++ b/src/string.cc @@ -51,8 +51,8 @@ std::vector split(const String& str, char separator) String String::replace(const String& expression, const String& replacement) const { - boost::regex re(expression.m_content); - return String(boost::regex_replace(m_content, re, replacement.m_content)); + boost::regex re(expression); + return String(boost::regex_replace(*this, re, replacement)); } } diff --git a/src/string.hh b/src/string.hh index 50926787..ec376fd8 100644 --- a/src/string.hh +++ b/src/string.hh @@ -13,49 +13,39 @@ namespace Kakoune typedef boost::regex Regex; -class String +class String : public std::string { public: String() {} - String(const char* content) : m_content(content) {} - String(std::string content) : m_content(std::move(content)) {} - String(const String& string) = default; - String(String&& string) = default; - explicit String(char content, CharCount count = 1) : m_content((size_t)(int)count, content) {} - explicit String(Codepoint cp, CharCount count = 1) - { - std::string str; - utf8::dump(back_inserter(str), cp); - for (CharCount i = 0; i < count; ++i) - m_content += str; - } + String(const char* content) : std::string(content) {} + String(std::string content) : std::string(std::move(content)) {} + explicit String(char content, CharCount count = 1) : std::string((size_t)(int)count, content) {} + explicit String(Codepoint cp, CharCount count = 1) { utf8::dump(back_inserter(*this), cp); } template - String(Iterator begin, Iterator end) : m_content(begin, end) {} + String(Iterator begin, Iterator end) : std::string(begin, end) {} - char operator[](ByteCount pos) const { return m_content[(int)pos]; } - ByteCount length() const { return m_content.length(); } + std::string& stdstr() { return *this; } + const std::string& stdstr() const { return *this; } + + char operator[](ByteCount pos) const { return std::string::operator[]((int)pos); } + char& operator[](ByteCount pos) { return std::string::operator[]((int)pos); } + ByteCount length() const { return ByteCount{(int)std::string::length()}; } CharCount char_length() const { return utf8::distance(begin(), end()); } ByteCount byte_count_to(CharCount count) const { return utf8::advance(begin(), end(), (int)count) - begin(); } CharCount char_count_to(ByteCount count) const { return utf8::distance(begin(), begin() + (int)count); } - bool empty() const { return m_content.empty(); } - bool operator== (const String& other) const { return m_content == other.m_content; } - bool operator!= (const String& other) const { return m_content != other.m_content; } - bool operator< (const String& other) const { return m_content < other.m_content; } + String operator+(const String& other) const { return String{stdstr() + other.stdstr()}; } + String& operator+=(const String& other) { std::string::operator+=(other); return *this; } + String operator+(const char* other) const { return String{stdstr() + other}; } + String& operator+=(const char* other) { std::string::operator+=(other); return *this; } + String operator+(char other) const { return String{stdstr() + other}; } + String& operator+=(char other) { std::string::operator+=(other); return *this; } + String operator+(Codepoint cp) const { String res = *this; utf8::dump(back_inserter(res), cp); return res; } + String& operator+=(Codepoint cp) { utf8::dump(back_inserter(*this), cp); return *this; } - String& operator= (const String& other) { m_content = other.m_content; return *this; } - String& operator= (String&& other) { m_content = std::move(other.m_content); return *this; } + memoryview data() const { return memoryview(std::string::data(), size()); } - String operator+ (const String& other) const { return String(m_content + other.m_content); } - String& operator+= (const String& other) { m_content += other.m_content; return *this; } - - String operator+ (char c) const { return String(m_content + c); } - String& operator+= (char c) { m_content += c; return *this; } - - memoryview data() const { return memoryview(m_content.data(), m_content.size()); } - const char* c_str() const { return m_content.c_str(); } - - String substr(ByteCount pos, ByteCount length = -1) const { return String(m_content.substr((int)pos, (int)length)); } + String substr(ByteCount pos, ByteCount length = -1) const { return String{std::string::substr((int)pos, (int)length)}; } String substr(CharCount pos, CharCount length = INT_MAX) const { auto b = utf8::advance(begin(), end(), (int)pos); @@ -63,31 +53,6 @@ public: return String(b,e); } String replace(const String& expression, const String& replacement) const; - - using iterator = std::string::const_iterator; - using riterator = std::string::const_reverse_iterator; - - iterator begin() const { return m_content.begin(); } - iterator end() const { return m_content.end(); } - riterator rbegin() const { return m_content.rbegin(); } - riterator rend() const { return m_content.rend(); } - - char front() const { return m_content.front(); } - char back() const { return m_content.back(); } - char& front() { return m_content.front(); } - char& back() { return m_content.back(); } - - size_t hash() const { return std::hash()(m_content); } - - inline friend std::ostream& operator<<(std::ostream& os, const String& str) - { - return os << str.m_content; - } - - enum { npos = -1 }; - -private: - std::string m_content; }; inline String operator+(const char* lhs, const String& rhs) @@ -100,6 +65,12 @@ inline String operator+(char lhs, const String& rhs) return String(lhs) + rhs; } +inline String operator+(Codepoint lhs, const String& rhs) +{ + return String(lhs) + rhs; +} + + String int_to_str(int value); int str_to_int(const String& str); std::vector split(const String& str, char separator); @@ -121,11 +92,11 @@ inline String codepoint_to_str(Codepoint cp) namespace std { template<> - struct hash + struct hash : hash { size_t operator()(const Kakoune::String& str) const { - return str.hash(); + return hash::operator()(str); } }; }