Function Capturer

Synopsis

#include <include/internal/catch_message.h>

Capturer(StringRef macroName, SourceLineInfo const &lineInfo, ResultWas::OfType resultType, StringRef names)

Description

No description yet.

Source

Lines 70-126 in include/internal/catch_message.cpp. Line 80 in include/internal/catch_message.h.

Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {
    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 = static_cast<std::string>(trimmed(start, pos));
                m_messages.back().message += " := ";
                start = pos;
            }
        }
    }
    assert(openings.empty() && "Mismatched openings");
    m_messages.emplace_back(macroName, lineInfo, resultType);
    m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1));
    m_messages.back().message += " := ";
}





Add Discussion as Guest

Log in