9 #ifndef __WVBUFFERSTORE_H
10 #define __WVBUFFERSTORE_H
12 #include "wvlinklist.h"
23 #define UNLIMITED_FREE_SPACE (INT_MAX/2)
47 virtual bool isreadable()
const
49 virtual size_t used()
const = 0;
50 virtual size_t optgettable()
const
52 virtual const void *get(
size_t count) = 0;
53 virtual void skip(
size_t count)
55 virtual void unget(
size_t count) = 0;
56 virtual size_t ungettable()
const = 0;
57 virtual size_t peekable(
int offset)
const;
58 virtual size_t optpeekable(
int offset)
const
59 {
return peekable(offset); }
60 virtual const void *peek(
int offset,
size_t count)
61 {
return mutablepeek(offset, count); }
62 virtual void zap() = 0;
65 void move(
void *buf,
size_t count);
66 void copy(
void *buf,
int offset,
size_t count);
70 virtual bool iswritable()
const
72 virtual size_t free()
const = 0;
73 virtual size_t optallocable()
const
75 virtual void *alloc(
size_t count) = 0;
76 virtual void unalloc(
size_t count) = 0;
77 virtual size_t unallocable()
const = 0;
78 virtual void *mutablepeek(
int offset,
size_t count) = 0;
81 void put(
const void *data,
size_t count);
82 void fastput(
const void *data,
size_t count);
83 void poke(
const void *data,
int offset,
size_t count);
87 virtual void merge(
WvBufStore &instore,
size_t count);
90 void basicmerge(
WvBufStore &instore,
size_t count);
138 template<
class Super>
143 Super(_granularity) { }
144 virtual bool iswritable()
const
148 virtual size_t free()
const
152 virtual size_t optallocable()
const
156 virtual void *alloc(
size_t count)
159 !
"non-zero alloc() called on non-writable buffer");
162 virtual void unalloc(
size_t count)
165 !
"non-zero unalloc() called on non-writable buffer");
167 virtual size_t unallocable()
const
171 virtual void *mutablepeek(
int offset,
size_t count)
174 !
"mutablepeek() called on non-writable buffer");
177 virtual void merge(
WvBufStore &instore,
size_t count)
180 !
"non-zero merge() called on non-writable buffer");
190 template<
class Super>
195 Super(_granularity) { }
196 virtual bool isreadable()
const
200 virtual size_t used()
const
204 virtual size_t optgettable()
const
208 virtual size_t peekable(
int offset)
const
212 virtual size_t optpeekable(
int offset)
const
216 virtual const void *get(
size_t count)
219 !
"non-zero get() called on non-readable buffer");
222 virtual void skip(
size_t count)
225 !
"non-zero skip() called on non-readable buffer");
227 virtual void unget(
size_t count)
230 !
"non-zero unget() called on non-readable buffer");
232 virtual size_t ungettable()
const
236 virtual const void *peek(
int offset,
size_t count)
239 !
"peek() called on non-readable buffer");
262 void *_data,
size_t _avail,
size_t _size,
bool _autofree);
269 bool get_autofree()
const
270 {
return xautofree; }
271 void set_autofree(
bool _autofree)
272 { xautofree = _autofree; }
273 void reset(
void *_data,
size_t _avail,
size_t _size,
bool _autofree);
274 void setavail(
size_t _avail);
277 virtual size_t used()
const;
278 virtual const void *get(
size_t count);
279 virtual void unget(
size_t count);
280 virtual size_t ungettable()
const;
282 virtual size_t free()
const;
283 virtual void *alloc(
size_t count);
284 virtual void unalloc(
size_t count);
285 virtual size_t unallocable()
const;
286 virtual void *mutablepeek(
int offset,
size_t count);
302 const void *_data,
size_t _avail);
303 const void *ptr()
const
305 void reset(
const void *_data,
size_t _avail);
306 void setavail(
size_t _avail);
309 virtual size_t used()
const;
310 virtual const void *get(
size_t count);
311 virtual void unget(
size_t count);
312 virtual size_t ungettable()
const;
313 virtual const void *peek(
int offset,
size_t count);
332 void *_data,
size_t _avail,
size_t _size,
bool _autofree);
339 bool get_autofree()
const
340 {
return xautofree; }
341 void set_autofree(
bool _autofree)
342 { xautofree = _autofree; }
343 void reset(
void *_data,
size_t _avail,
size_t _size,
bool _autofree);
344 void setavail(
size_t _avail);
348 virtual size_t used()
const;
349 virtual size_t optgettable()
const;
350 virtual const void *get(
size_t count);
351 virtual void unget(
size_t count);
352 virtual size_t ungettable()
const;
354 virtual size_t free()
const;
355 virtual size_t optallocable()
const;
356 virtual void *alloc(
size_t count);
357 virtual void unalloc(
size_t count);
358 virtual size_t unallocable()
const;
359 virtual void *mutablepeek(
int offset,
size_t count);
383 static void compact(
void *data,
size_t size,
384 size_t head,
size_t count);
406 size_t maxungettable;
412 virtual size_t used()
const;
413 virtual size_t optgettable()
const;
414 virtual const void *get(
size_t count);
415 virtual void unget(
size_t count);
416 virtual size_t ungettable()
const;
418 virtual size_t free()
const;
419 virtual size_t optallocable()
const;
420 virtual void *alloc(
size_t count);
421 virtual void unalloc(
size_t count);
422 virtual size_t unallocable()
const;
423 virtual size_t optpeekable(
int offset)
const;
424 virtual void *mutablepeek(
int offset,
size_t count);
460 int search(WvBufStoreList::Iter &it,
int offset)
const;
474 void do_xunlink(WvBufStoreList::Iter &it);
487 size_t _minalloc,
size_t _maxalloc);
490 virtual size_t free()
const;
491 virtual size_t optallocable()
const;
492 virtual void *alloc(
size_t count);
502 WvReadOnlyBufferStoreMixin<WvBufStore> >
522 int _start,
size_t _length);
525 virtual bool isreadable()
const;
526 virtual size_t used()
const;
527 virtual size_t optgettable()
const;
528 virtual const void *get(
size_t count);
529 virtual void skip(
size_t count);
530 virtual void unget(
size_t count);
531 virtual size_t ungettable()
const;
532 virtual size_t peekable(
int offset)
const;
533 virtual size_t optpeekable(
int offset)
const;
534 virtual const void *peek(
int offset,
size_t count);
536 virtual bool iswritable()
const;
537 virtual void *mutablepeek(
int offset,
size_t count);
540 #endif // __WVBUFFERSTORE_H
virtual bool usessubbuffers() const
Returns true if the buffer uses subbuffers for storage.
virtual bool unlinksubbuffer(WvBufStore *buffer, bool allowautofree)
Unlinks the specified subbuffer.
The WvConstInPlaceBuf storage class.
virtual void appendsubbuffer(WvBufStore *buffer, bool autofree)
Appends a subbuffer to the buffer.
The WvDynBuf storage class.
A statically bound mixin template for buffer implementations that are write-only.
virtual bool unlinksubbuffer(WvBufStore *buffer, bool allowautofree)
Unlinks the specified subbuffer.
int search(WvBufStoreList::Iter &it, int offset) const
Searches for the buffer containing the offset.
virtual WvBufStore * newbuffer(size_t minsize)
Called when a new buffer must be allocated to coalesce chunks.
virtual WvBufStore * firstsubbuffer() const
Returns the first subbuffer.
The WvCircularBuf storage class.
virtual WvBufStore * newbuffer(size_t minsize)
Called when a new buffer must be allocated to coalesce chunks.
virtual void recyclebuffer(WvBufStore *buffer)
Called when a buffer with autofree is removed from the list.
The abstract buffer storage base class.
WvBufStore * coalesce(WvBufStoreList::Iter &it, size_t count)
Coalesces a sequence of buffers.
virtual WvBufStore * firstsubbuffer() const
Returns the first subbuffer.
virtual void appendsubbuffer(WvBufStore *buffer, bool autofree)
Appends a subbuffer to the buffer.
The WvInPlaceBuf storage class.
A statically bound mixin template for buffer implementations that are read-only.
virtual size_t numsubbuffers() const
Returns the number of subbuffers in the buffer.
virtual void prependsubbuffer(WvBufStore *buffer, bool autofree)
Prepends a subbuffer to the buffer.
virtual void prependsubbuffer(WvBufStore *buffer, bool autofree)
Prepends a subbuffer to the buffer.
size_t ensurecontiguous(int offset, size_t count, bool keephistory)
Ensures that count new bytes can be read from or written to the buffer beginning at the specified off...
virtual bool usessubbuffers() const
Returns true if the buffer uses subbuffers for storage.
virtual size_t numsubbuffers() const
Returns the number of subbuffers in the buffer.
The WvNullBuf storage class.
The WvLinkedBuffer storage class.
static void compact(void *data, size_t size, size_t head, size_t count)
Compacts an array arranged as a circular buffer such that the specified region is moved to the beginn...
The WvBufCursor storage class.