Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 33 additions & 3 deletions unordered_associative_task_2/student/include/impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,43 @@
using filtering_map = std::unordered_map<size_t, std::vector<std::string>>;

/** @todo With help of std filesystem, lists all regular files under specified directory recursively*/
std::vector<std::string> listFiles(const std::string& directory);
std::vector<std::string> listFiles(const std::string& directory) {

std::vector<std::string> 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<std::string> flattenGrouped (const filtering_map& grouped);
std::vector<std::string> flattenGrouped (const filtering_map& grouped) {

std::vector<std::string> 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
Expand Down
22 changes: 22 additions & 0 deletions unordered_associative_task_2/student/src/impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,14 @@ auto xx_hash = [] (const std::string &file)
template<class FilterCriteria>
filtering_map filter(const std::vector<std::string>& files, FilterCriteria filter)
{
filtering_map filteredFiles;
for (auto const& f : files) {
filteredFiles[filter(f)].push_back(f);
}
return filteredFiles;
}


/** @note HELPER */
template<class Filter>
filtering_map groupDuplicates (const std::vector<std::string>& dataSource, Filter filterCriteria)
Expand All @@ -44,6 +50,22 @@ filtering_map groupDuplicates (const std::vector<std::string>& dataSource, Filte
std::vector<std::vector<std::string> > 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<std::string> filesList = flattenGrouped(filesBySize);

// filter by content
filtering_map filesByContent = groupDuplicates(filesList,
[](const std::string& file) { return xx_hash(file); });

// flatten
std::vector<std::vector<std::string>> result;
for (auto const& file : filesByContent) {
if (result.second.size() > 0) {
std::vector<std::string> files(file.second.begin(), file.second.end());
result.push_back(files);
}
}
return result;
}