src/common/buffer.cc
changeset 2993 a975a534915c
parent 2992 ba52f937610c
child 3029 09fcdac092f7
--- a/src/common/buffer.cc	Tue Apr 22 14:18:33 2008 -0700
+++ b/src/common/buffer.cc	Tue Apr 22 14:35:42 2008 -0700
@@ -464,6 +464,27 @@
 void 
 Buffer::AddAtEnd (const Buffer &o)
 {
+  if (m_end == m_zeroAreaEnd &&
+      o.m_start == o.m_zeroAreaStart &&
+      o.m_zeroAreaEnd - o.m_zeroAreaStart > 0)
+    {
+      /**
+       * This is an optimization which kicks in when
+       * we attempt to aggregate two buffers which contain
+       * adjacent zero areas.
+       */
+      uint32_t zeroSize = o.m_zeroAreaEnd - o.m_zeroAreaStart;
+      m_zeroAreaEnd += zeroSize;
+      m_end = m_zeroAreaEnd;
+      uint32_t endData = o.m_end - o.m_zeroAreaEnd;
+      AddAtEnd (endData);
+      Buffer::Iterator dst = End ();
+      dst.Prev (endData);
+      Buffer::Iterator src = o.End ();
+      src.Prev (endData);
+      dst.Write (src, o.End ());
+      return;
+    }
   Buffer dst = CreateFullCopy ();
   Buffer src = o.CreateFullCopy ();
 
@@ -1336,6 +1357,21 @@
     NS_TEST_ASSERT (memcmp (inputBuffer.PeekData (), outputBuffer.PeekData (), chunkSize) == 0);
   }
 
+  buffer = Buffer (5);
+  buffer.AddAtEnd (2);
+  i = buffer.End ();
+  i.Prev (2);
+  i.WriteU8 (0);
+  i.WriteU8 (0x66);
+  ENSURE_WRITTEN_BYTES (buffer, 7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66);
+  Buffer frag0 = buffer.CreateFragment (0, 2);
+  ENSURE_WRITTEN_BYTES (frag0, 2, 0x00, 0x00);
+  Buffer frag1 = buffer.CreateFragment (2, 5);
+  ENSURE_WRITTEN_BYTES (frag1, 5, 0x00, 0x00, 0x00, 0x00, 0x66);
+  frag0.AddAtEnd (frag1);
+  ENSURE_WRITTEN_BYTES (buffer, 7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66);
+  ENSURE_WRITTEN_BYTES (frag0, 7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66);
+
   return result;
 }