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
|
// 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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user