void object_t_base::decode()

in src/codec/object.cpp [30:49]


void object_t_base::decode(decode_context &context, void *value) const {
  uint_fast32_t uniq_seen_required = 0;
  detail::bitset<64> seen_required(_fields.num_required_fields());

  detail::decode_object<string_t>(context, [&](const std::string &key) {
    const auto *field = _fields.find(key);
    if (json_unlikely(!field)) {
      return detail::skip_value(context);
    }

    field->decode(context, value);
    if (field->is_required()) {
      const auto seen = seen_required.test_and_set(field->required_field_idx());
      uniq_seen_required += (1 - seen);  // 'seen' is 1 when the field is a duplicate; 0 otherwise
    }
  });

  const auto is_missing_req_fields = (uniq_seen_required != _fields.num_required_fields());
  detail::fail_if(context, is_missing_req_fields, "Missing required field(s)");
}