| 4297 | typename Context, |
| 4298 | typename SkipParser> |
| 4299 | auto call( |
| 4300 | Iter & first_, |
| 4301 | Sentinel last, |
| 4302 | Context const & context, |
| 4303 | SkipParser const & skip, |
| 4304 | detail::flags flags, |
| 4305 | bool & success) const |
| 4306 | { |
| 4307 | Iter first = first_; |
| 4308 | |
| 4309 | using temp_result_t = |
| 4310 | decltype(make_temp_result(first, last, context, skip, flags, success)); |
| 4311 | |
| 4312 | std::decay_t<decltype(parser::get(std::declval<temp_result_t>(), llong<0>{}))> |
| 4313 | retval{}; |
| 4314 | |
| 4315 | #if BOOST_PARSER_DO_TRACE |
| 4316 | [[maybe_unused]] auto _ = detail::scoped_trace( |
| 4317 | *this, |
| 4318 | first_, |
| 4319 | last, |
| 4320 | context, |
| 4321 | detail::in_apply_parser(flags) ? detail::disable_trace(flags) |
| 4322 | : flags, |
| 4323 | retval); |
| 4324 | #endif |
| 4325 | |
| 4326 | std::decay_t<decltype(parser::get(std::declval<temp_result_t>(), llong<1>{}))> |
| 4327 | indices; |
| 4328 | std::decay_t<decltype(parser::get(std::declval<temp_result_t>(), llong<2>{}))> |
| 4329 | merged; |
| 4330 | call_impl( |
| 4331 | first, |
| 4332 | last, |
| 4333 | context, |
| 4334 | skip, |
| 4335 | flags, |
| 4336 | success, |
| 4337 | retval, |
| 4338 | indices, |
| 4339 | merged); |
| 4340 | |
| 4341 | if (success) |
| 4342 | first_ = first; |
| 4343 | |
| 4344 | // A 1-tuple is converted to a scalar. |
| 4345 | if constexpr (detail::hl::size(retval) == llong<1>{}) { |
| 4346 | using namespace literals; |
| 4347 | return parser::get(std::move(retval), 0_c); |
| 4348 | } else { |
| 4349 | return retval; |
| 4350 | } |
| 4351 | } |
| 4352 | |
| 4353 | template< |
| 4354 | typename Iter, |