Line data Source code
1 : #pragma once 2 : 3 : #include <exception> 4 : #include <iomanip> 5 : #include <iostream> 6 : 7 : namespace Log { 8 : class ProgressLogger; 9 : } // namespace Log 10 : 11 : namespace std { 12 : inline Log::ProgressLogger &fixed(Log::ProgressLogger &logger); 13 : } // namespace std 14 : 15 : namespace Log { 16 3 : class ProgressLogger { 17 : public: 18 : struct Progress { 19 : double p; 20 : 21 : Progress(double progress); 22 : }; 23 : 24 : struct Elapsed { 25 : double t; 26 : 27 : Elapsed(double t); 28 : }; 29 : 30 : struct ETA { 31 : double t; 32 : 33 : ETA(double eta); 34 : }; 35 : 36 : struct StartMessage {}; 37 : struct EndMessage {}; 38 : 39 : struct StartText {}; 40 : struct EndText {}; 41 : 42 : virtual ProgressLogger &operator<<(const Progress &progress) = 0; 43 : virtual ProgressLogger &operator<<(const Elapsed &elapsed) = 0; 44 : virtual ProgressLogger &operator<<(const ETA &eta) = 0; 45 : virtual ProgressLogger &operator<<(const StartText &) = 0; 46 : virtual ProgressLogger &operator<<(const EndText &) = 0; 47 : virtual ProgressLogger &operator<<(const StartMessage &) = 0; 48 : virtual ProgressLogger &operator<<(const EndMessage &) = 0; 49 : 50 : virtual ProgressLogger &operator<<(const int &t) = 0; 51 : virtual ProgressLogger &operator<<(const unsigned long &t) = 0; 52 : virtual ProgressLogger &operator<<(const double &t) = 0; 53 : virtual ProgressLogger &operator<<(const char *t) = 0; 54 : 55 : virtual ProgressLogger &operator<<(std::_Setprecision f) = 0; 56 : 57 : ProgressLogger &operator<<(ProgressLogger &(*pf)(ProgressLogger &)); 58 : 59 : protected: 60 : friend ProgressLogger & ::std::fixed(ProgressLogger &logger); 61 : virtual ProgressLogger &fixed() = 0; 62 : }; 63 : 64 : } // namespace Log 65 : 66 : namespace std { 67 3 : inline Log::ProgressLogger &fixed(Log::ProgressLogger &logger) { 68 3 : return logger.fixed(); 69 : } 70 : } // namespace std