#ifndef __pxx_buffer_hh__
#define __pxx_buffer_hh__

#include "pxx_exception.hh"

#include <stdlib.h>

namespace pxx
{

class Buffer
{

protected:

  static const size_t default_size = 1 << 16 ;
  static const size_t initial_unget_capacity = 1 << 12 ;

  size_t capacity ;
  size_t length ;
  char* buf ;
  char* cursor ;
  char* unget_buf ;
  size_t unget_capacity ;
  size_t unget_length ;

  Buffer* associated ;

public:
  inline Buffer (size_t _size = default_size) ;
  virtual inline ~Buffer () ;
  virtual size_t read () = 0 ;
  virtual size_t write () = 0 ;
  inline void put (char _c) ;
  inline bool get (char& _c) ;
  inline void unget (char _c) ;
  size_t put (void* _buf, size_t _len) ;
  size_t get (void* _buf, size_t _len) ;

  static inline void group (Buffer& _b1, Buffer& _b2) ;

};

}

#endif // __pxx_buffer_hh__
