15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* Copyright (C) 2012 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef WTF_StreamBuffer_h 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define WTF_StreamBuffer_h 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Deque.h" 35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassOwnPtr.h" 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF { 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template <typename T, size_t BlockSize> class StreamBuffer { 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef Vector<T> Block; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StreamBuffer() 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_size(0) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_readOffset(0) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ~StreamBuffer() 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isEmpty() const { return !size(); } 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void append(const T* data, size_t size) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!size) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size += size; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (size) { 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_buffer.size() || m_buffer.last()->size() == BlockSize) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_buffer.append(adoptPtr(new Block)); 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t appendSize = std::min(BlockSize - m_buffer.last()->size(), size); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_buffer.last()->append(data, appendSize); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) data += appendSize; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size -= appendSize; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // This function consume data in the fist block. 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Specified size must be less than over equal to firstBlockSize(). 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void consume(size_t size) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_size >= size); 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_size) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_buffer.size() > 0); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_readOffset + size <= m_buffer.first()->size()); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_readOffset += size; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size -= size; 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_readOffset >= m_buffer.first()->size()) { 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_readOffset = 0; 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_buffer.removeFirst(); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t size() const { return m_size; } 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const T* firstBlockData() const 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_size) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_buffer.size() > 0); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return &m_buffer.first()->data()[m_readOffset]; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t firstBlockSize() const 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_size) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(m_buffer.size() > 0); 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_buffer.first()->size() - m_readOffset; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t m_size; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t m_readOffset; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Deque<OwnPtr<Block> > m_buffer; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using WTF::StreamBuffer; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // WTF_StreamBuffer_h 118