Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

CoPilot comment: Replace `std::smatch` with `std::svmatch` to eliminate temporary string copy in `StdRegexStrategy`

Aperta Adatta ai principianti
#342 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
74/100
Tipo di issue
Refactoring
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
cpp
Ambito
performance

Direzione di ricerca

Leggere cucumber_cpp/library/cucumber_expression/StdRegexStrategy.cpp, iniziando da StdRegexStrategy::Match e dall’estrazione esistente dei gruppi di corrispondenza. Sostituire il percorso basato su una stringa temporanea con l’approccio alla corrispondenza basato sugli iteratori descritto nell’issue, quindi verificare che la corrispondenza e l’estrazione dei gruppi continuino a funzionare senza creare textStr.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

In StdRegexStrategy::Match (cucumber_cpp/library/cucumber_expression/StdRegexStrategy.cpp), the input std::string_view text is currently copied into a local std::string textStr solely because std::regex_search with std::smatch requires lvalue string iterators. This allocation is unnecessary if we switch to std::regex_search overloads that work on arbitrary iterator ranges paired with std::match_results<std::string_view::const_iterator> (aka std::svmatch in C++20, or std::match_results<const char*>/std::cmatch).

Current code:

std::optional<std::vector<std::optional<MatchGroup>>> StdRegexStrategy::Match(std::string_view text) const
{
    std::string textStr{ text };  // unnecessary copy
    std::smatch match;

    if (!std::regex_search(textStr, match, regex))
        return std::nullopt;

    // ... extract groups from match ...
}

Proposed approach:

std::optional<std::vector<std::optional<MatchGroup>>> StdRegexStrategy::Match(std::string_view text) const
{
    std::cmatch match;  // match_results<const char*>

    if (!std::regex_search(text.data(), text.data() + text.size(), match, regex))
        return std::nullopt;

    // positions now refer directly into the original text buffer
    // match[i].str() still returns std::string copies for value
    // match.position(i) and match.length(i) work as before
}

Using std::cmatch (i.e. std::match_results<const char*>) avoids the temporary string entirely. The regex_search(const char*, const char*, cmatch&, regex) overload is well-defined and the resulting cmatch references the original text data directly — no lifetime concerns as long as the match is consumed before text goes out of scope (which it already is).

File: cucumber_cpp/library/cucumber_expression/StdRegexStrategy.cpp

Lingua principale
C++
Stelle
22
Fork
7
Merge medio
1g 17h
PR unite (30g)
15

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di philips-software/amp-cucumber-cpp-runner

Tutte le issue di philips-software/amp-cucumber-cpp-runner

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.