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:
@@ -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!
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in New Issue
Block a user