From 5d2e48b40312c6686ef4b93157a5dd62f017b2db Mon Sep 17 00:00:00 2001 From: Iron Prando da Silva Date: Thu, 9 Dec 2021 12:43:19 +0100 Subject: [PATCH] Finished interface class for auto-generated time dependencies code. --- .../timedependenciesIF.cpp | 88 ++++++++++++++----- .../dramTimeDependencies/timedependenciesIF.h | 15 ++-- 2 files changed, 77 insertions(+), 26 deletions(-) diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.cpp b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.cpp index 89cb4052..8f6c8c7f 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.cpp @@ -8,18 +8,26 @@ DRAMTimeDependenciesIF::DRAMTimeDependenciesIF(const TraceDB& tdb) { } -QMap -DRAMTimeDependenciesIF::getDependencies(const std::vector& commands) const { - QMap dependenciesMap; +std::map +DRAMTimeDependenciesIF::getDependencies(std::vector& dependencyFilter) const { + std::map dependenciesMap; + + std::sort( + dependencyFilter.begin(), + dependencyFilter.end(), + [](const QString& s1, const QString& s2) { + return s1.compare(s2); + } + ); dependenciesMap = mSpecializedGetDependencies(); - mFilterDependencyMap(dependenciesMap, commands); + mFilterDependencyMap(dependenciesMap, dependencyFilter); auto it = dependenciesMap.begin(); while (it != dependenciesMap.end()) { - mFilterDependencyList(it.value().dependencies, commands); - it.value().maxTime = mFindVectorMaximum(it.value().dependencies); + mFilterDependencyList(it->second.dependencies, dependencyFilter); + it->second.maxTime = mFindVectorMaximum(it->second.dependencies); } return dependenciesMap; @@ -39,24 +47,26 @@ void DRAMTimeDependenciesIF::mGetMemspec(const TraceDB& tdb) { } -void DRAMTimeDependenciesIF::mFilterDependencyList(std::vector& dependencyList, const std::vector& commands) const { +void DRAMTimeDependenciesIF::mFilterDependencyList(std::vector& dependencyList, const std::vector& dependencyFilter) const { std::vector newDepList(dependencyList.size()); std::copy_if( dependencyList.begin(), dependencyList.end(), newDepList.begin(), - [ commands ](const TimeDependency& dep) { - return dep.phaseDep == "NAW" - || ( - std::find_if( - commands.begin(), - commands.end(), - [ dep ](const QString& cmd) { - return dep.phaseDep == cmd; - } - ) != commands.end() ) - ; + [ dependencyFilter ](const TimeDependency& dep) { + auto it = std::lower_bound( + dependencyFilter.begin(), + dependencyFilter.end(), + dep.phaseDep, + [](const QString& cmd, const QString& value) { + return value.compare(cmd); + } + ); + + if (it != dependencyFilter.end() && *it == dep.phaseDep) return true; + + return false; } ); @@ -66,8 +76,46 @@ void DRAMTimeDependenciesIF::mFilterDependencyList(std::vector& } -void DRAMTimeDependenciesIF::mFilterDependencyMap(QMap& dependencyList, const std::vector& commands) const { - // TODO +void DRAMTimeDependenciesIF::mFilterDependencyMap(std::map& dependencyMap, const std::vector& dependencyFilter) const { + if (!dependencyMap.empty()) { + + auto itFilter = dependencyFilter.begin(); + auto itFilterLast = std::lower_bound( + dependencyFilter.begin(), + dependencyFilter.end(), + dependencyMap.rbegin()->first + ); + + auto itDependencyMap = dependencyMap.begin(); + + while (true) { + + auto pair = std::mismatch( + itFilter, + itFilterLast, + itDependencyMap, + [](const QString& cmd, const std::pair& vpair) { + return cmd == vpair.first; + } + ); + + if (pair.first == dependencyFilter.end() || pair.second == dependencyMap.end()) { + dependencyMap.erase(pair.second, dependencyMap.end()); + break; + + } else if (pair.first->compare(pair.second->first) < 0) { + ++(pair.first); + + } else { + pair.second = dependencyMap.erase(pair.second); + + } + + itFilter = pair.first; + itDependencyMap = pair.second; + + } + } } size_t DRAMTimeDependenciesIF::mFindVectorMaximum(const std::vector& dependencyList) const { diff --git a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.h b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.h index 7234090d..2d0c657f 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.h +++ b/DRAMSys/traceAnalyzer/businessObjects/dramTimeDependencies/timedependenciesIF.h @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include "data/tracedb.h" @@ -27,17 +27,20 @@ public: DRAMTimeDependenciesIF(const TraceDB& tdb); virtual ~DRAMTimeDependenciesIF() = default; - QMap getDependencies(const std::vector& commands) const; + std::map getDependencies(std::vector& dependencyFilter) const; protected: - void mFilterDependencyList(std::vector& dependencyList, const std::vector& commands) const; - void mFilterDependencyMap(QMap& dependencyList, const std::vector& commands) const; + void mFilterDependencyList(std::vector& dependencyList, const std::vector& dependencyFilter) const; + void mFilterDependencyMap(std::map& dependencyMap, const std::vector& dependencyFilter) const; size_t mFindVectorMaximum(const std::vector& dependencyList) const; - + protected: QJsonObject mMemspecJson; + +// To be implemented +protected: virtual void mInitializeValues() = 0; - virtual QMap mSpecializedGetDependencies() const = 0; + virtual std::map mSpecializedGetDependencies() const = 0; private: void mGetMemspec(const TraceDB& tdb);