Fix quadratic runtime when linebreaking strings without newlines

The problem was that every line would iterate from current line
start position to the end of the string, looking for a newline
to break on, leading to accidentally quadratic runtime. With this
change, the code only ever searches up to the current line's
length and not more.

Credit to @jorgenpt for the fix suggestion.

Closes #2315
This commit is contained in:
Martin Hořeňovský 2021-11-04 00:22:50 +01:00
parent 931f41b4d6
commit 912df7df35
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A

View File

@ -6,6 +6,8 @@
// SPDX-License-Identifier: BSL-1.0 // SPDX-License-Identifier: BSL-1.0
#include <catch2/internal/catch_textflow.hpp> #include <catch2/internal/catch_textflow.hpp>
#include <algorithm>
#include <cstring> #include <cstring>
#include <ostream> #include <ostream>
@ -41,13 +43,16 @@ namespace Catch {
void Column::const_iterator::calcLength() { void Column::const_iterator::calcLength() {
m_addHyphen = false; m_addHyphen = false;
const auto maxLineLength = m_column.m_width - indentSize();
m_parsedTo = m_lineStart; m_parsedTo = m_lineStart;
std::string const& current_line = m_column.m_string; std::string const& current_line = m_column.m_string;
if ( current_line[m_lineStart] == '\n' ) { if ( current_line[m_lineStart] == '\n' ) {
++m_parsedTo; ++m_parsedTo;
} }
while ( m_parsedTo < current_line.size() &&
const auto maxLineLength = m_column.m_width - indentSize();
const auto maxParseTo = std::min(current_line.size(), m_lineStart + maxLineLength);
while ( m_parsedTo < maxParseTo &&
current_line[m_parsedTo] != '\n' ) { current_line[m_parsedTo] != '\n' ) {
++m_parsedTo; ++m_parsedTo;
} }