45 lines
1.3 KiB
C++
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;
|
|
}
|