SearchHighlight compiles the search pattern once per frame and yields each line's match ranges; the terminal, ImGui and Qt renderers had three copies of this, and Qt compiled a std::regex for every visible line on every frame. Qt now uses kte::Regex like the others. kte::Regex::RunGuarded replaces Command.cc's run_regex_work, which chose the large stack by comparing engine names. ForEachRegexMatch had no callers left and is removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015rcVQiiWyTzoNrsvLSaAfB
45 lines
1.1 KiB
C++
45 lines
1.1 KiB
C++
/*
|
|
* SearchHighlight.h - the search-match ranges every renderer highlights.
|
|
*
|
|
* Built once per frame from the editor's search state (the regex, when the
|
|
* regex search or regex replace prompt is up, is compiled here once rather
|
|
* than per line), then asked for each visible line's matches.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <cstddef>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include "RegexEngine.h"
|
|
|
|
class Editor;
|
|
|
|
namespace kte {
|
|
class SearchHighlight {
|
|
public:
|
|
explicit SearchHighlight(const Editor &ed);
|
|
|
|
// Whether a search is up with a non-empty query.
|
|
[[nodiscard]] bool Active() const
|
|
{
|
|
return active_;
|
|
}
|
|
|
|
// The matches in one line as [start, end) byte ranges, ordered and not
|
|
// overlapping. Nothing for an invalid pattern (the status line shows the
|
|
// error) or, in regex mode, a line longer than
|
|
// Regex::IncrementalLineLimit().
|
|
void Ranges(std::string_view line, std::vector<std::pair<std::size_t, std::size_t> > &out) const;
|
|
|
|
private:
|
|
bool active_ = false;
|
|
bool regex_ = false;
|
|
bool rx_valid_ = false;
|
|
std::string query_;
|
|
Regex rx_;
|
|
};
|
|
} // namespace kte
|