From 4c92ab044414d572b342c8d4482184b8e52865cf Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 15 Jan 2016 02:15:46 +0100 Subject: [PATCH] refs #568, find max key value (useful when key is integer to find latest values) --- src/blackmisc/datastoreobjectlist.cpp | 31 +++++++++++++++++++++++++++ src/blackmisc/datastoreobjectlist.h | 6 ++++++ 2 files changed, 37 insertions(+) diff --git a/src/blackmisc/datastoreobjectlist.cpp b/src/blackmisc/datastoreobjectlist.cpp index 82e2d951e..52f85178f 100644 --- a/src/blackmisc/datastoreobjectlist.cpp +++ b/src/blackmisc/datastoreobjectlist.cpp @@ -30,6 +30,23 @@ namespace BlackMisc return this->container().findFirstByOrDefault(&OBJ::getDbKey, key, notFound); } + template + OBJ IDatastoreObjectList::maxKeyObject() const + { + if (this->container().isEmpty()) { return OBJ(); } + const OBJ max = *std::max_element(this->container().begin(), this->container().end(), [](const OBJ & obj1, const OBJ & obj2) + { + bool v1 = obj1.hasValidDbKey(); + bool v2 = obj2.hasValidDbKey(); + if (v1 && v2) + { + return obj1.getDbKey() < obj2.getDbKey(); + } + return v2; + }); + return max; + } + template void IDatastoreObjectList::sortByKey() { @@ -48,6 +65,20 @@ namespace BlackMisc return keys; } + template + KEYTYPE IDatastoreObjectList::getMaxKey(bool *ok) const + { + QList keys(this->toDbKeyList()); + if (keys.isEmpty()) + { + if (ok) { *ok = false; } + return KEYTYPE(); + } + KEYTYPE max = *std::max_element(keys.begin(), keys.end()); + if (ok) { *ok = true; } + return max; + } + template int IDatastoreObjectList::removeObjectsWithKeys(const QList &keys) { diff --git a/src/blackmisc/datastoreobjectlist.h b/src/blackmisc/datastoreobjectlist.h index fcdcb0938..633656f0e 100644 --- a/src/blackmisc/datastoreobjectlist.h +++ b/src/blackmisc/datastoreobjectlist.h @@ -28,12 +28,18 @@ namespace BlackMisc //! Object with key, notFound otherwise OBJ findByKey(KEYTYPE key, const OBJ ¬Found = OBJ()) const; + //! Object with max.key + OBJ maxKeyObject() const; + //! Sort by timestamp void sortByKey(); //! All keys as list QList toDbKeyList() const; + //! Max.key value (making sense with integer key) + KEYTYPE getMaxKey(bool *ok = nullptr) const; + //! Remove objects with key int removeObjectsWithKeys(const QList &keys);