00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef HxReadBuffer_h
00012 #define HxReadBuffer_h
00013
00014 #include "HxStd.h"
00015 #include "HxIoFwd.h"
00016 #include "HxCharReader.h"
00017
00018 class L_HXBASIS HxReadBuffer {
00019 public:
00020
00021 HxReadBuffer();
00022 HxReadBuffer(HxCharReader&);
00023 ~HxReadBuffer();
00024
00025 static int BUFFERSIZE();
00026
00027 int get();
00028 void unget();
00029 int peek();
00030
00031 void flush();
00032 void setReader(HxCharReader&);
00033
00034 void setDefaultBufferSize(size_t size);
00035
00036 STD_OSTREAM& put(STD_OSTREAM&) const;
00037
00038 private:
00039
00040 HxReadBuffer(const HxReadBuffer&);
00041 const HxReadBuffer& operator=(const HxReadBuffer&);
00042
00043 public:
00044
00045
00046 private:
00047 class Buffer;
00048 Buffer& current();
00049 void swap();
00050
00051 int overflow(int skip);
00052 void underflow();
00053
00054 static int _BUFFERSIZE;
00055
00056 class Buffer {
00057 public:
00058
00059 Buffer(size_t);
00060 ~Buffer();
00061
00062 int ptr() const;
00063 int size() const;
00064 int get();
00065 void unget();
00066 int peek();
00067
00068 int read(HxCharReader&);
00069 void flush();
00070 void seekEnd();
00071
00072 private:
00073
00074 int _ptr;
00075 int _size;
00076 uChar *_data;
00077 };
00078
00079 HxCharReader* _reader;
00080 Buffer* _buffer[2];
00081 int _current;
00082 short _eof;
00083 short _skipread;
00084 };
00085
00086 inline STD_OSTREAM&
00087 operator<<(STD_OSTREAM& os, const HxReadBuffer& rb)
00088 {
00089 return rb.put(os);
00090 }
00091
00092
00093 inline
00094 HxReadBuffer::Buffer::Buffer(size_t s)
00095 : _ptr(0), _size(0)
00096 {
00097 _data = new uChar[s];
00098 }
00099
00100 inline
00101 HxReadBuffer::Buffer::~Buffer() { delete[] _data; }
00102
00103 inline int
00104 HxReadBuffer::Buffer::ptr() const { return _ptr; }
00105
00106 inline int
00107 HxReadBuffer::Buffer::size() const { return _size; }
00108
00109 inline int
00110 HxReadBuffer::Buffer::get() { return _data[_ptr++]; }
00111
00112 inline void
00113 HxReadBuffer::Buffer::unget() { --_ptr; }
00114
00115 inline int
00116 HxReadBuffer::Buffer::peek() { return _data[_ptr]; }
00117
00118 inline void
00119 HxReadBuffer::Buffer::seekEnd() { _ptr = _size - 1; }
00120
00121 inline HxReadBuffer::Buffer&
00122 HxReadBuffer::current() { return *_buffer[_current]; }
00123
00124 inline void
00125 HxReadBuffer::swap() { _current = (_current + 1) % 2; }
00126
00127 inline int
00128 HxReadBuffer::get()
00129 {
00130 return current().ptr() < current().size() ? current().get() : overflow(1);
00131 }
00132
00133 inline void
00134 HxReadBuffer::unget()
00135 {
00136 if ((current().ptr() > 0) && (_eof < 1))
00137 current().unget();
00138 else
00139 underflow();
00140 }
00141
00142 inline int
00143 HxReadBuffer::peek()
00144 {
00145 return current().ptr() < current().size() ? current().peek() : overflow(0);
00146 }
00147
00148 inline int
00149 HxReadBuffer::BUFFERSIZE()
00150 {
00151 return _BUFFERSIZE;
00152 }
00153
00154 #endif