avoid copying bytes one after the other.

This commit is contained in:
Mathieu Lacage
2010-02-01 08:28:11 +01:00
parent 0d8d1871ac
commit 4811680d2a
3 changed files with 35 additions and 8 deletions

View File

@@ -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.
******************************************************/

View File

@@ -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 ();

View File

@@ -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