278bool QNdefFilter::match(
const QNdefMessage &message)
const
281 if (d->filterRecords.isEmpty())
282 return message.isEmpty();
287 if (!d->orderMatching) {
290 using MapKey = QPair<QNdefRecord::TypeNameFormat, QByteArray>;
293 QMap<MapKey, Record> joinedFilterRecords;
294 for (
const auto &rec : d->filterRecords) {
295 const auto key = qMakePair(rec.typeNameFormat, rec.type);
296 if (joinedFilterRecords.contains(key)) {
297 joinedFilterRecords[key].minimum += rec.minimum;
298 joinedFilterRecords[key].maximum += rec.maximum;
300 joinedFilterRecords.insert(key, rec);
304 QMap<MapKey,
unsigned int> counts;
305 for (
const auto &record : message) {
306 const auto key = qMakePair(record.typeNameFormat(), record.type());
308 const auto emptyTypeKey = qMakePair(record.typeNameFormat(), QByteArray());
310 if (joinedFilterRecords.contains(key))
312 else if (joinedFilterRecords.contains(emptyTypeKey))
313 counts[emptyTypeKey] += 1;
316 for (
auto it = joinedFilterRecords.cbegin(); it != joinedFilterRecords.cend(); ++it) {
317 const auto count = counts.value(it.key(), 0);
319 if (count < it.value().minimum || count > it.value().maximum) {
328 QList<Record> mergedRecords;
330 Record currentRecord = d->filterRecords.first();
331 for (qsizetype i = 1; i < d->filterRecords.size(); ++i) {
332 const auto &rec = d->filterRecords.at(i);
333 if (rec.typeNameFormat == currentRecord.typeNameFormat
334 && rec.type == currentRecord.type) {
335 currentRecord.minimum += rec.minimum;
336 currentRecord.maximum += rec.maximum;
338 mergedRecords.push_back(currentRecord);
342 mergedRecords.push_back(currentRecord);
345 QVarLengthArray<
unsigned int> counts(mergedRecords.size(), 0);
348 qsizetype filterIndex = 0;
349 for (qsizetype messageIndex = 0; matched && messageIndex < message.size(); ++messageIndex) {
350 const auto &messageRec = message.at(messageIndex);
354 qsizetype idx = filterIndex;
355 for (; idx < mergedRecords.size(); ++idx) {
356 const auto &filterRec = mergedRecords.at(idx);
357 if (filterRec.typeNameFormat == messageRec.typeNameFormat()
358 && (filterRec.type == messageRec.type() || filterRec.type.isEmpty())) {
361 }
else if (counts[idx] < filterRec.minimum || counts[idx] > filterRec.maximum) {
374 for (qsizetype i = 0; i < mergedRecords.size(); ++i) {
375 const auto &rec = mergedRecords.at(i);
376 totalCount += counts[i];
377 if (counts[i] < rec.minimum || counts[i] > rec.maximum) {
389 if (matched && (totalCount != message.size())) {