avoid copying bytes one after the other.
This commit is contained in:
@@ -726,6 +726,38 @@ Buffer::CopyData(std::ostream *os, uint32_t size) const
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t
|
||||
Buffer::CopyData (uint8_t *buffer, uint32_t size) const
|
||||
{
|
||||
uint32_t originalSize = size;
|
||||
if (size > 0)
|
||||
{
|
||||
uint32_t tmpsize = std::min (m_zeroAreaStart-m_start, size);
|
||||
memcpy (buffer, (const char*)(m_data->m_data + m_start), tmpsize);
|
||||
buffer += tmpsize;
|
||||
if (size > tmpsize)
|
||||
{
|
||||
size -= m_zeroAreaStart-m_start;
|
||||
tmpsize = std::min (m_zeroAreaEnd - m_zeroAreaStart, size);
|
||||
uint32_t left = tmpsize;
|
||||
while (left > 0)
|
||||
{
|
||||
uint32_t toWrite = std::min (left, g_zeroes.size);
|
||||
memcpy (buffer, g_zeroes.buffer, toWrite);
|
||||
left -= toWrite;
|
||||
buffer += toWrite;
|
||||
}
|
||||
if (size > tmpsize)
|
||||
{
|
||||
size -= tmpsize;
|
||||
tmpsize = std::min (m_end - m_zeroAreaEnd, size);
|
||||
memcpy (buffer, (const char*)(m_data->m_data + m_zeroAreaStart), tmpsize);
|
||||
}
|
||||
}
|
||||
}
|
||||
return originalSize - size;
|
||||
}
|
||||
|
||||
/******************************************************
|
||||
* The buffer iterator below.
|
||||
******************************************************/
|
||||
|
||||
@@ -487,6 +487,8 @@ public:
|
||||
*/
|
||||
void CopyData (std::ostream *os, uint32_t size) const;
|
||||
|
||||
uint32_t CopyData (uint8_t *buffer, uint32_t size) const;
|
||||
|
||||
Buffer (Buffer const &o);
|
||||
Buffer &operator = (Buffer const &o);
|
||||
Buffer ();
|
||||
|
||||
@@ -350,14 +350,7 @@ Packet::PeekData (void) const
|
||||
uint32_t
|
||||
Packet::CopyData (uint8_t *buffer, uint32_t size) const
|
||||
{
|
||||
Buffer::Iterator i = m_buffer.Begin ();
|
||||
uint32_t cur = 0;
|
||||
while (!i.IsEnd () && cur < size)
|
||||
{
|
||||
buffer[cur] = i.ReadU8 ();
|
||||
cur++;
|
||||
}
|
||||
return cur;
|
||||
return m_buffer.CopyData (buffer, size);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
Reference in New Issue
Block a user