|
|
| 20 |
#include "buffer.h" |
20 |
#include "buffer.h" |
| 21 |
#include "ns3/assert.h" |
21 |
#include "ns3/assert.h" |
| 22 |
#include "ns3/log.h" |
22 |
#include "ns3/log.h" |
|
|
23 |
#include "ns3/fatal-error.h" |
| 23 |
#include <iostream> |
24 |
#include <iostream> |
| 24 |
|
25 |
|
| 25 |
NS_LOG_COMPONENT_DEFINE ("Buffer"); |
26 |
NS_LOG_COMPONENT_DEFINE ("Buffer"); |
|
|
| 646 |
void |
647 |
void |
| 647 |
Buffer::CopyData(std::ostream *os, uint32_t size) const |
648 |
Buffer::CopyData(std::ostream *os, uint32_t size) const |
| 648 |
{ |
649 |
{ |
| 649 |
if (size == GetSize ()) |
650 |
if (size > 0) |
| 650 |
{ |
651 |
{ |
| 651 |
// fast path |
652 |
uint32_t tmpsize = std::min (m_zeroAreaStart-m_start, size); |
| 652 |
os->write((const char*)(m_data->m_data + m_start), m_zeroAreaStart-m_start); |
653 |
os->write((const char*)(m_data->m_data + m_start), tmpsize); |
| 653 |
char zero = 0; |
654 |
if (size > tmpsize) |
| 654 |
for (uint32_t i = 0; i < m_zeroAreaEnd - m_zeroAreaStart; ++i) |
655 |
{ |
| 655 |
{ |
656 |
size -= m_zeroAreaStart-m_start; |
| 656 |
os->write (&zero, 1); |
657 |
tmpsize = std::min (m_zeroAreaEnd - m_zeroAreaStart, size); |
| 657 |
} |
658 |
char zero = 0; |
| 658 |
os->write ((const char*)(m_data->m_data + m_zeroAreaStart), m_end - m_zeroAreaEnd); |
659 |
for (uint32_t i = 0; i < tmpsize; ++i) |
| 659 |
} |
660 |
{ |
| 660 |
else |
661 |
os->write (&zero, 1); |
| 661 |
{ |
662 |
} |
| 662 |
// slow path |
663 |
if (size > tmpsize) |
| 663 |
Buffer::Iterator i = Begin (); |
664 |
{ |
| 664 |
while (!i.IsEnd () && size > 0) |
665 |
size -= tmpsize; |
| 665 |
{ |
666 |
tmpsize = std::min (m_end - m_zeroAreaEnd, size); |
| 666 |
char byte = i.ReadU8 (); |
667 |
os->write ((const char*)(m_data->m_data + m_zeroAreaStart), tmpsize); |
| 667 |
os->write (&byte, 1); |
668 |
} |
| 668 |
} |
669 |
} |
| 669 |
} |
670 |
} |
| 670 |
} |
671 |
} |