From 082ccba4d137c691d8e3f722aec4838cdc7fa8ce Mon Sep 17 00:00:00 2001 From: MarianVJ Date: Fri, 31 Mar 2023 11:29:47 +0200 Subject: [PATCH] First Commit --- .../student/include/impl.h | 36 +++++++++++++++++-- .../student/src/impl.cpp | 22 ++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/unordered_associative_task_2/student/include/impl.h b/unordered_associative_task_2/student/include/impl.h index 256618db..05b4c72d 100644 --- a/unordered_associative_task_2/student/include/impl.h +++ b/unordered_associative_task_2/student/include/impl.h @@ -6,13 +6,43 @@ using filtering_map = std::unordered_map>; /** @todo With help of std filesystem, lists all regular files under specified directory recursively*/ -std::vector listFiles(const std::string& directory); +std::vector listFiles(const std::string& directory) { + + std::vector file_list; + for (const auto& entry : std::filesystem::recursive_directory_iterator(directory)) { + + if (entry.is_regular_file()) { + file_list.push_back(entry.path()); + } + } + + return file_list; +} /** @todo Implement function that will remove group in if it has only one or zero elements */ -void removeUniqueGroups(filtering_map& filteredData); +void removeUniqueGroups(filtering_map& filteredData) { + auto group = filteredData.begin(); + while ( group != last;) { + + if (group->second.size() <= 1) { + group = filteredData.erase(group); + } + else { + group++; + } + } +} /** @todo Implement function that will transform map to a vector */ -std::vector flattenGrouped (const filtering_map& grouped); +std::vector flattenGrouped (const filtering_map& grouped) { + + std::vector result; + for (const auto& group : grouped) { + result.insert(result.end(), group.second.begin(), group.second.end()); + } + + return result; +} /** * @todo Implement function that fill find duplicated files under the directory recursively diff --git a/unordered_associative_task_2/student/src/impl.cpp b/unordered_associative_task_2/student/src/impl.cpp index 757b1928..5c9ee1e0 100644 --- a/unordered_associative_task_2/student/src/impl.cpp +++ b/unordered_associative_task_2/student/src/impl.cpp @@ -30,8 +30,14 @@ auto xx_hash = [] (const std::string &file) template filtering_map filter(const std::vector& files, FilterCriteria filter) { + filtering_map filteredFiles; + for (auto const& f : files) { + filteredFiles[filter(f)].push_back(f); + } + return filteredFiles; } + /** @note HELPER */ template filtering_map groupDuplicates (const std::vector& dataSource, Filter filterCriteria) @@ -44,6 +50,22 @@ filtering_map groupDuplicates (const std::vector& dataSource, Filte std::vector > findDuplicates(const std::string &rootPath) { // filter by size + filtering_map filesBySize = groupDuplicates(listFiles(rootPath), + [](const std::string& file) { return fs::file_size(file); }); + + std::vector filesList = flattenGrouped(filesBySize); + // filter by content + filtering_map filesByContent = groupDuplicates(filesList, + [](const std::string& file) { return xx_hash(file); }); + // flatten + std::vector> result; + for (auto const& file : filesByContent) { + if (result.second.size() > 0) { + std::vector files(file.second.begin(), file.second.end()); + result.push_back(files); + } + } + return result; }