forked from teamnwah/openmw-tes3coop
Added getPtr() family to Stream
This commit is contained in:
parent
c45170f420
commit
38501777b0
3 changed files with 52 additions and 3 deletions
|
@ -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;
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue