summaryrefslogtreecommitdiff
path: root/queue.cpp
diff options
context:
space:
mode:
authorweidai <weidai11@users.noreply.github.com>2003-06-20 03:12:54 +0000
committerweidai <weidai11@users.noreply.github.com>2003-06-20 03:12:54 +0000
commitda759fb13a613645767932eebbffb359de723f71 (patch)
tree153a0d9ffdbeff5955688bd6fd08bc91cab539f0 /queue.cpp
parentace405444416997b168712d32b7ea74a3bd43c94 (diff)
downloadcryptopp-git-da759fb13a613645767932eebbffb359de723f71.tar.gz
auto queue node size
Diffstat (limited to 'queue.cpp')
-rw-r--r--queue.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/queue.cpp b/queue.cpp
index 16de7720..d700cf0e 100644
--- a/queue.cpp
+++ b/queue.cpp
@@ -6,6 +6,8 @@
NAMESPACE_BEGIN(CryptoPP)
+static const unsigned int s_maxAutoNodeSize = 16*1024;
+
// this class for use by ByteQueue only
class ByteQueueNode
{
@@ -123,8 +125,8 @@ public:
// ********************************************************
-ByteQueue::ByteQueue(unsigned int m_nodeSize)
- : m_nodeSize(m_nodeSize), m_lazyLength(0)
+ByteQueue::ByteQueue(unsigned int nodeSize)
+ : m_autoNodeSize(m_nodeSize==0), m_nodeSize(nodeSize ? nodeSize : 256), m_lazyLength(0)
{
m_head = m_tail = new ByteQueueNode(m_nodeSize);
}
@@ -137,6 +139,7 @@ ByteQueue::ByteQueue(const ByteQueue &copy)
void ByteQueue::CopyFrom(const ByteQueue &copy)
{
m_lazyLength = 0;
+ m_autoNodeSize = copy.m_autoNodeSize;
m_nodeSize = copy.m_nodeSize;
m_head = m_tail = new ByteQueueNode(*copy.m_head);
@@ -210,7 +213,13 @@ unsigned int ByteQueue::Put2(const byte *inString, unsigned int length, int mess
{
inString += len;
length -= len;
- m_tail->next = new ByteQueueNode(STDMAX(m_nodeSize, STDMIN(length, 16U*1024U)));
+ if (m_autoNodeSize && m_nodeSize < s_maxAutoNodeSize)
+ do
+ {
+ m_nodeSize *= 2;
+ }
+ while (m_nodeSize < length && m_nodeSize < s_maxAutoNodeSize);
+ m_tail->next = new ByteQueueNode(STDMAX(m_nodeSize, length));
m_tail = m_tail->next;
}