Added getPtr() family to Stream

This commit is contained in:
Nicolay Korslund 2010-01-01 11:31:09 +01:00
parent c45170f420
commit 38501777b0
3 changed files with 52 additions and 3 deletions

View file

@ -22,6 +22,11 @@ class SliceStream : public Stream
// Make sure we can actually fit inside the source stream // Make sure we can actually fit inside the source stream
assert(src->size() <= offset+length); assert(src->size() <= offset+length);
isSeekable = true;
hasPosition = true;
hasSize = true;
hasPtr = src->hasPtr;
} }
size_t read(void *buf, size_t count) size_t read(void *buf, size_t count)
@ -48,6 +53,21 @@ class SliceStream : public Stream
bool eof() { return pos == length; } bool eof() { return pos == length; }
size_t tell() { return pos; } size_t tell() { return pos; }
size_t size() { return length; } size_t size() { return length; }
void *getPtr() { return getPtr(0, length); }
void *getPtr(size_t size) { return getPtr(pos, size); }
void *getPtr(size_t pos, size_t size)
{
// Boundry checks on pos and size. Bounding the size is
// important even when getting pointers, as the source stream
// may use the size parameter for something (such as memory
// mapping or buffering.)
if(pos > length) pos = length;
if(pos+size > length) size = length-pos;
// Ask the source to kindly give us a pointer
return src->getPtr(offset+pos, size);
}
}; };
typedef boost::shared_ptr<SliceStream> SliceStreamPtr; typedef boost::shared_ptr<SliceStream> SliceStreamPtr;

View file

@ -37,6 +37,7 @@ class MemoryStream : public Stream
isSeekable = true; isSeekable = true;
hasPosition = true; hasPosition = true;
hasSize = true; hasSize = true;
hasPtr = true;
} }
size_t read(void *buf, size_t count) size_t read(void *buf, size_t count)
@ -69,6 +70,15 @@ class MemoryStream : public Stream
size_t size() const { return length; } size_t size() const { return length; }
bool eof() const { return pos == length; } bool eof() const { return pos == length; }
/// Get the base pointer to the entire buffer
const void *getPtr() const { return data; }
const void *getPtr(size_t size) const { return ((char*)data)+pos; }
const void *getPtr(size_t pos, size_t size)
{
if(pos > length) pos = length;
return ((char*)data)+pos;
}
// New members in MemoryStream: // New members in MemoryStream:
/// Set a new buffer and length. This will rewind the position to zero. /// Set a new buffer and length. This will rewind the position to zero.
@ -79,9 +89,6 @@ class MemoryStream : public Stream
pos = 0; pos = 0;
} }
/// Get the base pointer to the entire buffer
const void *getPtr() const { return data; }
/// Clone this memory stream /// Clone this memory stream
/** Make a new stream of the same buffer. If setPos is true, we also /** Make a new stream of the same buffer. If setPos is true, we also
set the clone's position to be the same as ours. set the clone's position to be the same as ours.

View file

@ -3,6 +3,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "../tools/shared_ptr.h" #include "../tools/shared_ptr.h"
#include <assert.h>
namespace Mangle { namespace Mangle {
namespace Stream { namespace Stream {
@ -22,6 +23,14 @@ class Stream
/// If true, size() works /// If true, size() works
bool hasSize; bool hasSize;
/// If true, the getPtr() functions work
bool hasPtr;
/// Initialize all bools to false by default
Stream() :
isSeekable(false), hasPosition(false), hasSize(false),
hasPtr(false) {}
/// Virtual destructor /// Virtual destructor
virtual ~Stream() {} virtual ~Stream() {}
@ -45,6 +54,19 @@ class Stream
/// Returns true if the stream is empty /// Returns true if the stream is empty
virtual bool eof() const = 0; virtual bool eof() const = 0;
/// Return a pointer to the entire stream. This function (and the
/// other getPtr() variants below) should only be implemented for
/// memory-based streams where using them would be an optimization.
virtual void *getPtr() const { assert(0); }
/// Get a pointer to a memory region of 'size' bytes from the
/// current position.
virtual void *getPtr(size_t size) const { assert(0); }
/// Get a pointer to a memory region of 'size' bytes starting from
/// position 'pos'
virtual void *getPtr(size_t pos, size_t size) const { assert(0); }
}; };
typedef boost::shared_ptr<Stream> StreamPtr; typedef boost::shared_ptr<Stream> StreamPtr;