14void ReplaceAll(std::string& in_out,
const std::string& search,
const std::string& substitute)
16 if (search.empty())
return;
17 in_out = std::regex_replace(in_out, std::regex(search), substitute);
21 : m_str{str}, m_max_line_length{max_line_length}, m_it{str.begin()} {}
29 const auto line_start =
m_it;
32 const bool new_line{*
m_it ==
'\n'};
37 std::string_view line{line_start,
m_it - 1};
38 if (!line.empty() && line.back() ==
'\r')
39 line.remove_suffix(1);
48 throw std::runtime_error(
"max_line_length exceeded by LineReader");
61 if (len == 0)
return {};
62 if (
Remaining() < len)
throw std::runtime_error(
"Not enough data in buffer");
63 std::string_view
out(std::to_address(
m_it), len);
75 return std::distance(
m_str.begin(),
m_it);
const size_t m_max_line_length
size_t Consumed() const
Returns number of bytes already read from buffer.
std::optional< std::string_view > ReadLine() LIFETIMEBOUND
Returns a string from current iterator position up to (but not including) next and advances iterator...
size_t Remaining() const
Returns remaining size of bytes in buffer.
const std::string_view m_str
LineReader(std::string_view str, size_t max_line_length)
std::string_view ReadLength(size_t len) LIFETIMEBOUND
Returns string from current iterator position of specified length if possible and advances iterator o...
std::string_view::iterator m_it
void ReplaceAll(std::string &in_out, const std::string &search, const std::string &substitute)