Merge "Fix build break by removing TIZEN_RECORDING_SURFACE_SET" into tizen_2.1
[framework/web/webkit-efl.git] / Source / WTF / wtf / StreamBuffer.h
1 /*
2 * Copyright (C) 2012 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #ifndef WTF_StreamBuffer_h
32 #define WTF_StreamBuffer_h
33
34 #include <wtf/Deque.h>
35 #include <wtf/FixedArray.h>
36 #include <wtf/OwnPtr.h>
37 #include <wtf/PassOwnPtr.h>
38
39 namespace WTF {
40
41 template <typename T, size_t BlockSize> class StreamBuffer {
42 private:
43     typedef Vector<T> Block;
44 public:
45     StreamBuffer()
46         : m_size(0)
47         , m_readOffset(0)
48     {
49     }
50
51     ~StreamBuffer()
52     {
53     }
54
55     bool isEmpty() const { return !size(); }
56
57     void append(const T* data, size_t size)
58     {
59         if (!size)
60             return;
61
62         m_size += size;
63         while (size) {
64             if (!m_buffer.size() || m_buffer.last()->size() == BlockSize)
65                 m_buffer.append(adoptPtr(new Block));
66             size_t appendSize = min(BlockSize - m_buffer.last()->size(), size);
67             m_buffer.last()->append(data, appendSize);
68             data += appendSize;
69             size -= appendSize;
70         }
71     }
72
73     // This function consume data in the fist block.
74     // Specified size must be less than over equal to firstBlockSize().
75     void consume(size_t size)
76     {
77         ASSERT(m_size >= size);
78         if (!m_size)
79             return;
80
81         ASSERT(m_buffer.size() > 0);
82         ASSERT(m_readOffset + size <= m_buffer.first()->size());
83         m_readOffset += size;
84         m_size -= size;
85         if (m_readOffset >= m_buffer.first()->size()) {
86             m_readOffset = 0;
87             m_buffer.removeFirst();
88         }
89     }
90
91     size_t size() const { return m_size; }
92
93     const T* firstBlockData() const
94     {
95         if (!m_size)
96             return 0;
97         ASSERT(m_buffer.size() > 0);
98         return &m_buffer.first()->data()[m_readOffset];
99     }
100
101     size_t firstBlockSize() const
102     {
103         if (!m_size)
104             return 0;
105         ASSERT(m_buffer.size() > 0);
106         return m_buffer.first()->size() - m_readOffset;
107     }
108
109 private:
110     size_t m_size;
111     size_t m_readOffset;
112     Deque<OwnPtr<Block> > m_buffer;
113 };
114
115 } // namespace WTF
116
117 using WTF::StreamBuffer;
118
119 #endif // WTF_StreamBuffer_h