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 WvBufStore * newbuffer(size_t minsize)
Called when a new buffer must be allocated to coalesce chunks.
int search(WvBufStoreList::Iter &it, int offset) const
Searches for the buffer containing the offset.
The abstract buffer storage base class.
A statically bound mixin template for buffer implementations that are write-only. ...
virtual void appendsubbuffer(WvBufStore *buffer, bool autofree)
Appends a subbuffer to the buffer.
The WvCircularBuf storage class.
virtual WvBufStore * firstsubbuffer() const
Returns the first subbuffer.
A statically bound mixin template for buffer implementations that are read-only.
The WvInPlaceBuf storage class.
virtual bool unlinksubbuffer(WvBufStore *buffer, bool allowautofree)
Unlinks the specified subbuffer.
virtual void prependsubbuffer(WvBufStore *buffer, bool autofree)
Prepends a subbuffer to the buffer.
The WvNullBuf storage class.
virtual WvBufStore * firstsubbuffer() const
Returns the first subbuffer.
virtual bool usessubbuffers() const
Returns true if the buffer uses subbuffers for storage.
The WvDynBuf storage class.
The WvConstInPlaceBuf storage class.
virtual void prependsubbuffer(WvBufStore *buffer, bool autofree)
Prepends a subbuffer to the buffer.
The WvBufCursor storage class.
WvBufStore * coalesce(WvBufStoreList::Iter &it, size_t count)
Coalesces a sequence of buffers.
virtual WvBufStore * newbuffer(size_t minsize)
Called when a new buffer must be allocated to coalesce chunks.
virtual void appendsubbuffer(WvBufStore *buffer, bool autofree)
Appends a subbuffer to the buffer.
virtual size_t numsubbuffers() const
Returns the number of subbuffers in the buffer.
The WvLinkedBuffer storage class.
virtual void recyclebuffer(WvBufStore *buffer)
Called when a buffer with autofree is removed from the list.
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...
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 size_t numsubbuffers() const
Returns the number of subbuffers in the buffer.
virtual bool unlinksubbuffer(WvBufStore *buffer, bool allowautofree)
Unlinks the specified subbuffer.