diff options
| author | Leitwolf | 2026-10-25 10:31:36 +0300 |
|---|---|---|
| committer | GitHub | 2026-10-25 10:31:36 +0300 |
| commit | d2e3e074bb2e1b8ffd9fc990d0b87667ea602f58 (patch) | |
| tree | 0bce4462b2e190c39b3e1c5f697e3e4abd1a5e2a /src/Progmasoft/Catch3/Message.cpp | |
| parent | 13f81a480a93807c14dddb5abdb97355ced4d4c5 (diff) | |
| parent | 126dc333564cb72b5115d9a9242d66694694b6d0 (diff) | |
| download | catch3-d2e3e074bb2e1b8ffd9fc990d0b87667ea602f58.tar.gz | |
Merge pull request #18 from Progmasoft/build/catch3-identity
Give Catch3 its own build names and headers
Diffstat (limited to 'src/Progmasoft/Catch3/Message.cpp')
| -rw-r--r-- | src/Progmasoft/Catch3/Message.cpp | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/Progmasoft/Catch3/Message.cpp b/src/Progmasoft/Catch3/Message.cpp new file mode 100644 index 00000000..257bdbb2 --- /dev/null +++ b/src/Progmasoft/Catch3/Message.cpp @@ -0,0 +1,122 @@ + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 + +#include <Progmasoft/Catch3/Message.hpp> +#include <Progmasoft/Catch3/Internal/Enforce.hpp> +#include <Progmasoft/Catch3/Internal/MoveAndForward.hpp> + +#include <cassert> +#include <stack> + +namespace Catch { + + //////////////////////////////////////////////////////////////////////////// + + + ScopedMessage::ScopedMessage( MessageBuilder&& builder ): + m_messageId( builder.m_info.sequence ) { + MessageInfo info( CATCH_MOVE( builder.m_info ) ); + info.message = builder.m_stream.str(); + Detail::pushScopedMessage( CATCH_MOVE( info ) ); + } + + ScopedMessage::ScopedMessage( ScopedMessage&& old ) noexcept: + m_messageId( old.m_messageId ) { + old.m_moved = true; + } + + ScopedMessage::~ScopedMessage() { + if ( !m_moved ) { Detail::popScopedMessage( m_messageId ); } + } + + + Capturer::Capturer( StringRef macroName, + SourceLineInfo const& lineInfo, + ResultWas::OfType resultType, + StringRef names, + bool isScoped): + m_isScoped(isScoped) { + auto trimmed = [&] (size_t start, size_t end) { + while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) { + ++start; + } + while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) { + --end; + } + return names.substr(start, end - start + 1); + }; + auto skipq = [&] (size_t start, char quote) { + for (auto i = start + 1; i < names.size() ; ++i) { + if (names[i] == quote) + return i; + if (names[i] == '\\') + ++i; + } + CATCH_INTERNAL_ERROR("CAPTURE parsing encountered unmatched quote"); + }; + + size_t start = 0; + std::stack<char> openings; + for (size_t pos = 0; pos < names.size(); ++pos) { + char c = names[pos]; + switch (c) { + case '[': + case '{': + case '(': + // It is basically impossible to disambiguate between + // comparison and start of template args in this context +// case '<': + openings.push(c); + break; + case ']': + case '}': + case ')': +// case '>': + openings.pop(); + break; + case '"': + case '\'': + pos = skipq(pos, c); + break; + case ',': + if (start != pos && openings.empty()) { + m_messages.emplace_back(macroName, lineInfo, resultType); + m_messages.back().message += trimmed(start, pos); + m_messages.back().message += " := "_sr; + start = pos; + } + break; + default:; // noop + } + } + assert(openings.empty() && "Mismatched openings"); + m_messages.emplace_back(macroName, lineInfo, resultType); + m_messages.back().message += trimmed(start, names.size() - 1); + m_messages.back().message += " := "_sr; + } + Capturer::~Capturer() { + assert( m_captured == m_messages.size() ); + if ( m_isScoped ) { + for ( auto const& message : m_messages ) { + Detail::popScopedMessage( message.sequence ); + } + } + } + + void Capturer::captureValue( size_t index, std::string const& value ) { + assert( index < m_messages.size() ); + m_messages[index].message += value; + if ( m_isScoped ) { + Detail::pushScopedMessage( CATCH_MOVE( m_messages[index] ) ); + } else { + Detail::addUnscopedMessage( CATCH_MOVE( m_messages[index] ) ); + } + m_captured++; + } + +} // end namespace Catch |