Go to the documentation of this file.00001 # if ! defined TS_BUFFER_HEADER
00002 # define TS_BUFFER_HEADER
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 # if defined _MSC_VER
00030 # include <stddef.h>
00031 # else
00032 # include <unistd.h>
00033 # endif
00034 
00035 
00036 # include <memory.h>
00037 
00038 
00039 namespace ts {
00040   struct ConstBuffer;
00041 
00042 
00043 
00044 
00045 
00046 
00047 
00048   struct Buffer {
00049     typedef Buffer self; 
00050     typedef bool (self::*pseudo_bool)() const;
00051 
00052     char * _ptr; 
00053     size_t _size; 
00054 
00055 
00056     Buffer();
00057 
00058 
00059 
00060 
00061 
00062     Buffer(
00063       char* ptr, 
00064       size_t n  
00065     );
00066 
00067 
00068 
00069     Buffer(
00070      char* start, 
00071      char* end 
00072     );
00073 
00074 
00075 
00076 
00077 
00078     bool operator == (self const& that) const;
00079 
00080 
00081 
00082 
00083     bool operator != (self const& that) const;
00084 
00085 
00086 
00087 
00088     bool operator == (ConstBuffer const& that) const;
00089 
00090 
00091 
00092 
00093     bool operator != (ConstBuffer const& that) const;
00094 
00095 
00096     char operator* () const;
00097 
00098 
00099 
00100     self& operator++();
00101 
00102 
00103 
00104     bool operator ! () const;
00105 
00106 
00107     operator pseudo_bool() const;
00108 
00109 
00110 
00111 
00112     char* data() const;
00113 
00114     size_t size() const;
00115 
00116 
00117 
00118 
00119 
00120     self& set(
00121       char* ptr, 
00122       size_t n = 0 
00123     );
00124 
00125     self& reset();
00126   };
00127 
00128 
00129 
00130 
00131   struct ConstBuffer {
00132     typedef ConstBuffer self; 
00133     typedef bool (self::*pseudo_bool)() const;
00134 
00135     char const * _ptr; 
00136     size_t _size; 
00137 
00138 
00139     ConstBuffer();
00140 
00141 
00142 
00143     ConstBuffer(
00144       char const * ptr, 
00145       size_t n 
00146     );
00147 
00148 
00149 
00150 
00151 
00152     ConstBuffer(
00153       char const* start, 
00154       char const* end 
00155     );
00156 
00157     ConstBuffer(
00158       Buffer const& buffer 
00159     );
00160 
00161 
00162 
00163 
00164 
00165     bool operator == (self const& that) const;
00166 
00167 
00168 
00169 
00170     bool operator == (Buffer const& that) const;
00171 
00172 
00173 
00174 
00175     bool operator != (self const& that) const;
00176 
00177 
00178 
00179 
00180     bool operator != (Buffer const& that) const;
00181 
00182     self& operator = (
00183         Buffer const& that 
00184     );
00185 
00186 
00187     char operator* () const;
00188 
00189 
00190 
00191     self& operator++();
00192 
00193 
00194 
00195     self& operator += (size_t n);
00196 
00197 
00198 
00199     bool operator ! () const;
00200 
00201 
00202     operator pseudo_bool() const;
00203 
00204 
00205 
00206 
00207     char const * data() const;
00208 
00209     size_t size() const;
00210 
00211     char operator[] (int n) const;
00212 
00213 
00214     bool contains(char const* p) const;
00215 
00216 
00217 
00218 
00219     self& set(
00220       char const * ptr, 
00221       size_t n = 0 
00222     );
00223 
00224 
00225 
00226     self& set(
00227            char const* start, 
00228            char const* end 
00229            );
00230 
00231     self& reset();
00232 
00233 
00234 
00235 
00236 
00237     char const* find(char c) const;
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245 
00246 
00247 
00248 
00249 
00250 
00251 
00252 
00253 
00254 
00255 
00256     self splitOn(char const* p);
00257 
00258 
00259 
00260 
00261 
00262 
00263 
00264 
00265 
00266 
00267 
00268 
00269 
00270 
00271 
00272 
00273     self splitOn(char c);
00274 
00275 
00276 
00277 
00278     self after(char const* p) const;
00279 
00280 
00281 
00282 
00283 
00284     self after(char c) const;
00285 
00286 
00287 
00288 
00289 
00290 
00291 
00292     self& clip(char const* p);
00293   };
00294 
00295   
00296   
00297 
00298   inline Buffer::Buffer() : _ptr(NULL), _size(0) { }
00299   inline Buffer::Buffer(char* ptr, size_t n) : _ptr(ptr), _size(n) { }
00300   inline Buffer& Buffer::set(char* ptr, size_t n) { _ptr = ptr; _size = n; return *this; }
00301   inline Buffer::Buffer(char* start, char* end) : _ptr(start), _size(end - start) { }
00302   inline Buffer& Buffer::reset() { _ptr = 0; _size = 0 ; return *this; }
00303   inline bool Buffer::operator != (self const& that) const { return ! (*this == that); }
00304   inline bool Buffer::operator != (ConstBuffer const& that) const { return ! (*this == that); }
00305   inline bool Buffer::operator == (self const& that) const {
00306     return _size == that._size &&  _ptr == that._ptr;
00307   }
00308   inline bool Buffer::operator == (ConstBuffer const& that) const {
00309     return _size == that._size &&  _ptr == that._ptr;
00310   }
00311   inline bool Buffer::operator ! () const { return !(_ptr && _size); }
00312   inline Buffer::operator pseudo_bool() const { return _ptr && _size ? &self::operator! : 0; }
00313   inline char Buffer::operator * () const { return *_ptr; }
00314   inline Buffer& Buffer::operator++ () {
00315     ++_ptr;
00316     --_size;
00317     return *this;
00318   }
00319   inline char * Buffer::data() const { return _ptr; }
00320   inline size_t Buffer::size() const { return _size; }
00321 
00322   inline ConstBuffer::ConstBuffer() : _ptr(NULL), _size(0) { }
00323   inline ConstBuffer::ConstBuffer(char const* ptr, size_t n) : _ptr(ptr), _size(n) { }
00324   inline ConstBuffer::ConstBuffer(char const* start, char const* end) : _ptr(start), _size(end - start) { }
00325   inline ConstBuffer::ConstBuffer(Buffer const& that) : _ptr(that._ptr), _size(that._size) { }
00326   inline ConstBuffer& ConstBuffer::set(char const* ptr, size_t n) { _ptr = ptr; _size = n; return *this; }
00327 
00328   inline ConstBuffer& ConstBuffer::set(char const* start, char const* end) {
00329     _ptr = start;
00330     _size = end - start;
00331     return *this;
00332   }
00333 
00334   inline ConstBuffer& ConstBuffer::reset() { _ptr = 0; _size = 0 ; return *this; }
00335   inline bool ConstBuffer::operator != (self const& that) const { return ! (*this == that); }
00336   inline bool ConstBuffer::operator != (Buffer const& that) const { return ! (*this == that); }
00337   inline bool ConstBuffer::operator == (self const& that) const {
00338       return _size == that._size && 0 == memcmp(_ptr, that._ptr, _size);
00339   }
00340   inline ConstBuffer& ConstBuffer::operator = (Buffer const& that) { _ptr = that._ptr ; _size = that._size; return *this; }
00341   inline bool ConstBuffer::operator == (Buffer const& that) const {
00342       return _size == that._size && 0 == memcmp(_ptr, that._ptr, _size);
00343   }
00344   inline bool ConstBuffer::operator ! () const { return !(_ptr && _size); }
00345   inline ConstBuffer::operator pseudo_bool() const { return _ptr && _size ? &self::operator! : 0; }
00346   inline char ConstBuffer::operator * () const { return *_ptr; }
00347   inline ConstBuffer& ConstBuffer::operator++ () {
00348     ++_ptr;
00349     --_size;
00350     return *this;
00351   }
00352   inline ConstBuffer& ConstBuffer::operator += (size_t n) {
00353     _ptr += n;
00354     _size -= n;
00355     return *this;
00356   }
00357   inline char const * ConstBuffer::data() const { return _ptr; }
00358   inline char ConstBuffer::operator[] (int n) const { return _ptr[n]; }
00359   inline size_t ConstBuffer::size() const { return _size; }
00360   inline bool ConstBuffer::contains(char const* p) const {
00361     return _ptr <= p && p < _ptr + _size;
00362   }
00363 
00364   inline ConstBuffer ConstBuffer::splitOn(char const* p) {
00365     self zret; 
00366     if (this->contains(p)) {
00367       size_t n = p - _ptr;
00368       zret.set(_ptr, n);
00369       _ptr = p + 1;
00370       _size -= n + 1;
00371     }
00372     return zret;
00373   }
00374     
00375   inline char const* ConstBuffer::find(char c) const {
00376     return static_cast<char const*>(memchr(_ptr, c, _size));
00377   }
00378 
00379   inline ConstBuffer ConstBuffer::splitOn(char c) {
00380     return this->splitOn(this->find(c));
00381   }
00382 
00383   inline ConstBuffer ConstBuffer::after(char const* p) const {
00384     return this->contains(p) ? self(p + 1, (_size-(p-_ptr))-1) : self();
00385   }
00386   inline ConstBuffer ConstBuffer::after(char c) const {
00387     return this->after(this->find(c));
00388   }
00389   inline ConstBuffer& ConstBuffer::clip(char const* p) {
00390     if (this->contains(p)) {
00391       _size = p - _ptr;
00392     }
00393     return *this;
00394   }
00395 
00396 } 
00397 
00398 typedef ts::Buffer TsBuffer;
00399 typedef ts::ConstBuffer TsConstBuffer;
00400 
00401 # endif // TS_BUFFER_HEADER