/* vim:set ts=2 sw=2 sts=2 et: */
/**
* \author Marcus Holland-Moritz (github@mhxnet.de)
* \copyright Copyright (c) Marcus Holland-Moritz
*
* This file is part of dwarfs.
*
* dwarfs is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* dwarfs is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with dwarfs. If not, see .
*/
#include
#include
#include
namespace dwarfs::writer::internal {
progress::progress() = default;
progress::~progress() = default;
void progress::add_context(std::shared_ptr const& ctx) const {
std::lock_guard lock(mx_);
contexts_.push_back(ctx);
}
auto progress::get_active_contexts() const
-> std::vector> {
std::vector> rv;
rv.reserve(16);
{
std::lock_guard lock(mx_);
contexts_.erase(std::remove_if(contexts_.begin(), contexts_.end(),
[&rv](auto& wp) {
if (auto sp = wp.lock()) {
rv.push_back(std::move(sp));
return false;
}
return true;
}),
contexts_.end());
}
std::stable_sort(rv.begin(), rv.end(), [](const auto& a, const auto& b) {
return a->get_priority() > b->get_priority();
});
return rv;
}
void progress::set_status_function(status_function_type status_fun) {
std::lock_guard lock(mx_);
status_fun_ = std::make_shared(std::move(status_fun));
}
std::string progress::status(size_t max_len) {
std::shared_ptr fun;
{
std::lock_guard lock(mx_);
fun = status_fun_;
}
if (fun) {
return (*fun)(*this, max_len);
}
return std::string();
}
} // namespace dwarfs::writer::internal