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