mirror of
https://github.com/boostorg/circular_buffer.git
synced 2026-01-26 18:32:39 +00:00
1078 lines
82 KiB
HTML
1078 lines
82 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||
<html>
|
||
<head>
|
||
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
|
||
<title>base.hpp Source File</title>
|
||
<link href="stylesheet.css" rel="stylesheet" type="text/css">
|
||
</head>
|
||
<body>
|
||
<table ID="Table Header" border="1" bgcolor="#007F7F" cellpadding="2">
|
||
<tr>
|
||
<td bgcolor="#FFFFFF"><img src="../../../../c++boost.gif" width="277" height="86"></td>
|
||
<td><a href="http://boost.org"><font face="Arial" color="FFFFFF"><big>Home</big></font></a></td>
|
||
<td><a href="http://boost.org/libs/libraries.htm"><font face="Arial" color="FFFFFF"><big>Libraries</big></font></a></td>
|
||
<td><a href="http://boost.org/people/people.htm"><font face="Arial" color="FFFFFF"><big>People</big></font></a></td>
|
||
<td><a href="http://boost.org/more/faq.htm"><font face="Arial" color="FFFFFF"><big>FAQ</big></font></a></td>
|
||
<td><a href="http://boost.org/more/index.htm"><font face="Arial" color="FFFFFF"><big>More</big></font></a></td>
|
||
</tr>
|
||
</table>
|
||
<br>
|
||
<!-- Generated by Doxygen 1.3.5 -->
|
||
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a></div>
|
||
<h1>base.hpp</h1><div class="fragment"><pre>00001 <span class="comment">// Implementation of the base circular buffer.</span>
|
||
00002
|
||
00003 <span class="comment">// Copyright (c) 2003-2004 Jan Gaspar</span>
|
||
00004
|
||
00005 <span class="comment">// Use, modification, and distribution is subject to the Boost Software</span>
|
||
00006 <span class="comment">// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at</span>
|
||
00007 <span class="comment">// http://www.boost.org/LICENSE_1_0.txt)</span>
|
||
00008
|
||
00009 <span class="preprocessor">#if !defined(BOOST_CIRCULAR_BUFFER_BASE_HPP)</span>
|
||
00010 <span class="preprocessor"></span><span class="preprocessor">#define BOOST_CIRCULAR_BUFFER_BASE_HPP</span>
|
||
00011 <span class="preprocessor"></span>
|
||
00012 <span class="preprocessor">#if defined(_MSC_VER) && _MSC_VER >= 1200</span>
|
||
00013 <span class="preprocessor"></span><span class="preprocessor"> #pragma once</span>
|
||
00014 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
|
||
00015 <span class="preprocessor"></span>
|
||
00016 <span class="preprocessor">#include <boost/call_traits.hpp></span>
|
||
00017 <span class="preprocessor">#include <boost/concept_check.hpp></span>
|
||
00018 <span class="preprocessor">#include <boost/throw_exception.hpp></span>
|
||
00019 <span class="preprocessor">#include <boost/iterator/reverse_iterator.hpp></span>
|
||
00020 <span class="preprocessor">#include <algorithm></span>
|
||
00021 <span class="preprocessor">#if !defined(BOOST_NO_EXCEPTIONS)</span>
|
||
00022 <span class="preprocessor"></span><span class="preprocessor"> #include <stdexcept></span>
|
||
00023 <span class="preprocessor">#endif</span>
|
||
00024 <span class="preprocessor"></span><span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
00025 <span class="preprocessor"></span><span class="preprocessor"> #include <string.h></span>
|
||
00026 <span class="preprocessor">#endif</span>
|
||
00027 <span class="preprocessor"></span>
|
||
00028 <span class="keyword">namespace </span>boost {
|
||
00029
|
||
00042 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
<a name="l00043"></a><a class="code" href="classboost_1_1circular__buffer.html">00043</a> <span class="keyword">class </span><a class="code" href="classboost_1_1circular__buffer.html">circular_buffer</a> : cb_details::cb_iterator_registry {
|
||
00044
|
||
00045 <span class="comment">// Requirements</span>
|
||
00046 BOOST_CLASS_REQUIRE(T, boost, CopyConstructibleConcept);
|
||
00047
|
||
00048 <span class="keyword">public</span>:
|
||
00049 <span class="comment">// Basic types</span>
|
||
00050
|
||
<a name="l00052"></a><a class="code" href="classboost_1_1circular__buffer.html#w0">00052</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Alloc::value_type <a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>;
|
||
00053
|
||
<a name="l00055"></a><a class="code" href="classboost_1_1circular__buffer.html#w1">00055</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Alloc::pointer <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a>;
|
||
00056
|
||
<a name="l00058"></a><a class="code" href="classboost_1_1circular__buffer.html#w2">00058</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Alloc::const_pointer <a class="code" href="classboost_1_1circular__buffer.html#w2">const_pointer</a>;
|
||
00059
|
||
<a name="l00061"></a><a class="code" href="classboost_1_1circular__buffer.html#w3">00061</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Alloc::reference <a class="code" href="classboost_1_1circular__buffer.html#w3">reference</a>;
|
||
00062
|
||
<a name="l00064"></a><a class="code" href="classboost_1_1circular__buffer.html#w4">00064</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Alloc::const_reference <a class="code" href="classboost_1_1circular__buffer.html#w4">const_reference</a>;
|
||
00065
|
||
00067
|
||
<a name="l00070"></a><a class="code" href="classboost_1_1circular__buffer.html#w5">00070</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Alloc::difference_type <a class="code" href="classboost_1_1circular__buffer.html#w5">difference_type</a>;
|
||
00071
|
||
00073
|
||
<a name="l00076"></a><a class="code" href="classboost_1_1circular__buffer.html#w6">00076</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> Alloc::size_type <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a>;
|
||
00077
|
||
<a name="l00079"></a><a class="code" href="classboost_1_1circular__buffer.html#w7">00079</a> <span class="keyword">typedef</span> Alloc <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>;
|
||
00080
|
||
<a name="l00082"></a><a class="code" href="classboost_1_1circular__buffer.html#a0">00082</a> <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a> <a class="code" href="classboost_1_1circular__buffer.html#a0">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_alloc; }
|
||
00083
|
||
00085
|
||
<a name="l00089"></a><a class="code" href="classboost_1_1circular__buffer.html#a1">00089</a> <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>& <a class="code" href="classboost_1_1circular__buffer.html#a0">get_allocator</a>() { <span class="keywordflow">return</span> m_alloc; }
|
||
00090
|
||
00091 <span class="comment">// Helper types</span>
|
||
00092
|
||
00093 <span class="comment">// Define a type that represents the "best" way to pass the value_type to a method.</span>
|
||
00094 <span class="keyword">typedef</span> <span class="keyword">typename</span> call_traits<value_type>::param_type param_value_type;
|
||
00095
|
||
00096 <span class="comment">// Define a type that represents the "best" way to return the value_type from a const method.</span>
|
||
00097 <span class="keyword">typedef</span> <span class="keyword">typename</span> call_traits<value_type>::param_type return_value_type;
|
||
00098
|
||
00099 <span class="comment">// Iterators</span>
|
||
00100
|
||
<a name="l00102"></a><a class="code" href="classboost_1_1circular__buffer.html#w10">00102</a> <span class="keyword">typedef</span> cb_details::cb_iterator< circular_buffer<T, Alloc>, cb_details::cb_const_traits<Alloc> > <a class="code" href="classboost_1_1circular__buffer.html#w10">const_iterator</a>;
|
||
00103
|
||
<a name="l00105"></a><a class="code" href="classboost_1_1circular__buffer.html#w11">00105</a> <span class="keyword">typedef</span> cb_details::cb_iterator< circular_buffer<T, Alloc>, cb_details::cb_nonconst_traits<Alloc> > <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>;
|
||
00106
|
||
<a name="l00108"></a><a class="code" href="classboost_1_1circular__buffer.html#w12">00108</a> <span class="keyword">typedef</span> <a class="code" href="classboost_1_1circular__buffer.html#w13">reverse_iterator<const_iterator></a> <a class="code" href="classboost_1_1circular__buffer.html#w12">const_reverse_iterator</a>;
|
||
00109
|
||
<a name="l00111"></a><a class="code" href="classboost_1_1circular__buffer.html#w13">00111</a> <span class="keyword">typedef</span> <a class="code" href="classboost_1_1circular__buffer.html#w13">reverse_iterator<iterator></a> <a class="code" href="classboost_1_1circular__buffer.html#w13">reverse_iterator</a>;
|
||
00112
|
||
00113 <span class="keyword">private</span>:
|
||
00114 <span class="comment">// Member variables</span>
|
||
00115
|
||
00117 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> m_buff;
|
||
00118
|
||
00120 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> m_end;
|
||
00121
|
||
00123 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> m_first;
|
||
00124
|
||
00126 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> m_last;
|
||
00127
|
||
00129 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> m_size;
|
||
00130
|
||
00132 <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a> m_alloc;
|
||
00133
|
||
00134 <span class="comment">// Friends</span>
|
||
00135 <span class="preprocessor">#if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS)</span>
|
||
00136 <span class="preprocessor"></span> <span class="keyword">friend</span> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>;
|
||
00137 <span class="keyword">friend</span> <a class="code" href="classboost_1_1circular__buffer.html#w10">const_iterator</a>;
|
||
00138 <span class="preprocessor">#else</span>
|
||
00139 <span class="preprocessor"></span> <span class="keyword">friend</span> <span class="keyword">struct </span><a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>;
|
||
00140 <span class="keyword">friend</span> <span class="keyword">struct </span><a class="code" href="classboost_1_1circular__buffer.html#w10">const_iterator</a>;
|
||
00141 <span class="preprocessor">#endif</span>
|
||
00142 <span class="preprocessor"></span>
|
||
00143 <span class="keyword">public</span>:
|
||
00144 <span class="comment">// Element access</span>
|
||
00145
|
||
<a name="l00147"></a><a class="code" href="classboost_1_1circular__buffer.html#a2">00147</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>(<span class="keyword">this</span>, <a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>() ? 0 : m_first); }
|
||
00148
|
||
<a name="l00150"></a><a class="code" href="classboost_1_1circular__buffer.html#a3">00150</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>(<span class="keyword">this</span>, 0); }
|
||
00151
|
||
<a name="l00153"></a><a class="code" href="classboost_1_1circular__buffer.html#a4">00153</a> <a class="code" href="classboost_1_1circular__buffer.html#w10">const_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w10">const_iterator</a>(<span class="keyword">this</span>, <a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>() ? 0 : m_first); }
|
||
00154
|
||
<a name="l00156"></a><a class="code" href="classboost_1_1circular__buffer.html#a5">00156</a> <a class="code" href="classboost_1_1circular__buffer.html#w10">const_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w10">const_iterator</a>(<span class="keyword">this</span>, 0); }
|
||
00157
|
||
<a name="l00159"></a><a class="code" href="classboost_1_1circular__buffer.html#a6">00159</a> <a class="code" href="classboost_1_1circular__buffer.html#w13">reverse_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a6">rbegin</a>() { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w13">reverse_iterator</a>(<a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>()); }
|
||
00160
|
||
<a name="l00162"></a><a class="code" href="classboost_1_1circular__buffer.html#a7">00162</a> <a class="code" href="classboost_1_1circular__buffer.html#w13">reverse_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a7">rend</a>() { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w13">reverse_iterator</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>()); }
|
||
00163
|
||
<a name="l00165"></a><a class="code" href="classboost_1_1circular__buffer.html#a8">00165</a> <a class="code" href="classboost_1_1circular__buffer.html#w12">const_reverse_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a6">rbegin</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w12">const_reverse_iterator</a>(<a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>()); }
|
||
00166
|
||
<a name="l00168"></a><a class="code" href="classboost_1_1circular__buffer.html#a9">00168</a> <a class="code" href="classboost_1_1circular__buffer.html#w12">const_reverse_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a7">rend</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w12">const_reverse_iterator</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>()); }
|
||
00169
|
||
00171
|
||
<a name="l00174"></a><a class="code" href="classboost_1_1circular__buffer.html#a10">00174</a> <a class="code" href="classboost_1_1circular__buffer.html#w3">reference</a> <a class="code" href="classboost_1_1circular__buffer.html#a10">operator [] </a>(<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> index) {
|
||
00175 BOOST_CB_ASSERT(index < <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>()); <span class="comment">// check for invalid index</span>
|
||
00176 <span class="keywordflow">return</span> *add(m_first, index);
|
||
00177 }
|
||
00178
|
||
00180
|
||
<a name="l00183"></a><a class="code" href="classboost_1_1circular__buffer.html#a11">00183</a> return_value_type <a class="code" href="classboost_1_1circular__buffer.html#a10">operator [] </a>(<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> index)<span class="keyword"> const </span>{
|
||
00184 BOOST_CB_ASSERT(index < <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>()); <span class="comment">// check for invalid index</span>
|
||
00185 <span class="keywordflow">return</span> *add(m_first, index);
|
||
00186 }
|
||
00187
|
||
00189
|
||
<a name="l00192"></a><a class="code" href="classboost_1_1circular__buffer.html#a12">00192</a> <a class="code" href="classboost_1_1circular__buffer.html#w3">reference</a> <a class="code" href="classboost_1_1circular__buffer.html#a12">at</a>(<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> index) {
|
||
00193 check_position(index);
|
||
00194 <span class="keywordflow">return</span> (*this)[index];
|
||
00195 }
|
||
00196
|
||
00198
|
||
<a name="l00201"></a><a class="code" href="classboost_1_1circular__buffer.html#a13">00201</a> return_value_type <a class="code" href="classboost_1_1circular__buffer.html#a12">at</a>(<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> index)<span class="keyword"> const </span>{
|
||
00202 check_position(index);
|
||
00203 <span class="keywordflow">return</span> (*this)[index];
|
||
00204 }
|
||
00205
|
||
00207
|
||
<a name="l00210"></a><a class="code" href="classboost_1_1circular__buffer.html#a14">00210</a> <a class="code" href="classboost_1_1circular__buffer.html#w3">reference</a> <a class="code" href="classboost_1_1circular__buffer.html#a14">front</a>() {
|
||
00211 BOOST_CB_ASSERT(!<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>()); <span class="comment">// check for empty buffer (front element not available)</span>
|
||
00212 <span class="keywordflow">return</span> *m_first;
|
||
00213 }
|
||
00214
|
||
00216
|
||
<a name="l00219"></a><a class="code" href="classboost_1_1circular__buffer.html#a15">00219</a> <a class="code" href="classboost_1_1circular__buffer.html#w3">reference</a> <a class="code" href="classboost_1_1circular__buffer.html#a15">back</a>() {
|
||
00220 BOOST_CB_ASSERT(!<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>()); <span class="comment">// check for empty buffer (back element not available)</span>
|
||
00221 <span class="keywordflow">return</span> *((m_last == m_buff ? m_end : m_last) - 1);
|
||
00222 }
|
||
00223
|
||
00225
|
||
<a name="l00228"></a><a class="code" href="classboost_1_1circular__buffer.html#a16">00228</a> return_value_type <a class="code" href="classboost_1_1circular__buffer.html#a14">front</a>()<span class="keyword"> const </span>{
|
||
00229 BOOST_CB_ASSERT(!<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>()); <span class="comment">// check for empty buffer (front element not available)</span>
|
||
00230 <span class="keywordflow">return</span> *m_first;
|
||
00231 }
|
||
00232
|
||
00234
|
||
<a name="l00237"></a><a class="code" href="classboost_1_1circular__buffer.html#a17">00237</a> return_value_type <a class="code" href="classboost_1_1circular__buffer.html#a15">back</a>()<span class="keyword"> const </span>{
|
||
00238 BOOST_CB_ASSERT(!<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>()); <span class="comment">// check for empty buffer (back element not available)</span>
|
||
00239 <span class="keywordflow">return</span> *((m_last == m_buff ? m_end : m_last) - 1);
|
||
00240 }
|
||
00241
|
||
00243
|
||
<a name="l00251"></a><a class="code" href="classboost_1_1circular__buffer.html#a18">00251</a> <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> <a class="code" href="classboost_1_1circular__buffer.html#a18">data</a>() {
|
||
00252 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>())
|
||
00253 <span class="keywordflow">return</span> 0;
|
||
00254 <span class="keywordflow">if</span> (m_first < m_last || m_last == m_buff)
|
||
00255 <span class="keywordflow">return</span> m_first;
|
||
00256 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> constructed = 0;
|
||
00257 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> src = m_first;
|
||
00258 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> dest = m_buff;
|
||
00259 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> tmp = 0;
|
||
00260 BOOST_CB_TRY
|
||
00261 tmp = allocate(1);
|
||
00262 <span class="keywordflow">for</span> (<a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> first = m_first; dest < src; src = first) {
|
||
00263 <span class="keywordflow">for</span> (<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> ii = 0; src < m_end; ++src, ++dest, ++ii) {
|
||
00264 <span class="keywordflow">if</span> (dest == first) {
|
||
00265 first += ii;
|
||
00266 <span class="keywordflow">break</span>;
|
||
00267 }
|
||
00268 <span class="keywordflow">if</span> (is_uninitialized(dest)) {
|
||
00269 m_alloc.construct(dest, *src);
|
||
00270 ++constructed;
|
||
00271 } <span class="keywordflow">else</span> {
|
||
00272 m_alloc.construct(tmp, *src);
|
||
00273 BOOST_CB_TRY
|
||
00274 replace(src, *dest);
|
||
00275 BOOST_CB_UNWIND(
|
||
00276 destroy_item(tmp);
|
||
00277 tidy(src);
|
||
00278 )
|
||
00279 BOOST_CB_TRY
|
||
00280 replace(dest, *tmp);
|
||
00281 BOOST_CB_UNWIND(
|
||
00282 destroy_item(tmp);
|
||
00283 tidy(dest);
|
||
00284 )
|
||
00285 destroy_item(tmp);
|
||
00286 }
|
||
00287 }
|
||
00288 }
|
||
00289 deallocate(tmp, 1);
|
||
00290 BOOST_CB_UNWIND(
|
||
00291 deallocate(tmp, 1);
|
||
00292 m_last += constructed;
|
||
00293 m_size += constructed;
|
||
00294 )
|
||
00295 <span class="keywordflow">for</span> (dest = m_buff + <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>(); dest < m_end; ++dest)
|
||
00296 destroy_item(dest);
|
||
00297 m_first = m_buff;
|
||
00298 m_last = add(m_buff, <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>());
|
||
00299 <span class="keywordflow">return</span> m_buff;
|
||
00300 }
|
||
00301
|
||
00302 <span class="comment">// Size and capacity</span>
|
||
00303
|
||
<a name="l00305"></a><a class="code" href="classboost_1_1circular__buffer.html#a19">00305</a> <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_size; }
|
||
00306
|
||
<a name="l00308"></a><a class="code" href="classboost_1_1circular__buffer.html#a20">00308</a> <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> <a class="code" href="classboost_1_1circular__buffer.html#a20">max_size</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_alloc.max_size(); }
|
||
00309
|
||
00311
|
||
<a name="l00315"></a><a class="code" href="classboost_1_1circular__buffer.html#a21">00315</a> <span class="keywordtype">bool</span> <a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>() == 0; }
|
||
00316
|
||
00318
|
||
<a name="l00323"></a><a class="code" href="classboost_1_1circular__buffer.html#a22">00323</a> <span class="keywordtype">bool</span> <a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>() == <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>(); }
|
||
00324
|
||
<a name="l00326"></a><a class="code" href="classboost_1_1circular__buffer.html#a23">00326</a> <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_end - m_buff; }
|
||
00327
|
||
00329
|
||
<a name="l00347"></a><a class="code" href="classboost_1_1circular__buffer.html#a24">00347</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a24">set_capacity</a>(<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> new_capacity, <span class="keywordtype">bool</span> remove_front = <span class="keyword">true</span>) {
|
||
00348 <span class="keywordflow">if</span> (new_capacity == <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>())
|
||
00349 <span class="keywordflow">return</span>;
|
||
00350 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> buff = allocate(new_capacity);
|
||
00351 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> new_size = std::min(new_capacity, <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>());
|
||
00352 BOOST_CB_TRY
|
||
00353 <span class="keywordflow">if</span> (remove_front)
|
||
00354 cb_details::uninitialized_copy(<a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() - new_size, <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>(), buff, m_alloc);
|
||
00355 <span class="keywordflow">else</span>
|
||
00356 cb_details::uninitialized_copy(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>(), <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + new_size, buff, m_alloc);
|
||
00357 BOOST_CB_UNWIND(deallocate(buff, new_capacity))
|
||
00358 destroy();
|
||
00359 m_size = new_size;
|
||
00360 m_buff = m_first = buff;
|
||
00361 m_end = m_buff + new_capacity;
|
||
00362 m_last = add(m_buff, <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>());
|
||
00363 }
|
||
00364
|
||
00366
|
||
<a name="l00387"></a><a class="code" href="classboost_1_1circular__buffer.html#a25">00387</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a25">resize</a>(<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> new_size, param_value_type item = T(), <span class="keywordtype">bool</span> remove_front = <span class="keyword">true</span>) {
|
||
00388 <span class="keywordflow">if</span> (new_size > <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>()) {
|
||
00389 <span class="keywordflow">if</span> (new_size > <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>())
|
||
00390 <a class="code" href="classboost_1_1circular__buffer.html#a24">set_capacity</a>(new_size);
|
||
00391 <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>(), new_size - <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>(), item);
|
||
00392 } <span class="keywordflow">else</span> {
|
||
00393 <span class="keywordflow">if</span> (remove_front)
|
||
00394 <a class="code" href="classboost_1_1circular__buffer.html#a49">erase</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>(), <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() - new_size);
|
||
00395 <span class="keywordflow">else</span>
|
||
00396 <a class="code" href="classboost_1_1circular__buffer.html#a49">erase</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + new_size, <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>());
|
||
00397 }
|
||
00398 }
|
||
00399
|
||
00400 <span class="comment">// Construction/Destruction</span>
|
||
00401
|
||
00403
|
||
<a name="l00407"></a><a class="code" href="classboost_1_1circular__buffer.html#a26">00407</a> <span class="keyword">explicit</span> <a class="code" href="classboost_1_1circular__buffer.html#a26">circular_buffer</a>(
|
||
00408 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> capacity,
|
||
00409 <span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>& alloc = <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>())
|
||
00410 : m_size(0), m_alloc(alloc) {
|
||
00411 m_first = m_last = m_buff = allocate(capacity);
|
||
00412 m_end = m_buff + capacity;
|
||
00413 }
|
||
00414
|
||
00416
|
||
<a name="l00421"></a><a class="code" href="classboost_1_1circular__buffer.html#a27">00421</a> <a class="code" href="classboost_1_1circular__buffer.html#a26">circular_buffer</a>(
|
||
00422 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> capacity,
|
||
00423 param_value_type item,
|
||
00424 <span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>& alloc = <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>())
|
||
00425 : m_size(capacity), m_alloc(alloc) {
|
||
00426 m_first = m_last = m_buff = allocate(capacity);
|
||
00427 m_end = m_buff + capacity;
|
||
00428 BOOST_CB_TRY
|
||
00429 cb_details::uninitialized_fill_n(m_buff, <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>(), item, m_alloc);
|
||
00430 BOOST_CB_UNWIND(deallocate(m_buff, capacity))
|
||
00431 }
|
||
00432
|
||
00434
|
||
<a name="l00439"></a><a class="code" href="classboost_1_1circular__buffer.html#a28">00439</a> <a class="code" href="classboost_1_1circular__buffer.html#a26">circular_buffer</a>(<span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer<T, Alloc></a>& cb)
|
||
00440 : m_size(cb.size()), m_alloc(cb.get_allocator()) {
|
||
00441 m_first = m_last = m_buff = allocate(cb.capacity());
|
||
00442 BOOST_CB_TRY
|
||
00443 m_end = cb_details::uninitialized_copy(cb.begin(), cb.end(), m_buff, m_alloc);
|
||
00444 BOOST_CB_UNWIND(deallocate(m_buff, cb.capacity()))
|
||
00445 }
|
||
00446
|
||
00448
|
||
00458 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
<a name="l00459"></a><a class="code" href="classboost_1_1circular__buffer.html#a29">00459</a> <a class="code" href="classboost_1_1circular__buffer.html#a26">circular_buffer</a>(
|
||
00460 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> capacity,
|
||
00461 InputIterator first,
|
||
00462 InputIterator last,
|
||
00463 <span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>& alloc = <a class="code" href="classboost_1_1circular__buffer.html#w7">allocator_type</a>())
|
||
00464 : m_alloc(alloc) {
|
||
00465 BOOST_CB_IS_CONVERTIBLE(InputIterator, <a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>);
|
||
00466 BOOST_CB_ASSERT(std::distance(first, last) >= 0); <span class="comment">// check for wrong range</span>
|
||
00467 m_first = m_buff = allocate(capacity);
|
||
00468 m_end = m_buff + capacity;
|
||
00469 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> diff = std::distance(first, last);
|
||
00470 <span class="keywordflow">if</span> (diff > capacity) {
|
||
00471 std::advance(first, diff - capacity);
|
||
00472 m_size = capacity;
|
||
00473 m_last = m_buff;
|
||
00474 } <span class="keywordflow">else</span> {
|
||
00475 m_size = diff;
|
||
00476 <span class="keywordflow">if</span> (diff == capacity)
|
||
00477 m_last = m_buff;
|
||
00478 <span class="keywordflow">else</span>
|
||
00479 m_last = m_buff + <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>();
|
||
00480 }
|
||
00481 BOOST_CB_TRY
|
||
00482 cb_details::uninitialized_copy(first, last, m_buff, m_alloc);
|
||
00483 BOOST_CB_UNWIND(deallocate(m_buff, capacity))
|
||
00484 }
|
||
00485
|
||
<a name="l00487"></a><a class="code" href="classboost_1_1circular__buffer.html#a30">00487</a> <a class="code" href="classboost_1_1circular__buffer.html#a30">~circular_buffer</a>() { destroy(); }
|
||
00488
|
||
00489 <span class="keyword">private</span>:
|
||
00490 <span class="comment">// Helper functors</span>
|
||
00491
|
||
00492 <span class="comment">// Functor for assigning n items.</span>
|
||
00493 <span class="keyword">struct </span>assign_n {
|
||
00494 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> m_n;
|
||
00495 param_value_type m_item;
|
||
00496 allocator_type& m_alloc;
|
||
00497 <span class="keyword">explicit</span> assign_n(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> n, param_value_type item, allocator_type& alloc) : m_n(n), m_item(item), m_alloc(alloc) {}
|
||
00498 <span class="keywordtype">void</span> operator () (pointer p)<span class="keyword"> const </span>{
|
||
00499 cb_details::uninitialized_fill_n(p, m_n, m_item, m_alloc);
|
||
00500 }
|
||
00501 <span class="keyword">private</span>:
|
||
00502 assign_n& <a class="code" href="classboost_1_1circular__buffer.html#a31">operator = </a>(<span class="keyword">const</span> assign_n&); <span class="comment">// do not generate</span>
|
||
00503 };
|
||
00504
|
||
00505 <span class="comment">// Functor for assigning range of items.</span>
|
||
00506 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
00507 <span class="keyword">struct </span>assign_range {
|
||
00508 InputIterator m_first;
|
||
00509 InputIterator m_last;
|
||
00510 allocator_type& m_alloc;
|
||
00511 <span class="keyword">explicit</span> assign_range(InputIterator first, InputIterator last, allocator_type& alloc) : m_first(first), m_last(last), m_alloc(alloc) {}
|
||
00512 <span class="keywordtype">void</span> operator () (pointer p)<span class="keyword"> const </span>{
|
||
00513 cb_details::uninitialized_copy(m_first, m_last, p, m_alloc);
|
||
00514 }
|
||
00515 <span class="keyword">private</span>:
|
||
00516 assign_range& <a class="code" href="classboost_1_1circular__buffer.html#a31">operator = </a>(<span class="keyword">const</span> assign_range&); <span class="comment">// do not generate</span>
|
||
00517 };
|
||
00518
|
||
00519 <span class="keyword">public</span>:
|
||
00520 <span class="comment">// Assign methods</span>
|
||
00521
|
||
00523
|
||
<a name="l00529"></a><a class="code" href="classboost_1_1circular__buffer.html#a31">00529</a> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer<T, Alloc></a>& <a class="code" href="classboost_1_1circular__buffer.html#a31">operator = </a>(<span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer<T, Alloc></a>& cb) {
|
||
00530 <span class="keywordflow">if</span> (<span class="keyword">this</span> == &cb)
|
||
00531 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||
00532 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> buff = allocate(cb.<a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>());
|
||
00533 BOOST_CB_TRY
|
||
00534 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> last = cb_details::uninitialized_copy(cb.<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>(), cb.<a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>(), buff, m_alloc);
|
||
00535 destroy();
|
||
00536 m_size = cb.<a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>();
|
||
00537 m_first = m_buff = buff;
|
||
00538 m_end = m_buff + cb.<a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>();
|
||
00539 m_last = <a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>() ? m_buff : last;
|
||
00540 BOOST_CB_UNWIND(deallocate(buff, cb.<a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>()))
|
||
00541 <span class="keywordflow">return</span> *<span class="keyword">this</span>;
|
||
00542 }
|
||
00543
|
||
00545
|
||
<a name="l00555"></a><a class="code" href="classboost_1_1circular__buffer.html#a32">00555</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a32">assign</a>(<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> n, param_value_type item) { do_assign(n, assign_n(n, item, m_alloc)); }
|
||
00556
|
||
00558
|
||
00568 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
<a name="l00569"></a><a class="code" href="classboost_1_1circular__buffer.html#a33">00569</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a32">assign</a>(InputIterator first, InputIterator last) {
|
||
00570 <a class="code" href="classboost_1_1circular__buffer.html#a32">assign</a>(first, last, cb_details::cb_iterator_category_traits<InputIterator>::tag());
|
||
00571 }
|
||
00572
|
||
00574
|
||
<a name="l00578"></a><a class="code" href="classboost_1_1circular__buffer.html#a34">00578</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a34">swap</a>(<a class="code" href="classboost_1_1circular__buffer.html">circular_buffer</a>& cb) {
|
||
00579 std::swap(m_alloc, cb.<a class="code" href="classboost_1_1circular__buffer.html#r5">m_alloc</a>); <span class="comment">// in general this is not necessary,</span>
|
||
00580 <span class="comment">// because allocators should not have state</span>
|
||
00581 std::swap(m_buff, cb.<a class="code" href="classboost_1_1circular__buffer.html#r0">m_buff</a>);
|
||
00582 std::swap(m_end, cb.<a class="code" href="classboost_1_1circular__buffer.html#r1">m_end</a>);
|
||
00583 std::swap(m_first, cb.<a class="code" href="classboost_1_1circular__buffer.html#r2">m_first</a>);
|
||
00584 std::swap(m_last, cb.<a class="code" href="classboost_1_1circular__buffer.html#r3">m_last</a>);
|
||
00585 std::swap(m_size, cb.<a class="code" href="classboost_1_1circular__buffer.html#r4">m_size</a>);
|
||
00586 <span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
00587 <span class="preprocessor"></span> invalidate_all_iterators();
|
||
00588 cb.invalidate_all_iterators();
|
||
00589 <span class="preprocessor">#endif</span>
|
||
00590 <span class="preprocessor"></span> }
|
||
00591
|
||
00592 <span class="comment">// push and pop</span>
|
||
00593
|
||
00595
|
||
<a name="l00601"></a><a class="code" href="classboost_1_1circular__buffer.html#a35">00601</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a36">push_back</a>(param_value_type item) {
|
||
00602 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()) {
|
||
00603 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>())
|
||
00604 <span class="keywordflow">return</span>;
|
||
00605 replace_last(item);
|
||
00606 increment(m_last);
|
||
00607 m_first = m_last;
|
||
00608 } <span class="keywordflow">else</span> {
|
||
00609 m_alloc.construct(m_last, item);
|
||
00610 increment(m_last);
|
||
00611 ++m_size;
|
||
00612 }
|
||
00613 }
|
||
00614
|
||
00616
|
||
<a name="l00622"></a><a class="code" href="classboost_1_1circular__buffer.html#a36">00622</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a36">push_back</a>() { <a class="code" href="classboost_1_1circular__buffer.html#a36">push_back</a>(<a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>()); }
|
||
00623
|
||
00625
|
||
<a name="l00631"></a><a class="code" href="classboost_1_1circular__buffer.html#a37">00631</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a38">push_front</a>(param_value_type item) {
|
||
00632 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()) {
|
||
00633 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>())
|
||
00634 <span class="keywordflow">return</span>;
|
||
00635 replace_first(item);
|
||
00636 m_last = m_first;
|
||
00637 } <span class="keywordflow">else</span> {
|
||
00638 decrement(m_first);
|
||
00639 BOOST_CB_TRY
|
||
00640 m_alloc.construct(m_first, item);
|
||
00641 BOOST_CB_UNWIND(increment(m_first))
|
||
00642 ++m_size;
|
||
00643 }
|
||
00644 }
|
||
00645
|
||
00647
|
||
<a name="l00653"></a><a class="code" href="classboost_1_1circular__buffer.html#a38">00653</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a38">push_front</a>() { <a class="code" href="classboost_1_1circular__buffer.html#a38">push_front</a>(<a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>()); }
|
||
00654
|
||
00656
|
||
<a name="l00662"></a><a class="code" href="classboost_1_1circular__buffer.html#a39">00662</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a39">pop_back</a>() {
|
||
00663 BOOST_CB_ASSERT(!<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>()); <span class="comment">// check for empty buffer (back element not available)</span>
|
||
00664 decrement(m_last);
|
||
00665 destroy_item(m_last);
|
||
00666 --m_size;
|
||
00667 }
|
||
00668
|
||
00670
|
||
<a name="l00676"></a><a class="code" href="classboost_1_1circular__buffer.html#a40">00676</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a40">pop_front</a>() {
|
||
00677 BOOST_CB_ASSERT(!<a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>()); <span class="comment">// check for empty buffer (front element not available)</span>
|
||
00678 destroy_item(m_first);
|
||
00679 increment(m_first);
|
||
00680 --m_size;
|
||
00681 }
|
||
00682
|
||
00683 <span class="keyword">private</span>:
|
||
00684 <span class="comment">// Helper wrappers</span>
|
||
00685
|
||
00686 <span class="comment">// Iterator dereference wrapper.</span>
|
||
00687 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
00688 <span class="keyword">struct </span>iterator_wrapper {
|
||
00689 <span class="keyword">mutable</span> InputIterator m_it;
|
||
00690 <span class="keyword">explicit</span> iterator_wrapper(InputIterator it) : m_it(it) {}
|
||
00691 InputIterator get_reference()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_it++; }
|
||
00692 };
|
||
00693
|
||
00694 <span class="comment">// Item dereference wrapper.</span>
|
||
00695 <span class="keyword">struct </span>item_wrapper {
|
||
00696 const_pointer m_item;
|
||
00697 <span class="keyword">explicit</span> item_wrapper(param_value_type item) : m_item(&item) {}
|
||
00698 const_pointer get_reference()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_item; }
|
||
00699 };
|
||
00700
|
||
00701 <span class="keyword">public</span>:
|
||
00702 <span class="comment">// Insert</span>
|
||
00703
|
||
00705
|
||
<a name="l00714"></a><a class="code" href="classboost_1_1circular__buffer.html#a41">00714</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos, param_value_type item) {
|
||
00715 BOOST_CB_ASSERT(pos.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00716 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>() && pos == <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>())
|
||
00717 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
|
||
00718 <span class="keywordflow">if</span> (pos.m_it == 0) {
|
||
00719 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>())
|
||
00720 replace_last(item);
|
||
00721 <span class="keywordflow">else</span>
|
||
00722 m_alloc.construct(m_last, item);
|
||
00723 pos.m_it = m_last;
|
||
00724 } <span class="keywordflow">else</span> {
|
||
00725 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> src = m_last;
|
||
00726 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> dest = m_last;
|
||
00727 BOOST_CB_TRY
|
||
00728 <span class="keywordflow">while</span> (src != pos.m_it) {
|
||
00729 decrement(src);
|
||
00730 <span class="keywordflow">if</span> (dest == m_last && !<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>())
|
||
00731 m_alloc.construct(dest, *src);
|
||
00732 <span class="keywordflow">else</span>
|
||
00733 replace(dest, *src);
|
||
00734 decrement(dest);
|
||
00735 }
|
||
00736 replace(pos.m_it, item);
|
||
00737 BOOST_CB_UNWIND(
|
||
00738 <span class="keywordflow">if</span> (dest == m_last) {
|
||
00739 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()) {
|
||
00740 increment(m_first);
|
||
00741 --m_size;
|
||
00742 }
|
||
00743 } <span class="keywordflow">else</span> {
|
||
00744 <span class="keywordflow">if</span> (!<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()) {
|
||
00745 increment(m_last);
|
||
00746 ++m_size;
|
||
00747 }
|
||
00748 tidy(dest);
|
||
00749 }
|
||
00750 )
|
||
00751 }
|
||
00752 increment(m_last);
|
||
00753 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>())
|
||
00754 m_first = m_last;
|
||
00755 <span class="keywordflow">else</span>
|
||
00756 ++m_size;
|
||
00757 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>(<span class="keyword">this</span>, pos.m_it);
|
||
00758 }
|
||
00759
|
||
00761
|
||
<a name="l00769"></a><a class="code" href="classboost_1_1circular__buffer.html#a42">00769</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos) { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(pos, <a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>()); }
|
||
00770
|
||
00772
|
||
<a name="l00790"></a><a class="code" href="classboost_1_1circular__buffer.html#a43">00790</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos, <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> n, param_value_type item) {
|
||
00791 BOOST_CB_ASSERT(pos.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00792 <span class="keywordflow">if</span> (n == 0)
|
||
00793 <span class="keywordflow">return</span>;
|
||
00794 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> copy = <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>() - (<a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() - pos);
|
||
00795 <span class="keywordflow">if</span> (copy == 0)
|
||
00796 <span class="keywordflow">return</span>;
|
||
00797 <span class="keywordflow">if</span> (n > copy)
|
||
00798 n = copy;
|
||
00799 insert_n_item(pos, n, item_wrapper(item));
|
||
00800 }
|
||
00801
|
||
00803
|
||
00824 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
<a name="l00825"></a><a class="code" href="classboost_1_1circular__buffer.html#a44">00825</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos, InputIterator first, InputIterator last) {
|
||
00826 BOOST_CB_ASSERT(pos.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00827 <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(pos, first, last, cb_details::cb_iterator_category_traits<InputIterator>::tag());
|
||
00828 }
|
||
00829
|
||
00831
|
||
<a name="l00840"></a><a class="code" href="classboost_1_1circular__buffer.html#a45">00840</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos, param_value_type item) {
|
||
00841 BOOST_CB_ASSERT(pos.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00842 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>() && pos == <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>())
|
||
00843 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>();
|
||
00844 <span class="keywordflow">if</span> (pos == <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>()) {
|
||
00845 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()) {
|
||
00846 replace_first(item);
|
||
00847 } <span class="keywordflow">else</span> {
|
||
00848 decrement(m_first);
|
||
00849 BOOST_CB_TRY
|
||
00850 m_alloc.construct(m_first, item);
|
||
00851 BOOST_CB_UNWIND(increment(m_first))
|
||
00852 }
|
||
00853 } <span class="keywordflow">else</span> {
|
||
00854 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> src = m_first;
|
||
00855 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> dest = m_first;
|
||
00856 decrement(dest);
|
||
00857 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> it = map_pointer(pos.m_it);
|
||
00858 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> first = m_first;
|
||
00859 decrement(first);
|
||
00860 BOOST_CB_TRY
|
||
00861 <span class="keywordflow">while</span> (src != it) {
|
||
00862 <span class="keywordflow">if</span> (dest == first && !<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>())
|
||
00863 m_alloc.construct(dest, *src);
|
||
00864 <span class="keywordflow">else</span>
|
||
00865 replace(dest, *src);
|
||
00866 increment(src);
|
||
00867 increment(dest);
|
||
00868 }
|
||
00869 replace((--pos).m_it, item);
|
||
00870 BOOST_CB_UNWIND(
|
||
00871 <span class="keywordflow">if</span> (dest == first) {
|
||
00872 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()) {
|
||
00873 decrement(m_last);
|
||
00874 --m_size;
|
||
00875 }
|
||
00876 } <span class="keywordflow">else</span> {
|
||
00877 <span class="keywordflow">if</span> (!<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>()) {
|
||
00878 m_first = first;
|
||
00879 ++m_size;
|
||
00880 }
|
||
00881 tidy(dest);
|
||
00882 }
|
||
00883 )
|
||
00884 decrement(m_first);
|
||
00885 }
|
||
00886 <span class="keywordflow">if</span> (<a class="code" href="classboost_1_1circular__buffer.html#a22">full</a>())
|
||
00887 m_last = m_first;
|
||
00888 <span class="keywordflow">else</span>
|
||
00889 ++m_size;
|
||
00890 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>(<span class="keyword">this</span>, pos.m_it);
|
||
00891 }
|
||
00892
|
||
00894
|
||
<a name="l00902"></a><a class="code" href="classboost_1_1circular__buffer.html#a46">00902</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos) { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(pos, <a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>()); }
|
||
00903
|
||
00905
|
||
<a name="l00923"></a><a class="code" href="classboost_1_1circular__buffer.html#a47">00923</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos, <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> n, param_value_type item) {
|
||
00924 BOOST_CB_ASSERT(pos.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00925 rinsert_n_item(pos, n, item_wrapper(item));
|
||
00926 }
|
||
00927
|
||
00929
|
||
00950 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
<a name="l00951"></a><a class="code" href="classboost_1_1circular__buffer.html#a48">00951</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos, InputIterator first, InputIterator last) {
|
||
00952 BOOST_CB_ASSERT(pos.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00953 <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(pos, first, last, cb_details::cb_iterator_category_traits<InputIterator>::tag());
|
||
00954 }
|
||
00955
|
||
00956 <span class="comment">// Erase</span>
|
||
00957
|
||
00959
|
||
<a name="l00968"></a><a class="code" href="classboost_1_1circular__buffer.html#a49">00968</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a49">erase</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> pos) {
|
||
00969 BOOST_CB_ASSERT(pos.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00970 BOOST_CB_ASSERT(pos.m_it != 0); <span class="comment">// check for iterator pointing to end()</span>
|
||
00971 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> next = pos.m_it;
|
||
00972 increment(next);
|
||
00973 <span class="keywordflow">for</span> (<a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> p = pos.m_it; next != m_last; p = next, increment(next))
|
||
00974 replace(p, *next);
|
||
00975 decrement(m_last);
|
||
00976 destroy_item(m_last);
|
||
00977 --m_size;
|
||
00978 <span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
00979 <span class="preprocessor"></span> <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>() ? <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() : <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>(<span class="keyword">this</span>, pos.m_it);
|
||
00980 <span class="preprocessor">#else</span>
|
||
00981 <span class="preprocessor"></span> <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>() ? <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() : pos;
|
||
00982 <span class="preprocessor">#endif</span>
|
||
00983 <span class="preprocessor"></span> }
|
||
00984
|
||
00986
|
||
<a name="l00995"></a><a class="code" href="classboost_1_1circular__buffer.html#a50">00995</a> <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> <a class="code" href="classboost_1_1circular__buffer.html#a49">erase</a>(<a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> first, <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a> last) {
|
||
00996 BOOST_CB_ASSERT(first.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00997 BOOST_CB_ASSERT(last.is_valid()); <span class="comment">// check for uninitialized or invalidated iterator</span>
|
||
00998 BOOST_CB_ASSERT(first.m_buff == last.m_buff); <span class="comment">// check for iterators of different containers</span>
|
||
00999 BOOST_CB_ASSERT(first <= last); <span class="comment">// check for wrong range</span>
|
||
01000 <span class="keywordflow">if</span> (first == last)
|
||
01001 <span class="keywordflow">return</span> first;
|
||
01002 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> tmp = first.m_it;
|
||
01003 <a class="code" href="classboost_1_1circular__buffer.html#w5">difference_type</a> diff = last - first;
|
||
01004 <span class="keywordflow">while</span> (last.m_it != 0)
|
||
01005 replace((first++).m_it, *last++);
|
||
01006 <span class="keywordflow">while</span> (first.m_it != 0)
|
||
01007 destroy_item((first++).m_it);
|
||
01008 m_last = sub(m_last, diff);
|
||
01009 m_size -= diff;
|
||
01010 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a21">empty</a>() ? <a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() : <a class="code" href="classboost_1_1circular__buffer.html#w11">iterator</a>(<span class="keyword">this</span>, tmp);
|
||
01011 }
|
||
01012
|
||
01014
|
||
<a name="l01018"></a><a class="code" href="classboost_1_1circular__buffer.html#a51">01018</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a51">clear</a>() {
|
||
01019 destroy_content();
|
||
01020 m_first = m_last = m_buff;
|
||
01021 m_size = 0;
|
||
01022 }
|
||
01023
|
||
01024 <span class="keyword">private</span>:
|
||
01025 <span class="comment">// Debug support</span>
|
||
01026
|
||
01027 <span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
01028 <span class="preprocessor"></span>
|
||
01029 <span class="comment">// Predicate determining if the condition for iterator invalidation has been met.</span>
|
||
01030 <span class="keyword">struct </span>is_invalid_condition {
|
||
01031 pointer m_p;
|
||
01032 <span class="keyword">explicit</span> is_invalid_condition(pointer p) : m_p(p) {}
|
||
01033 <span class="keywordtype">bool</span> operator () (<span class="keyword">const</span> cb_details::cb_iterator_base* p)<span class="keyword"> const </span>{
|
||
01034 <span class="keywordflow">return</span> ((iterator*)p)->m_it == m_p;
|
||
01035 }
|
||
01036 };
|
||
01037
|
||
01038 <span class="preprocessor">#endif // #if BOOST_CB_ENABLE_DEBUG</span>
|
||
01039 <span class="preprocessor"></span>
|
||
01040 <span class="comment">// Helper methods</span>
|
||
01041
|
||
01043 <span class="keywordtype">void</span> check_position(size_type index)<span class="keyword"> const </span>{
|
||
01044 <span class="keywordflow">if</span> (index >= <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>())
|
||
01045 throw_exception(std::out_of_range(<span class="stringliteral">"circular_buffer"</span>));
|
||
01046 }
|
||
01047
|
||
01049 <span class="keyword">template</span> <<span class="keyword">class</span> Po<span class="keywordtype">int</span>er0>
|
||
01050 <span class="keywordtype">void</span> increment(Pointer0& p)<span class="keyword"> const </span>{
|
||
01051 <span class="keywordflow">if</span> (++p == m_end)
|
||
01052 p = m_buff;
|
||
01053 }
|
||
01054
|
||
01056 <span class="keyword">template</span> <<span class="keyword">class</span> Po<span class="keywordtype">int</span>er0>
|
||
01057 <span class="keywordtype">void</span> decrement(Pointer0& p)<span class="keyword"> const </span>{
|
||
01058 <span class="keywordflow">if</span> (p == m_buff)
|
||
01059 p = m_end;
|
||
01060 --p;
|
||
01061 }
|
||
01062
|
||
01064 <span class="keyword">template</span> <<span class="keyword">class</span> Po<span class="keywordtype">int</span>er0>
|
||
01065 Pointer0 add(Pointer0 p, difference_type n)<span class="keyword"> const </span>{
|
||
01066 <span class="keywordflow">return</span> p + (n < (m_end - p) ? n : n - <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>());
|
||
01067 }
|
||
01068
|
||
01070 <span class="keyword">template</span> <<span class="keyword">class</span> Po<span class="keywordtype">int</span>er0>
|
||
01071 Pointer0 sub(Pointer0 p, difference_type n)<span class="keyword"> const </span>{
|
||
01072 <span class="keywordflow">return</span> p - (n > (p - m_buff) ? n - <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>() : n);
|
||
01073 }
|
||
01074
|
||
01076 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> map_pointer(pointer p)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> p == 0 ? m_last : p; }
|
||
01077
|
||
01079 <span class="keywordtype">bool</span> is_uninitialized(const_pointer p)<span class="keyword"> const </span>{
|
||
01080 <span class="keywordflow">return</span> p >= m_last && (m_first < m_last || p < m_first);
|
||
01081 }
|
||
01082
|
||
01084
|
||
01087 <span class="keywordtype">void</span> create_or_replace(pointer pos, param_value_type item) {
|
||
01088 <span class="keywordflow">if</span> (is_uninitialized(pos))
|
||
01089 m_alloc.construct(pos, item);
|
||
01090 <span class="keywordflow">else</span>
|
||
01091 replace(pos, item);
|
||
01092 }
|
||
01093
|
||
01095
|
||
01098 <span class="keywordtype">void</span> destroy_created(pointer pos) {
|
||
01099 <span class="keywordflow">if</span> (is_uninitialized(pos))
|
||
01100 destroy_item(pos);
|
||
01101 }
|
||
01102
|
||
01104 <span class="keywordtype">void</span> replace(pointer pos, param_value_type item) {
|
||
01105 replace(pos, item, cb_details::cb_replace_category_traits<value_type>::tag()); <span class="comment">// invoke optimized operation for given type</span>
|
||
01106 <span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
01107 <span class="preprocessor"></span> invalidate_iterators(is_invalid_condition(pos));
|
||
01108 <span class="preprocessor">#endif</span>
|
||
01109 <span class="preprocessor"></span> }
|
||
01110
|
||
01112 <span class="keywordtype">void</span> replace(pointer pos, param_value_type item, cb_details::cb_destroy_tag) {
|
||
01113 m_alloc.destroy(pos);
|
||
01114 m_alloc.construct(pos, item);
|
||
01115 }
|
||
01116
|
||
01118 <span class="keywordtype">void</span> replace(pointer pos, param_value_type item, cb_details::cb_assign_tag) {
|
||
01119 *pos = item;
|
||
01120 }
|
||
01121
|
||
01123 <span class="keywordtype">void</span> replace_first(param_value_type item) {
|
||
01124 decrement(m_first);
|
||
01125 BOOST_CB_TRY
|
||
01126 replace(m_first, item);
|
||
01127 BOOST_CB_UNWIND(
|
||
01128 increment(m_first);
|
||
01129 decrement(m_last);
|
||
01130 --m_size;
|
||
01131 )
|
||
01132 }
|
||
01133
|
||
01135 <span class="keywordtype">void</span> replace_last(param_value_type item) {
|
||
01136 BOOST_CB_TRY
|
||
01137 replace(m_last, item);
|
||
01138 BOOST_CB_UNWIND(
|
||
01139 decrement(m_last);
|
||
01140 --m_size;
|
||
01141 )
|
||
01142 }
|
||
01143
|
||
01145 <span class="keywordtype">void</span> tidy(pointer p) {
|
||
01146 <span class="keywordflow">for</span> (; m_first != p; increment(m_first), --m_size)
|
||
01147 destroy_item(m_first);
|
||
01148 increment(m_first);
|
||
01149 --m_size;
|
||
01150 }
|
||
01151
|
||
01153 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> allocate(size_type n) {
|
||
01154 <span class="keywordflow">if</span> (n > <a class="code" href="classboost_1_1circular__buffer.html#a20">max_size</a>())
|
||
01155 throw_exception(std::length_error(<span class="stringliteral">"circular_buffer"</span>));
|
||
01156 <span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
01157 <span class="preprocessor"></span> <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> p = (n == 0) ? 0 : m_alloc.allocate(n, 0);
|
||
01158 ::memset(p, cb_details::CB_Unitialized, <span class="keyword">sizeof</span>(<a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>) * n);
|
||
01159 <span class="keywordflow">return</span> p;
|
||
01160 <span class="preprocessor">#else</span>
|
||
01161 <span class="preprocessor"></span> <span class="keywordflow">return</span> (n == 0) ? 0 : m_alloc.allocate(n, 0);
|
||
01162 <span class="preprocessor">#endif</span>
|
||
01163 <span class="preprocessor"></span> }
|
||
01164
|
||
01166 <span class="keywordtype">void</span> deallocate(pointer p, size_type n) {
|
||
01167 <span class="keywordflow">if</span> (p != 0)
|
||
01168 m_alloc.deallocate(p, n);
|
||
01169 }
|
||
01170
|
||
01172 <span class="keywordtype">void</span> destroy_item(pointer p) {
|
||
01173 m_alloc.destroy(p);
|
||
01174 <span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
01175 <span class="preprocessor"></span> invalidate_iterators(is_invalid_condition(p));
|
||
01176 ::memset(p, cb_details::CB_Unitialized, <span class="keyword">sizeof</span>(<a class="code" href="classboost_1_1circular__buffer.html#w0">value_type</a>));
|
||
01177 <span class="preprocessor">#endif</span>
|
||
01178 <span class="preprocessor"></span> }
|
||
01179
|
||
01181 <span class="keywordtype">void</span> destroy_content() {
|
||
01182 <span class="keywordflow">for</span> (<a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> ii = 0; ii < <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>(); ++ii, increment(m_first))
|
||
01183 destroy_item(m_first);
|
||
01184 }
|
||
01185
|
||
01187 <span class="keywordtype">void</span> destroy() {
|
||
01188 destroy_content();
|
||
01189 deallocate(m_buff, <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>());
|
||
01190 <span class="preprocessor">#if BOOST_CB_ENABLE_DEBUG</span>
|
||
01191 <span class="preprocessor"></span> invalidate_all_iterators(); <span class="comment">// invalidate iterators pointing to end()</span>
|
||
01192 m_buff = 0;
|
||
01193 m_first = 0;
|
||
01194 m_last = 0;
|
||
01195 m_end = 0;
|
||
01196 <span class="preprocessor">#endif</span>
|
||
01197 <span class="preprocessor"></span> }
|
||
01198
|
||
01200 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
01201 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a32">assign</a>(InputIterator n, InputIterator item, cb_details::cb_int_iterator_tag) {
|
||
01202 <a class="code" href="classboost_1_1circular__buffer.html#a32">assign</a>((size_type)n, item);
|
||
01203 }
|
||
01204
|
||
01206 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
01207 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a32">assign</a>(InputIterator first, InputIterator last, std::input_iterator_tag) {
|
||
01208 BOOST_CB_IS_CONVERTIBLE(InputIterator, value_type);
|
||
01209 BOOST_CB_ASSERT(std::distance(first, last) >= 0); <span class="comment">// check for wrong range</span>
|
||
01210 do_assign(std::distance(first, last), assign_range<InputIterator>(first, last, m_alloc));
|
||
01211 }
|
||
01212
|
||
01214 <span class="keyword">template</span> <<span class="keyword">class</span> Functor>
|
||
01215 <span class="keywordtype">void</span> do_assign(size_type n, <span class="keyword">const</span> Functor& fnc) {
|
||
01216 <span class="keywordflow">if</span> (n > <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>()) {
|
||
01217 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> buff = allocate(n);
|
||
01218 BOOST_CB_TRY
|
||
01219 fnc(buff);
|
||
01220 BOOST_CB_UNWIND(deallocate(buff, n))
|
||
01221 destroy();
|
||
01222 m_buff = buff;
|
||
01223 m_end = m_buff + n;
|
||
01224 } <span class="keywordflow">else</span> {
|
||
01225 destroy_content();
|
||
01226 BOOST_CB_TRY
|
||
01227 fnc(m_buff);
|
||
01228 BOOST_CB_UNWIND(m_size = 0)
|
||
01229 }
|
||
01230 m_size = n;
|
||
01231 m_first = m_buff;
|
||
01232 m_last = add(m_buff, <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>());
|
||
01233 }
|
||
01234
|
||
01236 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
01237 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(iterator pos, InputIterator n, InputIterator item, cb_details::cb_int_iterator_tag) {
|
||
01238 <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(pos, (size_type)n, item);
|
||
01239 }
|
||
01240
|
||
01242 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
01243 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a41">insert</a>(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
|
||
01244 BOOST_CB_IS_CONVERTIBLE(InputIterator, value_type);
|
||
01245 BOOST_CB_ASSERT(std::distance(first, last) >= 0); <span class="comment">// check for wrong range</span>
|
||
01246 <a class="code" href="classboost_1_1circular__buffer.html#w5">difference_type</a> n = std::distance(first, last);
|
||
01247 <span class="keywordflow">if</span> (n == 0)
|
||
01248 <span class="keywordflow">return</span>;
|
||
01249 <a class="code" href="classboost_1_1circular__buffer.html#w5">difference_type</a> copy = <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>() - (<a class="code" href="classboost_1_1circular__buffer.html#a3">end</a>() - pos);
|
||
01250 <span class="keywordflow">if</span> (copy == 0)
|
||
01251 <span class="keywordflow">return</span>;
|
||
01252 <span class="keywordflow">if</span> (n > copy) {
|
||
01253 std::advance(first, n - copy);
|
||
01254 n = copy;
|
||
01255 }
|
||
01256 insert_n_item(pos, n, iterator_wrapper<InputIterator>(first));
|
||
01257 }
|
||
01258
|
||
01260 <span class="keyword">template</span> <<span class="keyword">class</span> Wrapper>
|
||
01261 <span class="keywordtype">void</span> insert_n_item(iterator pos, size_type n, <span class="keyword">const</span> Wrapper& wrapper) {
|
||
01262 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> construct = <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>() - <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>();
|
||
01263 <span class="keywordflow">if</span> (construct > n)
|
||
01264 construct = n;
|
||
01265 <span class="keywordflow">if</span> (pos.m_it == 0) {
|
||
01266 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> ii = 0;
|
||
01267 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> p = m_last;
|
||
01268 BOOST_CB_TRY
|
||
01269 <span class="keywordflow">for</span> (; ii < construct; ++ii, increment(p))
|
||
01270 m_alloc.construct(p, *wrapper.get_reference());
|
||
01271 <span class="keywordflow">for</span> (;ii < n; ++ii, increment(p))
|
||
01272 replace(p, *wrapper.get_reference());
|
||
01273 BOOST_CB_UNWIND(
|
||
01274 size_type constructed = std::min(ii, construct);
|
||
01275 m_last = add(m_last, constructed);
|
||
01276 m_size += constructed;
|
||
01277 <span class="keywordflow">if</span> (ii >= construct)
|
||
01278 tidy(p);
|
||
01279 )
|
||
01280 } <span class="keywordflow">else</span> {
|
||
01281 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> src = m_last;
|
||
01282 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> dest = add(m_last, n - 1);
|
||
01283 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> ii = 0;
|
||
01284 BOOST_CB_TRY
|
||
01285 <span class="keywordflow">while</span> (src != pos.m_it) {
|
||
01286 decrement(src);
|
||
01287 create_or_replace(dest, *src);
|
||
01288 decrement(dest);
|
||
01289 }
|
||
01290 <span class="keywordflow">for</span> (dest = pos.m_it; ii < n; ++ii, increment(dest))
|
||
01291 create_or_replace(dest, *wrapper.get_reference());
|
||
01292 BOOST_CB_UNWIND(
|
||
01293 <span class="keywordflow">for</span> (pointer p1 = m_last, p2 = add(m_last, n - 1); p1 != src; decrement(p2)) {
|
||
01294 decrement(p1);
|
||
01295 destroy_created(p2);
|
||
01296 }
|
||
01297 <span class="keywordflow">for</span> (n = 0, src = pos.m_it; n < ii; ++n, increment(src))
|
||
01298 destroy_created(src);
|
||
01299 <span class="keywordflow">if</span> (!is_uninitialized(dest))
|
||
01300 tidy(dest);
|
||
01301 )
|
||
01302 }
|
||
01303 m_last = add(m_last, n);
|
||
01304 m_first = add(m_first, n - construct);
|
||
01305 m_size += construct;
|
||
01306 }
|
||
01307
|
||
01309 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
01310 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(iterator pos, InputIterator n, InputIterator item, cb_details::cb_int_iterator_tag) {
|
||
01311 <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(pos, (size_type)n, item);
|
||
01312 }
|
||
01313
|
||
01315 <span class="keyword">template</span> <<span class="keyword">class</span> InputIterator>
|
||
01316 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer.html#a45">rinsert</a>(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
|
||
01317 BOOST_CB_IS_CONVERTIBLE(InputIterator, value_type);
|
||
01318 BOOST_CB_ASSERT(std::distance(first, last) >= 0); <span class="comment">// check for wrong range</span>
|
||
01319 rinsert_n_item(pos, std::distance(first, last), iterator_wrapper<InputIterator>(first));
|
||
01320 }
|
||
01321
|
||
01323 <span class="keyword">template</span> <<span class="keyword">class</span> Wrapper>
|
||
01324 <span class="keywordtype">void</span> rinsert_n_item(iterator pos, size_type n, <span class="keyword">const</span> Wrapper& wrapper) {
|
||
01325 <span class="keywordflow">if</span> (n == 0)
|
||
01326 <span class="keywordflow">return</span>;
|
||
01327 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> copy = <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>() - (pos - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>());
|
||
01328 <span class="keywordflow">if</span> (copy == 0)
|
||
01329 <span class="keywordflow">return</span>;
|
||
01330 <span class="keywordflow">if</span> (n > copy)
|
||
01331 n = copy;
|
||
01332 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> construct = <a class="code" href="classboost_1_1circular__buffer.html#a23">capacity</a>() - <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>();
|
||
01333 <span class="keywordflow">if</span> (construct > n)
|
||
01334 construct = n;
|
||
01335 <span class="keywordflow">if</span> (pos == <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>()) {
|
||
01336 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> p = sub(map_pointer(pos.m_it), n);
|
||
01337 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> ii = n;
|
||
01338 BOOST_CB_TRY
|
||
01339 <span class="keywordflow">for</span> (;ii > construct; --ii, increment(p))
|
||
01340 replace(p, *wrapper.get_reference());
|
||
01341 <span class="keywordflow">for</span> (; ii > 0; --ii, increment(p))
|
||
01342 m_alloc.construct(p, *wrapper.get_reference());
|
||
01343 BOOST_CB_UNWIND(
|
||
01344 size_type unwind = ii < construct ? construct - ii : 0;
|
||
01345 pointer tmp = sub(map_pointer(pos.m_it), construct);
|
||
01346 for (n = 0; n < unwind; ++n, increment(tmp))
|
||
01347 destroy_item(tmp);
|
||
01348 <span class="keywordflow">if</span> (ii > construct)
|
||
01349 tidy(p);
|
||
01350 )
|
||
01351 } <span class="keywordflow">else</span> {
|
||
01352 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> src = m_first;
|
||
01353 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> dest = sub(m_first, n);
|
||
01354 <a class="code" href="classboost_1_1circular__buffer.html#w1">pointer</a> p = map_pointer(pos.m_it);
|
||
01355 <a class="code" href="classboost_1_1circular__buffer.html#w6">size_type</a> ii = 0;
|
||
01356 BOOST_CB_TRY
|
||
01357 <span class="keywordflow">while</span> (src != p) {
|
||
01358 create_or_replace(dest, *src);
|
||
01359 increment(src);
|
||
01360 increment(dest);
|
||
01361 }
|
||
01362 dest = sub(p, n);
|
||
01363 <span class="keywordflow">for</span> (; ii < n; ++ii, increment(dest))
|
||
01364 create_or_replace(dest, *wrapper.get_reference());
|
||
01365 BOOST_CB_UNWIND(
|
||
01366 <span class="keywordflow">for</span> (pointer p1 = m_first, p2 = sub(m_first, n); p1 != src; increment(p1), increment(p2))
|
||
01367 destroy_created(p2);
|
||
01368 p = sub(p, n);
|
||
01369 <span class="keywordflow">for</span> (n = 0; n < ii; ++n, increment(p))
|
||
01370 destroy_created(p);
|
||
01371 <span class="keywordflow">if</span> (!is_uninitialized(dest))
|
||
01372 tidy(dest);
|
||
01373 )
|
||
01374 }
|
||
01375 m_first = sub(m_first, n);
|
||
01376 m_last = sub(m_last, n - construct);
|
||
01377 m_size += construct;
|
||
01378 }
|
||
01379 };
|
||
01380
|
||
01381 <span class="comment">// Non-member functions</span>
|
||
01382
|
||
01384 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
01385 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> circular_buffer<T, Alloc>& lhs,
|
||
01386 <span class="keyword">const</span> circular_buffer<T, Alloc>& rhs) {
|
||
01387 <span class="keywordflow">return</span> lhs.size() == rhs.size() &&
|
||
01388 std::equal(lhs.begin(), lhs.end(), rhs.begin());
|
||
01389 }
|
||
01390
|
||
01392 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
01393 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator < (const circular_buffer<T, Alloc>& lhs,
|
||
01394 <span class="keyword">const</span> circular_buffer<T, Alloc>& rhs) {
|
||
01395 <span class="keywordflow">return</span> std::lexicographical_compare(
|
||
01396 lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
|
||
01397 }
|
||
01398
|
||
01399 <span class="preprocessor">#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || defined(BOOST_MSVC)</span>
|
||
01400 <span class="preprocessor"></span>
|
||
01402 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
01403 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> circular_buffer<T, Alloc>& lhs,
|
||
01404 <span class="keyword">const</span> circular_buffer<T, Alloc>& rhs) {
|
||
01405 <span class="keywordflow">return</span> !(lhs == rhs);
|
||
01406 }
|
||
01407
|
||
01409 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
01410 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator > (<span class="keyword">const</span> circular_buffer<T, Alloc>& lhs,
|
||
01411 <span class="keyword">const</span> circular_buffer<T, Alloc>& rhs) {
|
||
01412 <span class="keywordflow">return</span> rhs < lhs;
|
||
01413 }
|
||
01414
|
||
01416 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
01417 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator <= (const circular_buffer<T, Alloc>& lhs,
|
||
01418 <span class="keyword">const</span> circular_buffer<T, Alloc>& rhs) {
|
||
01419 <span class="keywordflow">return</span> !(rhs < lhs);
|
||
01420 }
|
||
01421
|
||
01423 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
01424 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator >= (<span class="keyword">const</span> circular_buffer<T, Alloc>& lhs,
|
||
01425 <span class="keyword">const</span> circular_buffer<T, Alloc>& rhs) {
|
||
01426 <span class="keywordflow">return</span> !(lhs < rhs);
|
||
01427 }
|
||
01428
|
||
01430 <span class="keyword">template</span> <<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc>
|
||
01431 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(circular_buffer<T, Alloc>& lhs, circular_buffer<T, Alloc>& rhs) {
|
||
01432 lhs.swap(rhs);
|
||
01433 }
|
||
01434
|
||
01435 <span class="preprocessor">#endif // #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || defined(BOOST_MSVC)</span>
|
||
01436 <span class="preprocessor"></span>
|
||
01437 } <span class="comment">// namespace boost</span>
|
||
01438
|
||
01439 <span class="preprocessor">#endif // #if !defined(BOOST_CIRCULAR_BUFFER_BASE_HPP)</span>
|
||
</pre></div><hr>
|
||
<table id="Table Footer" width="100%" border="0">
|
||
<tr>
|
||
<td valign="top"><small>Copyright <20> 2003-2004 <A href="mailto:jano_gaspar[at]yahoo.com">Jan
|
||
Gaspar</A></small></td>
|
||
<td align="center"><img width="277" height="86" src="../../../../c++boost.gif"></td>
|
||
<td align="right" valign="top"><small>Generated by <a href="http://www.doxygen.org">doxygen
|
||
1.3.5</a>.</small></td>
|
||
</tr>
|
||
</table>
|
||
</body>
|
||
</html>
|