📄 queue_8cpp-source.html
字号:
00173 00174 <span class="keywordflow">for</span> (ByteQueueNode *current=m_head; current; current=next)00175 {00176 next=current->next;00177 <span class="keyword">delete</span> current;00178 }00179 }00180 00181 <span class="keywordtype">void</span> ByteQueue::IsolatedInitialize(<span class="keyword">const</span> <a class="code" href="class_name_value_pairs.html">NameValuePairs</a> &parameters)00182 {00183 m_nodeSize = parameters.<a class="code" href="class_name_value_pairs.html#_x_t_r___d_ha43">GetIntValueWithDefault</a>(<span class="stringliteral">"NodeSize"</span>, 256);00184 Clear();00185 }00186 00187 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ByteQueue::CurrentSize()<span class="keyword"> const</span>00188 <span class="keyword"></span>{00189 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> size=0;00190 00191 <span class="keywordflow">for</span> (ByteQueueNode *current=m_head; current; current=current->next)00192 size += current->CurrentSize();00193 00194 <span class="keywordflow">return</span> size + m_lazyLength;00195 }00196 00197 <span class="keywordtype">bool</span> ByteQueue::IsEmpty()<span class="keyword"> const</span>00198 <span class="keyword"></span>{00199 <span class="keywordflow">return</span> m_head==m_tail && m_head->CurrentSize()==0 && m_lazyLength==0;00200 }00201 00202 <span class="keywordtype">void</span> ByteQueue::Clear()00203 {00204 Destroy();00205 m_head = m_tail = <span class="keyword">new</span> ByteQueueNode(m_nodeSize);00206 m_lazyLength = 0;00207 }00208 <a name="l00209"></a><a class="code" href="class_byte_queue.html#_d_e_r_set_encodera7">00209</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_byte_queue.html#_d_e_r_set_encodera7">ByteQueue::Put2</a>(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length, <span class="keywordtype">int</span> messageEnd, <span class="keywordtype">bool</span> blocking)00210 {00211 <span class="keywordflow">if</span> (m_lazyLength > 0)00212 FinalizeLazyPut();00213 00214 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len;00215 <span class="keywordflow">while</span> ((len=m_tail->Put(inString, length)) < length)00216 {00217 m_tail->next = <span class="keyword">new</span> ByteQueueNode(m_nodeSize);00218 m_tail = m_tail->next;00219 inString += len;00220 length -= len;00221 }00222 00223 <span class="keywordflow">return</span> 0;00224 }00225 00226 <span class="keywordtype">void</span> ByteQueue::CleanupUsedNodes()00227 {00228 <span class="keywordflow">while</span> (m_head != m_tail && m_head->UsedUp())00229 {00230 ByteQueueNode *temp=m_head;00231 m_head=m_head->next;00232 <span class="keyword">delete</span> temp;00233 }00234 00235 <span class="keywordflow">if</span> (m_head->CurrentSize() == 0)00236 m_head->Clear();00237 }00238 00239 <span class="keywordtype">void</span> ByteQueue::LazyPut(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size)00240 {00241 <span class="keywordflow">if</span> (m_lazyLength > 0)00242 FinalizeLazyPut();00243 m_lazyString = inString;00244 m_lazyLength = size;00245 }00246 00247 <span class="keywordtype">void</span> ByteQueue::UndoLazyPut(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size)00248 {00249 <span class="keywordflow">if</span> (m_lazyLength < size)00250 <span class="keywordflow">throw</span> <a class="code" href="class_invalid_argument.html">InvalidArgument</a>(<span class="stringliteral">"ByteQueue: size specified for UndoLazyPut is too large"</span>);00251 00252 m_lazyLength -= size;00253 }00254 00255 <span class="keywordtype">void</span> ByteQueue::FinalizeLazyPut()00256 {00257 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = m_lazyLength;00258 m_lazyLength = 0;00259 <span class="keywordflow">if</span> (len)00260 <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz1_0">Put</a>(m_lazyString, len);00261 }00262 <a name="l00263"></a><a class="code" href="class_byte_queue.html#_d_e_r_set_encodera8">00263</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_byte_queue.html#_d_e_r_set_encodera8">ByteQueue::Get</a>(byte &outByte)00264 {00265 <span class="keywordflow">if</span> (m_head->Get(outByte))00266 {00267 <span class="keywordflow">if</span> (m_head->UsedUp())00268 CleanupUsedNodes();00269 <span class="keywordflow">return</span> 1;00270 }00271 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_lazyLength > 0)00272 {00273 outByte = *m_lazyString++;00274 m_lazyLength--;00275 <span class="keywordflow">return</span> 1;00276 }00277 <span class="keywordflow">else</span>00278 <span class="keywordflow">return</span> 0;00279 }00280 <a name="l00281"></a><a class="code" href="class_byte_queue.html#_d_e_r_set_encodera9">00281</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_byte_queue.html#_d_e_r_set_encodera8">ByteQueue::Get</a>(byte *outString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> getMax)00282 {00283 <a class="code" href="class_array_sink.html">ArraySink</a> sink(outString, getMax);00284 <span class="keywordflow">return</span> <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_10">TransferTo</a>(sink, getMax);00285 }00286 <a name="l00287"></a><a class="code" href="class_byte_queue.html#_d_e_r_set_encodera10">00287</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_byte_queue.html#_d_e_r_set_encodera10">ByteQueue::Peek</a>(byte &outByte)<span class="keyword"> const</span>00288 <span class="keyword"></span>{00289 <span class="keywordflow">if</span> (m_head->Peek(outByte))00290 <span class="keywordflow">return</span> 1;00291 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (m_lazyLength > 0)00292 {00293 outByte = *m_lazyString;00294 <span class="keywordflow">return</span> 1;00295 }00296 <span class="keywordflow">else</span>00297 <span class="keywordflow">return</span> 0;00298 }00299 <a name="l00300"></a><a class="code" href="class_byte_queue.html#_d_e_r_set_encodera11">00300</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_byte_queue.html#_d_e_r_set_encodera10">ByteQueue::Peek</a>(byte *outString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> peekMax)<span class="keyword"> const</span>00301 <span class="keyword"></span>{00302 <a class="code" href="class_array_sink.html">ArraySink</a> sink(outString, peekMax);00303 <span class="keywordflow">return</span> <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_12">CopyTo</a>(sink, peekMax);00304 }00305 <a name="l00306"></a><a class="code" href="class_byte_queue.html#_d_e_r_set_encodera12">00306</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_byte_queue.html#_d_e_r_set_encodera12">ByteQueue::TransferTo2</a>(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &transferBytes, <span class="keyword">const</span> std::string &channel, <span class="keywordtype">bool</span> blocking)00307 {00308 <span class="keywordflow">if</span> (blocking)00309 {00310 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> bytesLeft = transferBytes;00311 <span class="keywordflow">for</span> (ByteQueueNode *current=m_head; bytesLeft && current; current=current->next)00312 bytesLeft -= current->TransferTo(target, bytesLeft, channel);00313 CleanupUsedNodes();00314 00315 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len = (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>)STDMIN(bytesLeft, (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)m_lazyLength);00316 <span class="keywordflow">if</span> (len)00317 {00318 target.<a class="code" href="class_buffered_transformation.html#_zlib_decompressorz13_0">ChannelPut</a>(channel, m_lazyString, len);00319 m_lazyString += len;00320 m_lazyLength -= len;00321 bytesLeft -= len;00322 }00323 transferBytes -= bytesLeft;00324 <span class="keywordflow">return</span> 0;00325 }00326 <span class="keywordflow">else</span>00327 {00328 Walker walker(*<span class="keyword">this</span>);00329 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockedBytes = walker.TransferTo2(target, transferBytes, channel, blocking);00330 <a class="code" href="class_buffered_transformation.html#_zlib_decompressorz7_11">Skip</a>(transferBytes);00331 <span class="keywordflow">return</span> blockedBytes;00332 }00333 }00334 00335 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ByteQueue::CopyRangeTo2(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &target, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> &begin, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> end, <span class="keyword">const</span> std::string &channel, <span class="keywordtype">bool</span> blocking)<span class="keyword"> const</span>00336 <span class="keyword"></span>{00337 Walker walker(*<span class="keyword">this</span>);00338 walker.Skip(begin);00339 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> transferBytes = end-begin;00340 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> blockedBytes = walker.TransferTo2(target, transferBytes, channel, blocking);00341 begin += transferBytes;00342 <span class="keywordflow">return</span> blockedBytes;00343 }00344 00345 <span class="keywordtype">void</span> ByteQueue::Unget(byte inByte)00346 {00347 Unget(&inByte, 1);00348 }00349 00350 <span class="keywordtype">void</span> ByteQueue::Unget(<span class="keyword">const</span> byte *inString, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00351 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -