194 std::vector<Job> _jobs;
198 size_t _maxLineWidth;
206 std::ostringstream _os;
214 std::string _actionEnd;
218 std::set<JobListener*> _listeners;
227 inline bool isVerbose()
const {
231 inline void setVerbose(
bool verbose) {
235 inline size_t getMaxLineWidth()
const {
236 return _maxLineWidth;
239 inline void setMaxLineWidth(
size_t width) {
240 _maxLineWidth =
width;
253 _listeners.insert(&l);
256 inline bool removeListener(JobListener& l) {
257 return _listeners.erase(&l) > 0;
260 inline void startingJob(
const std::string&
jobName,
261 const JobType&
type = JobTypeHolder<>::DEFAULT,
262 const std::string&
prefix =
"") {
267 OStreamConfigRestore
osr(std::cout);
269 Job&
job = _jobs.back();
272 if (_jobs.size() > 1) {
273 Job& parent = _jobs[_jobs.size() - 2];
274 if (!parent._nestedJobs) {
275 parent._nestedJobs =
true;
278 indent = _indent * (_jobs.size() - 1);
284 _os <<
type.getActionName() <<
" " <<
job.name() <<
" ...";
286 char f = std::cout.fill();
287 std::cout << std::setw(_maxLineWidth) << std::setfill(
'.') << std::left << _os.str();
293 for (JobListener* l : _listeners) {
294 l->jobStarted(_jobs);
298 inline void finishedJob() {
299 using namespace std::chrono;
301 CPPADCG_ASSERT_UNKNOWN(_jobs.size() > 0);
303 Job&
job = _jobs.back();
305 std::chrono::steady_clock::duration
elapsed = steady_clock::now() -
job.beginTime();
308 OStreamConfigRestore
osr(std::cout);
310 if (
job._nestedJobs) {
313 _os << std::string(_indent * (_jobs.size() - 1),
' ');
314 _os <<
job.getType().getActionEndName() <<
" " <<
job.name() <<
" ...";
316 char f = std::cout.fill();
317 std::cout << std::setw(_maxLineWidth) << std::setfill(
'.') << std::left << _os.str();
321 std::cout <<
" done [" << std::fixed << std::setprecision(3) << duration<float>(
elapsed).count() <<
"]" << std::endl;
325 for (JobListener* l : _listeners) {
326 l->jobEndended(_jobs,
elapsed);