liblinux++

A hosted C++ runtime without any libc.
git clone git://henryandlizzy.uk/liblinux++
Log | Files | Refs

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 }