writer.cpp (1221B)
1 #include "vector.hpp" 2 3 struct writer 4 { 5 virtual void write(char const c) 6 { 7 write({&c, 1}); 8 } 9 virtual void write(span<char const>) = 0; 10 protected: 11 ~writer() = default; 12 }; 13 14 struct fd_writer : writer 15 { 16 fd_writer(file f) : out{f} {} 17 18 void write(span<char const> data) override 19 { 20 assert(*::write(out, data) == data.size()); 21 } 22 private: 23 file out; 24 }; 25 26 struct buf_writer : writer 27 { 28 buf_writer() noexcept = default; 29 30 void write(span<char const> data) override 31 { 32 buffer.push_back(data); 33 } 34 span<char const> get() const noexcept 35 { 36 return {buffer.data(), buffer.size()}; 37 } 38 private: 39 vector<char> buffer; 40 }; 41 42 void decimal(writer& w, uint64_t n) 43 { 44 char buf[20]; 45 char* const end = buf + 16; 46 char* p = end; 47 do 48 { 49 *--p = n % 10 + '0'; 50 n /= 10; 51 } while (n); 52 w.write({p, end}); 53 } 54 55 void test(uint64_t x, span<char const> expect) 56 { 57 buf_writer w; 58 decimal(w, x); 59 assert(w.get() == expect); 60 } 61 62 #define tst(x) test(x##LLU, #x ""_sp) 63 64 int main() 65 { 66 tst(0); 67 tst(9); 68 tst(100); 69 tst(100100); 70 tst(18446744073709551615); 71 72 buf_writer x; 73 writer* w = &x; 74 w->write("Hello, "_sp); 75 decimal(*w, 1234567890); 76 w->write(" World! Wow what a lovely day!\n"_sp); 77 fd_writer cout{stdout}; 78 w = &cout; 79 w->write(x.get()); 80 }