| // Ersatz version of boost::progress so core language model doesn't depend on | |
| // boost. Also adds option to print nothing. | |
| namespace util { | |
| extern const char kProgressBanner[]; | |
| class ErsatzProgress { | |
| public: | |
| // No output. | |
| ErsatzProgress(); | |
| // Null means no output. The null value is useful for passing along the ostream pointer from another caller. | |
| explicit ErsatzProgress(uint64_t complete, std::ostream *to = &std::cerr, const std::string &message = ""); | |
| ~ErsatzProgress(); | |
| ErsatzProgress &operator++() { | |
| if (++current_ >= next_) Milestone(); | |
| return *this; | |
| } | |
| ErsatzProgress &operator+=(uint64_t amount) { | |
| if ((current_ += amount) >= next_) Milestone(); | |
| return *this; | |
| } | |
| void Set(uint64_t to) { | |
| if ((current_ = to) >= next_) Milestone(); | |
| } | |
| void Finished() { | |
| Set(complete_); | |
| } | |
| private: | |
| void Milestone(); | |
| uint64_t current_, next_, complete_; | |
| unsigned char stones_written_; | |
| std::ostream *out_; | |
| // noncopyable | |
| ErsatzProgress(const ErsatzProgress &other); | |
| ErsatzProgress &operator=(const ErsatzProgress &other); | |
| }; | |
| } // namespace util | |