9#ifndef STLAB_CONCURRENCY_PROGRESS_HPP
10#define STLAB_CONCURRENCY_PROGRESS_HPP
34 std::atomic_size_t _task_number = {0};
35 std::atomic_size_t _done_tasks = {0};
36 std::function<void(
size_t,
size_t)> _signal;
39 tracker_server() =
default;
40 tracker_server(std::function<
void(
size_t,
size_t)> f) : _signal(std::
move(f)) {}
45 _signal(steps(), completed());
49 void drop_task() { --_task_number; }
51 void add_task() { ++_task_number; }
53 size_t steps()
const {
return _task_number.load(); }
55 size_t completed()
const {
return _done_tasks.load(); }
59struct tracker_client {
61 mutable std::weak_ptr<tracker_server> _p;
63 tracker_client() =
default;
64 tracker_client(
const tracker_client& x) : _f(x._f), _p(x._p) {
69 tracker_client& operator=(
const tracker_client& x) {
77 tracker_client(tracker_client&&) =
default;
78 tracker_client& operator=(tracker_client&&) =
default;
80 tracker_client(std::shared_ptr<tracker_server>& p, F&& f) : _f(std::
move(f)), _p(p) {
86 if (p) p->drop_task();
89 template <
typename... Args>
90 auto operator()(Args&&... args)
const {
93 if (p) p->task_done();
107class progress_tracker {
108 std::shared_ptr<detail::tracker_server> _tracker;
111 progress_tracker() : _tracker(std::make_shared<detail::tracker_server>()) {}
115 _tracker(std::make_shared<detail::tracker_server>(std::
move(f))) {}
122 template <
typename F>
124 return detail::tracker_client<F>(_tracker, std::forward<F>(f));
128 size_t steps()
const {
return _tracker->steps(); }
131 size_t completed()
const {
return _tracker->completed(); }
Tracks how many wrapped tasks are in flight and how many have completed.
Definition progress.hpp:107
size_t steps() const
Number of tasks currently registered (in flight or not yet done).
Definition progress.hpp:128
size_t completed() const
Number of wrapped tasks that have finished.
Definition progress.hpp:131
progress_tracker(std::function< void(size_t, size_t)> f)
Constructs a tracker that invokes f(steps(), completed()) when a wrapped task completes.
Definition progress.hpp:114
auto operator()(F &&f)
Returns a wrapper that counts this callable as one step until it returns.
Definition progress.hpp:123
constexpr auto move(T &&t) noexcept -> std::remove_reference_t< T > &&
A standard move implementation but with a compile-time check for const types.
Definition utility.hpp:154
Definition reverse.hpp:28