50template <
typename PA> 
class InstrumentedParser {
 
   52  using resultType = 
typename PA::resultType;
 
   53  constexpr InstrumentedParser(
const InstrumentedParser &) = 
default;
 
   55      : tag_{tag}, parser_{
parser} {}
 
   56  std::optional<resultType> Parse(
ParseState &state)
 const {
 
   57    if (
UserState * ustate{state.userState()}) {
 
   59        const char *at{state.GetLocation()};
 
   60        if (log->Fails(at, tag_, state)) {
 
   63        Messages messages{std::move(state.messages())};
 
   64        std::optional<resultType> result{parser_.Parse(state)};
 
   65        log->Note(at, tag_, result.has_value(), state);
 
   66        state.messages().Annex(std::move(messages));
 
   70    return parser_.Parse(state);