#pragma once

#include "file_handle.hpp"


namespace wr
{

class Writer
{
public:
  virtual ~Writer() {}
  virtual void Write(void const * p, size_t size) = 0;

  template <typename T> void Write(T const & t)
  {
    Write(static_cast<void const *>(&t), sizeof(T));
  }

  void Write(string const & s)
  {
    size_t const count = s.size();
    Write(static_cast<uint32_t>(count));
    Write(s.c_str(), count);
  }

  void Write(bool b)
  {
    Write(static_cast<int8_t>(b ? 1 : 0));
  }
};


class FileWriter : public Writer
{
  typedef file::FileHandle HandleT;
  HandleT m_file;

public:
  FileWriter(string const & name)
    : m_file(name, HandleT::WRITE_TRUNCATE)
  {
  }

  using Writer::Write;
  virtual void Write(void const * p, size_t size)
  {
    m_file.Write(p, size);
  }

  uint64_t Size()
  {
    m_file.Flush();
    return m_file.Size();
  }
};

}