diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-20 13:01:08 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-06-20 13:01:08 +0200 |
commit | 49233e234e5c787396cadb2cea33b31ae0cd65c1 (patch) | |
tree | 5410cb9a8fd53168bb60d62c54b654d86f03c38d /Source/WTF/wtf/StreamBuffer.h | |
parent | b211c645d8ab690f713515dfdc84d80b11c27d2c (diff) |
Imported WebKit commit 3a8c29f35d00659d2ce7a0ccdfa8304f14e82327 (http://svn.webkit.org/repository/webkit/trunk@120813)
New snapshot with Windows build fixes
Diffstat (limited to 'Source/WTF/wtf/StreamBuffer.h')
-rw-r--r-- | Source/WTF/wtf/StreamBuffer.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/Source/WTF/wtf/StreamBuffer.h b/Source/WTF/wtf/StreamBuffer.h new file mode 100644 index 000000000..add2549d6 --- /dev/null +++ b/Source/WTF/wtf/StreamBuffer.h @@ -0,0 +1,119 @@ +/* +* Copyright (C) 2012 Google Inc. All rights reserved. +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are +* met: +* +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above +* copyright notice, this list of conditions and the following disclaimer +* in the documentation and/or other materials provided with the +* distribution. +* * Neither the name of Google Inc. nor the names of its +* contributors may be used to endorse or promote products derived from +* this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef WTF_StreamBuffer_h +#define WTF_StreamBuffer_h + +#include <wtf/Deque.h> +#include <wtf/FixedArray.h> +#include <wtf/OwnPtr.h> +#include <wtf/PassOwnPtr.h> + +namespace WTF { + +template <typename T, size_t BlockSize> class StreamBuffer { +private: + typedef Vector<T> Block; +public: + StreamBuffer() + : m_size(0) + , m_readOffset(0) + { + } + + ~StreamBuffer() + { + } + + bool isEmpty() const { return !size(); } + + void append(const T* data, size_t size) + { + if (!size) + return; + + m_size += size; + while (size) { + if (!m_buffer.size() || m_buffer.last()->size() == BlockSize) + m_buffer.append(adoptPtr(new Block)); + size_t appendSize = min(BlockSize - m_buffer.last()->size(), size); + m_buffer.last()->append(data, appendSize); + data += appendSize; + size -= appendSize; + } + } + + // This function consume data in the fist block. + // Specified size must be less than over equal to firstBlockSize(). + void consume(size_t size) + { + ASSERT(m_size >= size); + if (!m_size) + return; + + ASSERT(m_buffer.size() > 0); + ASSERT(m_readOffset + size <= m_buffer.first()->size()); + m_readOffset += size; + m_size -= size; + if (m_readOffset >= m_buffer.first()->size()) { + m_readOffset = 0; + m_buffer.removeFirst(); + } + } + + size_t size() const { return m_size; } + + const T* firstBlockData() const + { + if (!m_size) + return 0; + ASSERT(m_buffer.size() > 0); + return &m_buffer.first()->data()[m_readOffset]; + } + + size_t firstBlockSize() const + { + if (!m_size) + return 0; + ASSERT(m_buffer.size() > 0); + return m_buffer.first()->size() - m_readOffset; + } + +private: + size_t m_size; + size_t m_readOffset; + Deque<OwnPtr<Block> > m_buffer; +}; + +} // namespace WTF + +using WTF::StreamBuffer; + +#endif // WTF_StreamBuffer_h |