Added params for specifying whether to copy the buffer on construction.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3294 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
ejakowatz
2003-05-23 23:07:30 +00:00
parent 1e6f362d07
commit 9abc4d2dcd
2 changed files with 35 additions and 27 deletions
+11 -10
View File
@@ -25,14 +25,14 @@ class BDataBuffer
{ {
public: public:
BDataBuffer(size_t len); BDataBuffer(size_t len);
BDataBuffer(void* data, size_t len); BDataBuffer(void* data, size_t len, bool copy = false);
BDataBuffer(const BDataBuffer& rhs); BDataBuffer(const BDataBuffer& rhs);
~BDataBuffer(); ~BDataBuffer();
BDataBuffer& operator=(const BDataBuffer& rhs); BDataBuffer& operator=(const BDataBuffer& rhs);
size_t BufferSize() const; size_t BufferSize() const;
const void* Buffer(); const void* Buffer() const;
private: private:
class BDataReference class BDataReference
@@ -41,21 +41,22 @@ class BDataBuffer
void Acquire(BDataReference*& ref); void Acquire(BDataReference*& ref);
void Release(BDataReference*& ref); void Release(BDataReference*& ref);
char* Data() { return data; } char* Data() { return fData; }
size_t Size() const { return size; } size_t Size() const { return fSize; }
int32 Count() { return count; } int32 Count() { return fCount; }
static void Create(void* data, size_t len, BDataReference*& ref); static void Create(void* data, size_t len, BDataReference*& ref,
bool copy = false);
static void Create(size_t len, BDataReference*& ref); static void Create(size_t len, BDataReference*& ref);
private: private:
BDataReference(void* data, size_t len); BDataReference(void* data, size_t len, bool copy = false);
BDataReference(size_t len); BDataReference(size_t len);
~BDataReference(); ~BDataReference();
char* data; char* fData;
size_t size; size_t fSize;
int32 count; int32 fCount;
}; };
BDataBuffer(); // No default construction allowed! BDataBuffer(); // No default construction allowed!
+24 -17
View File
@@ -25,9 +25,9 @@ BDataBuffer::BDataBuffer(size_t len)
BDataReference::Create(len, fDataRef); BDataReference::Create(len, fDataRef);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
BDataBuffer::BDataBuffer(void* data, size_t len) BDataBuffer::BDataBuffer(void* data, size_t len, bool copy)
{ {
BDataReference::Create(data, len, fDataRef); BDataReference::Create(data, len, fDataRef, copy);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
BDataBuffer::BDataBuffer(const BDataBuffer& rhs) BDataBuffer::BDataBuffer(const BDataBuffer& rhs)
@@ -58,7 +58,7 @@ size_t BDataBuffer::BufferSize() const
return fDataRef->Size(); return fDataRef->Size();
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
const void* BDataBuffer::Buffer() const void* BDataBuffer::Buffer() const
{ {
return (const void*)fDataRef->Data(); return (const void*)fDataRef->Data();
} }
@@ -67,9 +67,9 @@ const void* BDataBuffer::Buffer()
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void BDataBuffer::BDataReference::Create(void* data, size_t len, void BDataBuffer::BDataReference::Create(void* data, size_t len,
BDataReference*& ref) BDataReference*& ref, bool copy)
{ {
BDataReference* temp = new BDataReference(data, len); BDataReference* temp = new BDataReference(data, len, copy);
temp->Acquire(ref); temp->Acquire(ref);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
@@ -82,38 +82,45 @@ void BDataBuffer::BDataReference::Create(size_t len, BDataReference*& ref)
void BDataBuffer::BDataReference::Acquire(BDataReference*& ref) void BDataBuffer::BDataReference::Acquire(BDataReference*& ref)
{ {
ref = this; ref = this;
++count; ++fCount;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void BDataBuffer::BDataReference::Release(BDataReference*& ref) void BDataBuffer::BDataReference::Release(BDataReference*& ref)
{ {
ref = NULL; ref = NULL;
--count; --fCount;
if (count <= 0) if (fCount <= 0)
{ {
delete this; delete this;
} }
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
BDataBuffer::BDataReference::BDataReference(void* data, size_t len) BDataBuffer::BDataReference::BDataReference(void* data, size_t len, bool copy)
: data(NULL), size(len), count(0) : fData(NULL), fSize(len), fCount(0)
{ {
data = new char[len]; if (copy)
memcpy((void*)data, data, len); {
fData = new char[fSize];
memcpy((void*)fData, data, fSize);
}
else
{
fData = (char*)data;
}
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
BDataBuffer::BDataReference::BDataReference(size_t len) BDataBuffer::BDataReference::BDataReference(size_t len)
: data(NULL), size(len), count(0) : fData(NULL), fSize(len), fCount(0)
{ {
data = new char[len]; fData = new char[fSize];
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
BDataBuffer::BDataReference::~BDataReference() BDataBuffer::BDataReference::~BDataReference()
{ {
if (data) if (fData)
{ {
delete[] data; delete[] fData;
data = NULL; fData = NULL;
} }
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------