From a1d7289859b3039d65a71da7b72e804cbe28a5f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Kera=CC=88nen?= Date: Mon, 4 Aug 2014 19:19:36 +0300 Subject: [PATCH] Refactor|libcore|Record: Trying out C++11 for listing subrecords One can use a lambda function to filter out the list of subrecords. --- doomsday/libcore/include/de/data/record.h | 11 +++++++++ doomsday/libcore/src/data/record.cpp | 28 ++++++++++++++--------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/doomsday/libcore/include/de/data/record.h b/doomsday/libcore/include/de/data/record.h index 58ee0ac329..8c3a031661 100644 --- a/doomsday/libcore/include/de/data/record.h +++ b/doomsday/libcore/include/de/data/record.h @@ -31,6 +31,7 @@ #include #include #include +#include namespace de { @@ -388,6 +389,16 @@ class DENG2_PUBLIC Record */ Subrecords subrecords() const; + /** + * Collects a map of all subrecords that fulfill a given predicate. + * + * @param filter Inclusion predicate: returns @c true, if the subrecord is to be + * included in the collection. + * + * @return Map of subrecords. + */ + Subrecords subrecords(std::function filter) const; + /** * Creates a text representation of the record. Each variable name is * prefixed with @a prefix. diff --git a/doomsday/libcore/src/data/record.cpp b/doomsday/libcore/src/data/record.cpp index d257fecdaa..c0dded59ff 100644 --- a/doomsday/libcore/src/data/record.cpp +++ b/doomsday/libcore/src/data/record.cpp @@ -33,6 +33,7 @@ #include "de/String" #include +#include namespace de { @@ -129,21 +130,21 @@ DENG2_PIMPL(Record) return value && value->record() && value->hasOwnership(); } - /* - bool isOwnedSubrecord(Variable const &var) const - { - RecordValue const *value = var.value().maybeAs(); - return value && value->record() && value->hasOwnership(); - }*/ - - Record::Subrecords listSubrecords() const + Record::Subrecords listSubrecords(std::function filter) const { Subrecords subs; DENG2_FOR_EACH_CONST(Members, i, members) { - if(isSubrecord(*i.value())) + Variable const &member = *i.value(); + if(isSubrecord(member)) { - subs.insert(i.key(), i.value()->value().as().record()); + Record *rec = member.value().as().record(); + DENG2_ASSERT(rec != 0); // subrecords are owned, so cannot have been deleted + + // Must pass the filter. + if(!filter(*rec)) continue; + + subs.insert(i.key(), rec); } } return subs; @@ -552,7 +553,12 @@ Record::Members const &Record::members() const Record::Subrecords Record::subrecords() const { - return d->listSubrecords(); + return d->listSubrecords([] (Record const &) { return true; /* unfiltered */ }); +} + +Record::Subrecords Record::subrecords(std::function filter) const +{ + return d->listSubrecords([&] (Record const &rec) { return filter(rec); }); } String Record::asText(String const &prefix, List *lines) const