mirror of
https://github.com/catchorg/Catch2.git
synced 2024-12-23 03:43:28 +01:00
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:
parent
931f41b4d6
commit
912df7df35
@ -6,6 +6,8 @@
|
||||
|
||||
// SPDX-License-Identifier: BSL-1.0
|
||||
#include <catch2/internal/catch_textflow.hpp>
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstring>
|
||||
#include <ostream>
|
||||
|
||||
@ -41,13 +43,16 @@ namespace Catch {
|
||||
|
||||
void Column::const_iterator::calcLength() {
|
||||
m_addHyphen = false;
|
||||
const auto maxLineLength = m_column.m_width - indentSize();
|
||||
m_parsedTo = m_lineStart;
|
||||
|
||||
std::string const& current_line = m_column.m_string;
|
||||
if ( current_line[m_lineStart] == '\n' ) {
|
||||
++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' ) {
|
||||
++m_parsedTo;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user