Compare commits

...

3 Commits

Author SHA1 Message Date
Martin Hořeňovský
cd93d202e0 Small refactoring in CAPTURE parsing 2025-08-26 12:40:13 +02:00
Martin Hořeňovský
227af796b4 Move MessageInfos into the run context
Together with the previous change, this means that `ScopedMessage`
only needs to keep around a single unsigned int.
2025-08-26 12:37:52 +02:00
Martin Hořeňovský
33adb4c779 Use only the ID of a message when removing it from context 2025-08-26 12:07:41 +02:00
6 changed files with 24 additions and 24 deletions

View File

@@ -19,20 +19,19 @@ namespace Catch {
ScopedMessage::ScopedMessage( MessageBuilder&& builder ): ScopedMessage::ScopedMessage( MessageBuilder&& builder ):
m_info( CATCH_MOVE(builder.m_info) ) { m_messageId( builder.m_info.sequence ) {
m_info.message = builder.m_stream.str(); MessageInfo info( CATCH_MOVE( builder.m_info ) );
getResultCapture().pushScopedMessage( m_info ); info.message = builder.m_stream.str();
getResultCapture().pushScopedMessage( CATCH_MOVE(info) );
} }
ScopedMessage::ScopedMessage( ScopedMessage&& old ) noexcept: ScopedMessage::ScopedMessage( ScopedMessage&& old ) noexcept:
m_info( CATCH_MOVE( old.m_info ) ) { m_messageId( old.m_messageId ) {
old.m_moved = true; old.m_moved = true;
} }
ScopedMessage::~ScopedMessage() { ScopedMessage::~ScopedMessage() {
if ( !m_moved ){ if ( !m_moved ) { getResultCapture().popScopedMessage( m_messageId ); }
getResultCapture().popScopedMessage(m_info);
}
} }
@@ -86,8 +85,8 @@ namespace Catch {
case ',': case ',':
if (start != pos && openings.empty()) { if (start != pos && openings.empty()) {
m_messages.emplace_back(macroName, lineInfo, resultType); m_messages.emplace_back(macroName, lineInfo, resultType);
m_messages.back().message = static_cast<std::string>(trimmed(start, pos)); m_messages.back().message += trimmed(start, pos);
m_messages.back().message += " := "; m_messages.back().message += " := "_sr;
start = pos; start = pos;
} }
break; break;
@@ -96,20 +95,20 @@ namespace Catch {
} }
assert(openings.empty() && "Mismatched openings"); assert(openings.empty() && "Mismatched openings");
m_messages.emplace_back(macroName, lineInfo, resultType); m_messages.emplace_back(macroName, lineInfo, resultType);
m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1)); m_messages.back().message += trimmed(start, names.size() - 1);
m_messages.back().message += " := "; m_messages.back().message += " := "_sr;
} }
Capturer::~Capturer() { Capturer::~Capturer() {
assert( m_captured == m_messages.size() ); assert( m_captured == m_messages.size() );
for ( size_t i = 0; i < m_captured; ++i ) { for (auto const& message : m_messages) {
m_resultCapture.popScopedMessage( m_messages[i] ); m_resultCapture.popScopedMessage( message.sequence );
} }
} }
void Capturer::captureValue( size_t index, std::string const& value ) { void Capturer::captureValue( size_t index, std::string const& value ) {
assert( index < m_messages.size() ); assert( index < m_messages.size() );
m_messages[index].message += value; m_messages[index].message += value;
m_resultCapture.pushScopedMessage( m_messages[index] ); m_resultCapture.pushScopedMessage( CATCH_MOVE(m_messages[index]) );
m_captured++; m_captured++;
} }

View File

@@ -57,7 +57,7 @@ namespace Catch {
ScopedMessage( ScopedMessage&& old ) noexcept; ScopedMessage( ScopedMessage&& old ) noexcept;
~ScopedMessage(); ~ScopedMessage();
MessageInfo m_info; unsigned int m_messageId;
bool m_moved = false; bool m_moved = false;
}; };

View File

@@ -62,8 +62,8 @@ namespace Catch {
virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0; virtual void benchmarkEnded( BenchmarkStats<> const& stats ) = 0;
virtual void benchmarkFailed( StringRef error ) = 0; virtual void benchmarkFailed( StringRef error ) = 0;
virtual void pushScopedMessage( MessageInfo const& message ) = 0; virtual void pushScopedMessage( MessageInfo&& message ) = 0;
virtual void popScopedMessage( MessageInfo const& message ) = 0; virtual void popScopedMessage( unsigned int messageId ) = 0;
virtual void emplaceUnscopedMessage( MessageBuilder&& builder ) = 0; virtual void emplaceUnscopedMessage( MessageBuilder&& builder ) = 0;

View File

@@ -26,6 +26,7 @@ namespace Catch {
std::string message; std::string message;
SourceLineInfo lineInfo; SourceLineInfo lineInfo;
ResultWas::OfType type; ResultWas::OfType type;
// The "ID" of the message, used to know when to remove it from reporter context.
unsigned int sequence; unsigned int sequence;
DEPRECATED( "Explicitly use the 'sequence' member instead" ) DEPRECATED( "Explicitly use the 'sequence' member instead" )

View File

@@ -483,11 +483,11 @@ namespace Catch {
m_reporter->benchmarkFailed( error ); m_reporter->benchmarkFailed( error );
} }
void RunContext::pushScopedMessage( MessageInfo const& message ) { void RunContext::pushScopedMessage( MessageInfo&& message ) {
Detail::g_messages.push_back( message ); Detail::g_messages.push_back( CATCH_MOVE(message) );
} }
void RunContext::popScopedMessage( MessageInfo const& message ) { void RunContext::popScopedMessage( unsigned int messageId ) {
// Note: On average, it would probably be better to look for the message // Note: On average, it would probably be better to look for the message
// backwards. However, we do not expect to have to deal with more // backwards. However, we do not expect to have to deal with more
// messages than low single digits, so the optimization is tiny, // messages than low single digits, so the optimization is tiny,
@@ -496,8 +496,8 @@ namespace Catch {
Detail::g_messages.erase( Detail::g_messages.erase(
std::find_if( Detail::g_messages.begin(), std::find_if( Detail::g_messages.begin(),
Detail::g_messages.end(), Detail::g_messages.end(),
[id = message.sequence]( MessageInfo const& msg ) { [=]( MessageInfo const& msg ) {
return msg.sequence == id; return msg.sequence == messageId;
} ) ); } ) );
} }

View File

@@ -94,8 +94,8 @@ namespace Catch {
void benchmarkEnded( BenchmarkStats<> const& stats ) override; void benchmarkEnded( BenchmarkStats<> const& stats ) override;
void benchmarkFailed( StringRef error ) override; void benchmarkFailed( StringRef error ) override;
void pushScopedMessage( MessageInfo const& message ) override; void pushScopedMessage( MessageInfo&& message ) override;
void popScopedMessage( MessageInfo const& message ) override; void popScopedMessage( unsigned int messageId ) override;
void emplaceUnscopedMessage( MessageBuilder&& builder ) override; void emplaceUnscopedMessage( MessageBuilder&& builder ) override;