51 lines
1.1 KiB
C++
51 lines
1.1 KiB
C++
#include "mergefile.h"
|
|
|
|
#include <algorithm>
|
|
|
|
MergeFile::MergeFile(std::shared_ptr<File> file, Hash&& h) : hash(std::move(h)) {
|
|
files.emplace_back(file);
|
|
}
|
|
|
|
const Hash& MergeFile::getHash() const {
|
|
return hash;
|
|
}
|
|
|
|
bool MergeFile::addFile(std::shared_ptr<File> f, const Hash& h) {
|
|
if(hash == h) {
|
|
files.emplace_back(f);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
std::vector<std::shared_ptr<File>>& MergeFile::getFiles() {
|
|
return files;
|
|
}
|
|
|
|
const std::vector<std::shared_ptr<File>>& MergeFile::getFiles() const {
|
|
return files;
|
|
}
|
|
|
|
void MergeFile::updateMainFile() {
|
|
// count the files with more than one link
|
|
uint32_t complexFiles = std::count_if(files.begin(), files.end(), [](const std::shared_ptr<File>& f) {
|
|
return f->linkcount > 1;
|
|
});
|
|
|
|
if(complexFiles > 1) {
|
|
// move the file with the most hardlinks to the beginning
|
|
|
|
uint32_t maxlinkcount = 0;
|
|
uint32_t maxlinkcountoffset = 0;
|
|
for(uint32_t i = 0; i < files.size(); ++i) {
|
|
if(files.at(i)->linkcount > maxlinkcount) {
|
|
maxlinkcount = files.at(i)->linkcount;
|
|
maxlinkcountoffset = i;
|
|
}
|
|
}
|
|
|
|
if(maxlinkcountoffset != 0) {
|
|
std::swap(files.at(0), files.at(maxlinkcountoffset));
|
|
}
|
|
}
|
|
} |