From 1f0969f86e9d4debeb2f73a7f4d82eb6c190f0df Mon Sep 17 00:00:00 2001 From: Andreas Buhr Date: Tue, 31 Mar 2026 10:07:35 +0200 Subject: [PATCH] Performance optimization for or_parser Only apply skip once, not for every option --- include/boost/parser/parser.hpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/include/boost/parser/parser.hpp b/include/boost/parser/parser.hpp index 1c5585f3..fd45462c 100644 --- a/include/boost/parser/parser.hpp +++ b/include/boost/parser/parser.hpp @@ -3396,7 +3396,6 @@ namespace boost { namespace parser { template auto operator()(Parser const & parser) const { - detail::skip(first_, last_, skip_, flags_); success_ = true; // In case someone earlier already failed... return parser.call( first_, @@ -3410,7 +3409,6 @@ namespace boost { namespace parser { template void operator()(Parser const & parser, Attribute & retval) const { - detail::skip(first_, last_, skip_, flags_); success_ = true; // In case someone earlier already failed... detail::apply_parser( @@ -3518,6 +3516,7 @@ namespace boost { namespace parser { *this, first, last, context, flags, retval); #endif + auto unmodified_first = first; use_parser_t const use_parser{ first, last, context, skip, flags, success}; @@ -3539,12 +3538,16 @@ namespace boost { namespace parser { else use_parser.first_ = prev_first; }; + detail::skip(first, last, skip, flags); + std::apply([&try_parser](auto&&... args) { ((try_parser(args)), ...); }, parsers_); - if (!done) + if (!done) { success = false; + first = unmodified_first; + } } #ifndef BOOST_PARSER_DOXYGEN