diff options
Diffstat (limited to 'src/stable/ringbuffer.h')
-rw-r--r-- | src/stable/ringbuffer.h | 462 |
1 files changed, 231 insertions, 231 deletions
diff --git a/src/stable/ringbuffer.h b/src/stable/ringbuffer.h index 79c5a15..39d053e 100644 --- a/src/stable/ringbuffer.h +++ b/src/stable/ringbuffer.h | |||
@@ -15,237 +15,237 @@ | |||
15 | 15 | ||
16 | namespace Bu | 16 | namespace Bu |
17 | { | 17 | { |
18 | template<typename value, typename valuealloc> class RingBuffer; | 18 | template<typename value, typename valuealloc> class RingBuffer; |
19 | 19 | ||
20 | /** @cond DEVEL */ | 20 | /** @cond DEVEL */ |
21 | template<typename value, typename valuealloc> | 21 | template<typename value, typename valuealloc> |
22 | class RingBufferCore | 22 | class RingBufferCore |
23 | { | 23 | { |
24 | friend class RingBuffer<value, valuealloc>; | 24 | friend class RingBuffer<value, valuealloc>; |
25 | friend class SharedCore<RingBuffer<value, valuealloc>, | 25 | friend class SharedCore<RingBuffer<value, valuealloc>, |
26 | RingBufferCore<value, valuealloc> >; | 26 | RingBufferCore<value, valuealloc> >; |
27 | private: | 27 | private: |
28 | RingBufferCore() : | 28 | RingBufferCore() : |
29 | iCapacity( 0 ), | 29 | iCapacity( 0 ), |
30 | iStart( -1 ), | 30 | iStart( -1 ), |
31 | iEnd( -2 ), | 31 | iEnd( -2 ), |
32 | aData( NULL ) | 32 | aData( NULL ) |
33 | { | 33 | { |
34 | } | 34 | } |
35 | 35 | ||
36 | virtual ~RingBufferCore() | 36 | virtual ~RingBufferCore() |
37 | { | 37 | { |
38 | clear(); | 38 | clear(); |
39 | } | 39 | } |
40 | 40 | ||
41 | void init( int iNewCapacity ) | 41 | void init( int iNewCapacity ) |
42 | { | 42 | { |
43 | if( iCapacity > 0 ) | 43 | if( iCapacity > 0 ) |
44 | return; | 44 | return; |
45 | 45 | ||
46 | iCapacity = iNewCapacity; | 46 | iCapacity = iNewCapacity; |
47 | iStart = -1; | 47 | iStart = -1; |
48 | iEnd = -2; | 48 | iEnd = -2; |
49 | aData = va.allocate( iCapacity ); | 49 | aData = va.allocate( iCapacity ); |
50 | } | 50 | } |
51 | 51 | ||
52 | void clear() | 52 | void clear() |
53 | { | 53 | { |
54 | for( int j = iStart; j < iEnd; j=(j+1%iCapacity) ) | 54 | for( int j = iStart; j < iEnd; j=(j+1%iCapacity) ) |
55 | { | 55 | { |
56 | va.destroy( &aData[j] ); | 56 | va.destroy( &aData[j] ); |
57 | } | 57 | } |
58 | va.deallocate( aData, iCapacity ); | 58 | va.deallocate( aData, iCapacity ); |
59 | aData = NULL; | 59 | aData = NULL; |
60 | iCapacity = 0; | 60 | iCapacity = 0; |
61 | } | 61 | } |
62 | 62 | ||
63 | void enqueue( const value &v ) | 63 | void enqueue( const value &v ) |
64 | { | 64 | { |
65 | if( iStart == -1 ) | 65 | if( iStart == -1 ) |
66 | { | 66 | { |
67 | iStart = 0; | 67 | iStart = 0; |
68 | iEnd = 1; | 68 | iEnd = 1; |
69 | va.construct( &aData[0], v ); | 69 | va.construct( &aData[0], v ); |
70 | return; | 70 | return; |
71 | } | 71 | } |
72 | else if( iStart == iEnd ) | 72 | else if( iStart == iEnd ) |
73 | { | 73 | { |
74 | // The ringbuffer is full | 74 | // The ringbuffer is full |
75 | dequeue(); | 75 | dequeue(); |
76 | } | 76 | } |
77 | va.construct( &aData[iEnd], v ); | 77 | va.construct( &aData[iEnd], v ); |
78 | iEnd = (iEnd+1)%iCapacity; | 78 | iEnd = (iEnd+1)%iCapacity; |
79 | } | 79 | } |
80 | 80 | ||
81 | value dequeue() | 81 | value dequeue() |
82 | { | 82 | { |
83 | if( iStart == -1 ) | 83 | if( iStart == -1 ) |
84 | { | 84 | { |
85 | throw ExceptionBase("No data"); | 85 | throw ExceptionBase("No data"); |
86 | } | 86 | } |
87 | else | 87 | else |
88 | { | 88 | { |
89 | value &v = aData[iStart]; | 89 | value &v = aData[iStart]; |
90 | va.destroy( &aData[iStart] ); | 90 | va.destroy( &aData[iStart] ); |
91 | iStart = (iStart+1)%iCapacity; | 91 | iStart = (iStart+1)%iCapacity; |
92 | if( iStart == iEnd ) | 92 | if( iStart == iEnd ) |
93 | { | 93 | { |
94 | iStart = -1; | 94 | iStart = -1; |
95 | iEnd = -2; | 95 | iEnd = -2; |
96 | } | 96 | } |
97 | return v; | 97 | return v; |
98 | } | 98 | } |
99 | } | 99 | } |
100 | 100 | ||
101 | value &get( int iIndex ) | 101 | value &get( int iIndex ) |
102 | { | 102 | { |
103 | return aData[(iIndex+iStart)%iCapacity]; | 103 | return aData[(iIndex+iStart)%iCapacity]; |
104 | } | 104 | } |
105 | 105 | ||
106 | value &first() | 106 | value &first() |
107 | { | 107 | { |
108 | return aData[iStart]; | 108 | return aData[iStart]; |
109 | } | 109 | } |
110 | 110 | ||
111 | value &last() | 111 | value &last() |
112 | { | 112 | { |
113 | return aData[(iEnd-1+iCapacity)%iCapacity]; | 113 | return aData[(iEnd-1+iCapacity)%iCapacity]; |
114 | } | 114 | } |
115 | 115 | ||
116 | int getSize() | 116 | int getSize() |
117 | { | 117 | { |
118 | if( iStart < 0 ) | 118 | if( iStart < 0 ) |
119 | return 0; | 119 | return 0; |
120 | if( iEnd == iStart ) | 120 | if( iEnd == iStart ) |
121 | return iCapacity; | 121 | return iCapacity; |
122 | if( iEnd < iStart ) | 122 | if( iEnd < iStart ) |
123 | return iEnd-iStart; | 123 | return iEnd-iStart; |
124 | return iCapacity-(iEnd-iStart); | 124 | return iCapacity-(iEnd-iStart); |
125 | } | 125 | } |
126 | 126 | ||
127 | int iCapacity; | 127 | int iCapacity; |
128 | int iStart, iEnd; | 128 | int iStart, iEnd; |
129 | value *aData; | 129 | value *aData; |
130 | valuealloc va; | 130 | valuealloc va; |
131 | }; | 131 | }; |
132 | /** @endcond */ | 132 | /** @endcond */ |
133 | 133 | ||
134 | /** | 134 | /** |
135 | *@ingroup Containers | 135 | *@ingroup Containers |
136 | */ | 136 | */ |
137 | template<typename value, typename valuealloc=std::allocator<value> > | 137 | template<typename value, typename valuealloc=std::allocator<value> > |
138 | class RingBuffer : public Queue<value>, public SharedCore< | 138 | class RingBuffer : public Queue<value>, public SharedCore< |
139 | RingBuffer<value, valuealloc>, | 139 | RingBuffer<value, valuealloc>, |
140 | RingBufferCore<value, valuealloc> | 140 | RingBufferCore<value, valuealloc> |
141 | > | 141 | > |
142 | { | 142 | { |
143 | private: | 143 | private: |
144 | typedef RingBuffer<value, valuealloc> MyType; | 144 | typedef RingBuffer<value, valuealloc> MyType; |
145 | typedef RingBufferCore<value, valuealloc> Core; | 145 | typedef RingBufferCore<value, valuealloc> Core; |
146 | 146 | ||
147 | protected: | 147 | protected: |
148 | using SharedCore<MyType, Core>::core; | 148 | using SharedCore<MyType, Core>::core; |
149 | using SharedCore<MyType, Core>::_hardCopy; | 149 | using SharedCore<MyType, Core>::_hardCopy; |
150 | using SharedCore<MyType, Core>::_allocateCore; | 150 | using SharedCore<MyType, Core>::_allocateCore; |
151 | 151 | ||
152 | public: | 152 | public: |
153 | RingBuffer( int iCapacity ) | 153 | RingBuffer( int iCapacity ) |
154 | { | 154 | { |
155 | core->init( iCapacity ); | 155 | core->init( iCapacity ); |
156 | } | 156 | } |
157 | 157 | ||
158 | RingBuffer( const RingBuffer &rSrc ) : | 158 | RingBuffer( const RingBuffer &rSrc ) : |
159 | SharedCore<MyType, Core>( rSrc ) | 159 | SharedCore<MyType, Core>( rSrc ) |
160 | { | 160 | { |
161 | } | 161 | } |
162 | 162 | ||
163 | virtual ~RingBuffer() | 163 | virtual ~RingBuffer() |
164 | { | 164 | { |
165 | } | 165 | } |
166 | 166 | ||
167 | int getCapacity() const | 167 | int getCapacity() const |
168 | { | 168 | { |
169 | return core->iCapacity; | 169 | return core->iCapacity; |
170 | } | 170 | } |
171 | 171 | ||
172 | bool isFilled() const | 172 | bool isFilled() const |
173 | { | 173 | { |
174 | return (core->iStart == core->iEnd); | 174 | return (core->iStart == core->iEnd); |
175 | } | 175 | } |
176 | 176 | ||
177 | bool isEmpty() const | 177 | bool isEmpty() const |
178 | { | 178 | { |
179 | return (core->iStart == -1); | 179 | return (core->iStart == -1); |
180 | } | 180 | } |
181 | 181 | ||
182 | virtual void enqueue( const value &v ) | 182 | virtual void enqueue( const value &v ) |
183 | { | 183 | { |
184 | _hardCopy(); | 184 | _hardCopy(); |
185 | 185 | ||
186 | core->enqueue( v ); | 186 | core->enqueue( v ); |
187 | } | 187 | } |
188 | 188 | ||
189 | virtual value dequeue() | 189 | virtual value dequeue() |
190 | { | 190 | { |
191 | _hardCopy(); | 191 | _hardCopy(); |
192 | 192 | ||
193 | return core->dequeue(); | 193 | return core->dequeue(); |
194 | } | 194 | } |
195 | 195 | ||
196 | virtual int getSize() const | 196 | virtual int getSize() const |
197 | { | 197 | { |
198 | return core->getSize(); | 198 | return core->getSize(); |
199 | } | 199 | } |
200 | 200 | ||
201 | virtual value &peek() | 201 | virtual value &peek() |
202 | { | 202 | { |
203 | _hardCopy(); | 203 | _hardCopy(); |
204 | 204 | ||
205 | return core->get( 0 ); | 205 | return core->get( 0 ); |
206 | } | 206 | } |
207 | 207 | ||
208 | virtual const value &peek() const | 208 | virtual const value &peek() const |
209 | { | 209 | { |
210 | return core->get( 0 ); | 210 | return core->get( 0 ); |
211 | } | 211 | } |
212 | 212 | ||
213 | virtual value &first() | 213 | virtual value &first() |
214 | { | 214 | { |
215 | _hardCopy(); | 215 | _hardCopy(); |
216 | 216 | ||
217 | return core->first(); | 217 | return core->first(); |
218 | } | 218 | } |
219 | 219 | ||
220 | virtual value &last() | 220 | virtual value &last() |
221 | { | 221 | { |
222 | _hardCopy(); | 222 | _hardCopy(); |
223 | 223 | ||
224 | return core->last(); | 224 | return core->last(); |
225 | } | 225 | } |
226 | 226 | ||
227 | value &operator[]( int iIndex ) | 227 | value &operator[]( int iIndex ) |
228 | { | 228 | { |
229 | _hardCopy(); | 229 | _hardCopy(); |
230 | 230 | ||
231 | return core->get( iIndex ); | 231 | return core->get( iIndex ); |
232 | } | 232 | } |
233 | 233 | ||
234 | protected: | 234 | protected: |
235 | virtual Core *_copyCore( Core *src ) | 235 | virtual Core *_copyCore( Core *src ) |
236 | { | 236 | { |
237 | Core *pRet = _allocateCore(); | 237 | Core *pRet = _allocateCore(); |
238 | 238 | ||
239 | pRet->init( src->iCapacity ); | 239 | pRet->init( src->iCapacity ); |
240 | int iSize = src->getSize(); | 240 | int iSize = src->getSize(); |
241 | for( int j = 0; j < iSize; j++ ) | 241 | for( int j = 0; j < iSize; j++ ) |
242 | { | 242 | { |
243 | pRet->enqueue( src->get( j ) ); | 243 | pRet->enqueue( src->get( j ) ); |
244 | } | 244 | } |
245 | 245 | ||
246 | return pRet; | 246 | return pRet; |
247 | } | 247 | } |
248 | }; | 248 | }; |
249 | } | 249 | } |
250 | 250 | ||
251 | #endif | 251 | #endif |