dedup/src/progressbar.cpp

45 lines
1.3 KiB
C++

#include "progressbar.h"
#include "file.h"
const uint_fast8_t ProgressBar::BARLENGTH = 50;
ProgressBar::ProgressBar(uint64_t files, uint64_t bytes) : maxFiles(files), maxBytes(bytes) {
}
void ProgressBar::update(uint64_t addFiles, uint64_t newBytes) {
currentFiles += addFiles;
currentBytes += newBytes;
}
std::chrono::duration<uint64_t, std::milli> ProgressBar::getDuration() const {
auto currenttime = std::chrono::high_resolution_clock::now();
return std::chrono::duration_cast<std::chrono::milliseconds>(currenttime - start);
}
std::ostream& operator<<(std::ostream& str, const ProgressBar& pb) {
double progressd = pb.currentBytes / (double) pb.maxBytes;
uint64_t progressi = (progressd * 10000.0);
auto usedtime = pb.getDuration();
std::chrono::duration<uint64_t, std::ratio<60>> eta = std::chrono::duration_cast<std::chrono::minutes>((usedtime / (double) pb.currentBytes) * pb.maxBytes);
// generate bar
str << "[";
for(uint_fast8_t i = 0; i < ProgressBar::BARLENGTH; ++i) {
if( (i / (double) ProgressBar::BARLENGTH) < progressd ) {
str << '#';
} else {
str << ' ';
}
}
// print info
str << "] " << (progressi / 100.0f) << "% " << pb.currentFiles << '/' << pb.maxFiles << " Files "
<< FileSize(pb.currentBytes) << '/' << FileSize(pb.maxBytes) << " ETA: " << eta.count()
<< "s \r" << std::flush;
return str;
}