Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxReadBuffer.h

00001 /*
00002  *  Copyright (c) 1998, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *
00006  *  Author(s):
00007  *  Dennis Koelma (koelma@wins.uva.nl)
00008  *  Edo Poll (poll@wins.uva.nl)
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 //    class               Buffer;
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

Generated on Tue Feb 3 14:18:41 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001