Files
circular_buffer/doc/srcdoc/adaptor_8hpp-source.html
Jan Gaspar d8021d4ff2 Initial revision.
[SVN r2447]
2005-01-19 09:45:55 +00:00

433 lines
46 KiB
HTML
Raw Blame History

<!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>adaptor.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&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a></div>
<h1>adaptor.hpp</h1><div class="fragment"><pre>00001 <span class="comment">// Implementation of the circular buffer adaptor.</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_ADAPTOR_HPP)</span>
00010 <span class="preprocessor"></span><span class="preprocessor">#define BOOST_CIRCULAR_BUFFER_ADAPTOR_HPP</span>
00011 <span class="preprocessor"></span>
00012 <span class="preprocessor">#if defined(_MSC_VER) &amp;&amp; _MSC_VER &gt;= 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="keyword">namespace </span>boost {
00017
00031 <span class="keyword">template</span>&lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
<a name="l00032"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html">00032</a> <span class="keyword">class </span><a class="code" href="classboost_1_1circular__buffer__space__optimized.html">circular_buffer_space_optimized</a> : <span class="keyword">private</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer</a>&lt;T, Alloc&gt; {
00033 <span class="keyword">public</span>:
00034 <span class="comment">// Typedefs</span>
00035
<a name="l00036"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w0">00036</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::value_type</a> <a class="code" href="classboost_1_1circular__buffer.html">value_type</a>;
<a name="l00037"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w1">00037</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::pointer</a> <a class="code" href="classboost_1_1circular__buffer.html">pointer</a>;
<a name="l00038"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w2">00038</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::const_pointer</a> <a class="code" href="classboost_1_1circular__buffer.html">const_pointer</a>;
<a name="l00039"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w3">00039</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::reference</a> <a class="code" href="classboost_1_1circular__buffer.html">reference</a>;
<a name="l00040"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w4">00040</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::const_reference</a> <a class="code" href="classboost_1_1circular__buffer.html">const_reference</a>;
<a name="l00041"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w5">00041</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::size_type</a> <a class="code" href="classboost_1_1circular__buffer.html">size_type</a>;
<a name="l00042"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w6">00042</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::difference_type</a> <a class="code" href="classboost_1_1circular__buffer.html">difference_type</a>;
<a name="l00043"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w7">00043</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::allocator_type</a> <a class="code" href="classboost_1_1circular__buffer.html">allocator_type</a>;
00044 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::param_value_type</a> <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a>;
<a name="l00045"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w9">00045</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::const_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html">const_iterator</a>;
<a name="l00046"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w10">00046</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::iterator</a> <a class="code" href="classboost_1_1circular__buffer.html">iterator</a>;
<a name="l00047"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w11">00047</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::const_reverse_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html">const_reverse_iterator</a>;
<a name="l00048"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w12">00048</a> <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a><a class="code" href="classboost_1_1circular__buffer.html">::reverse_iterator</a> <a class="code" href="classboost_1_1circular__buffer.html">reverse_iterator</a>;
00049
00050 <span class="comment">// Inherited</span>
00051
00052 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::get_allocator;
00053 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::begin;
00054 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::end;
00055 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::rbegin;
00056 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::rend;
00057 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::at;
00058 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::front;
00059 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::back;
00060 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::data;
00061 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::size;
00062 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::max_size;
00063 <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::empty;
00064
00065 <span class="preprocessor">#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))</span>
<a name="l00066"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a0">00066</a> <span class="preprocessor"></span> <a class="code" href="classboost_1_1circular__buffer.html">reference</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a0">operator [] </a>(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> n) { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::operator[]</a>(n); }
<a name="l00067"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a1">00067</a> return_value_type <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a0">operator [] </a>(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> n)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::operator[]</a>(n); }
00068 <span class="preprocessor">#else</span>
00069 <span class="preprocessor"></span> <span class="keyword">using</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;</a>::operator[];
00070 <span class="preprocessor">#endif</span>
00071 <span class="preprocessor"></span>
00072 <span class="keyword">private</span>:
00073 <span class="comment">// Member variables</span>
00074
00076 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> m_capacity;
00077
00079 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> m_min_capacity;
00080
00081 <span class="keyword">public</span>:
00082 <span class="comment">// Overridden</span>
00083
<a name="l00085"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a2">00085</a> <span class="keywordtype">bool</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a2">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__space__optimized.html#a5">capacity</a>(); }
00086
00088
<a name="l00091"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a3">00091</a> <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a3">min_capacity</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_min_capacity; }
00092
00094
<a name="l00102"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a4">00102</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a4">set_min_capacity</a>(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> new_min_capacity) {
00103 BOOST_CB_ASSERT(<a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a5">capacity</a>() &gt;= new_min_capacity); <span class="comment">// check for too large new min_capacity</span>
00104 m_min_capacity = new_min_capacity;
00105 <span class="keywordflow">if</span> (new_min_capacity &gt; <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::capacity</a>())
00106 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::set_capacity</a>(new_min_capacity);
00107 <span class="keywordflow">else</span>
00108 check_high_capacity();
00109 }
00110
<a name="l00112"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a5">00112</a> <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a5">capacity</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> m_capacity; }
00113
00114 <span class="preprocessor">#if defined(BOOST_CB_TEST)</span>
00115 <span class="preprocessor"></span>
00117
<a name="l00121"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a6">00121</a> <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a6">internal_capacity</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::capacity</a>(); }
00122
00123 <span class="preprocessor">#endif // #if defined(BOOST_CB_TEST)</span>
00124 <span class="preprocessor"></span>
00126
<a name="l00132"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a7">00132</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a7">set_capacity</a>(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> new_capacity, <span class="keywordtype">bool</span> remove_front = <span class="keyword">true</span>) {
00133 BOOST_CB_ASSERT(new_capacity &gt;= <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a3">min_capacity</a>()); <span class="comment">// check for too low new capacity</span>
00134 <span class="keywordflow">if</span> (new_capacity &lt; circular_buffer&lt;T, Alloc&gt;::capacity())
00135 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::set_capacity</a>(new_capacity, remove_front);
00136 m_capacity = new_capacity;
00137 }
00138
<a name="l00140"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a8">00140</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a8">resize</a>(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> new_size, <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item = T(), <span class="keywordtype">bool</span> remove_front = <span class="keyword">true</span>) {
00141 <span class="keywordflow">if</span> (new_size &gt; <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>()) {
00142 <span class="keywordflow">if</span> (new_size &gt; <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a5">capacity</a>())
00143 m_capacity = new_size;
00144 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">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);
00145 } <span class="keywordflow">else</span> {
00146 <span class="keywordflow">if</span> (remove_front)
00147 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a29">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);
00148 <span class="keywordflow">else</span>
00149 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a29">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>());
00150 }
00151 }
00152
00154
<a name="l00167"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a9">00167</a> <span class="keyword">explicit</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a9">circular_buffer_space_optimized</a>(
00168 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> capacity,
00169 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> min_capacity = 0,
00170 <span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html">allocator_type</a>&amp; alloc = <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w7">allocator_type</a>())
00171 : <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer</a>&lt;T, Alloc&gt;(min_capacity, alloc)
00172 , m_capacity(capacity)
00173 , m_min_capacity(min_capacity) {
00174 BOOST_CB_ASSERT(capacity &gt;= min_capacity); <span class="comment">// check for capacity lower than min_capacity</span>
00175 }
00176
00178
<a name="l00192"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a10">00192</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a9">circular_buffer_space_optimized</a>(
00193 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> capacity,
00194 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> min_capacity,
00195 <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item,
00196 <span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html">allocator_type</a>&amp; alloc = <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w7">allocator_type</a>())
00197 : <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer</a>&lt;T, Alloc&gt;(capacity, item, alloc)
00198 , m_capacity(capacity)
00199 , m_min_capacity(min_capacity) {
00200 BOOST_CB_ASSERT(capacity &gt;= min_capacity); <span class="comment">// check for capacity lower than min_capacity</span>
00201 }
00202
00203 <span class="comment">// Default copy constructor</span>
00204
00206
00227 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
<a name="l00228"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a11">00228</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a9">circular_buffer_space_optimized</a>(
00229 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> capacity,
00230 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> min_capacity,
00231 InputIterator first,
00232 InputIterator last,
00233 <span class="keyword">const</span> <a class="code" href="classboost_1_1circular__buffer.html">allocator_type</a>&amp; alloc = <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w7">allocator_type</a>())
00234 : <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer</a>&lt;T, Alloc&gt;(
00235 init_capacity(capacity, min_capacity, first, last), first, last, alloc)
00236 , m_capacity(capacity)
00237 , m_min_capacity(min_capacity) {
00238 BOOST_CB_ASSERT(capacity &gt;= min_capacity); <span class="comment">// check for capacity lower than min_capacity</span>
00239 BOOST_CB_ASSERT(std::distance(first, last) &gt;= 0); <span class="comment">// check for wrong range</span>
00240 }
00241
00242 <span class="comment">// Default destructor</span>
00243
00244 <span class="comment">// Default assign operator</span>
00245
<a name="l00247"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a12">00247</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a12">assign</a>(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> n, <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item) {
00248 <span class="keywordflow">if</span> (n &gt; m_capacity)
00249 m_capacity = n;
00250 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::assign</a>(n, item);
00251 }
00252
00254 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
<a name="l00255"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a13">00255</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a12">assign</a>(InputIterator first, InputIterator last) {
00256 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::assign</a>(first, last);
00257 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> capacity = <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::capacity</a>();
00258 <span class="keywordflow">if</span> (capacity &gt; m_capacity)
00259 m_capacity = capacity;
00260 }
00261
<a name="l00263"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a14">00263</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a14">swap</a>(<a class="code" href="classboost_1_1circular__buffer__space__optimized.html">circular_buffer_space_optimized</a>&amp; cb) {
00264 std::swap(m_capacity, cb.<a class="code" href="classboost_1_1circular__buffer__space__optimized.html#r0">m_capacity</a>);
00265 std::swap(m_min_capacity, cb.<a class="code" href="classboost_1_1circular__buffer__space__optimized.html#r1">m_min_capacity</a>);
00266 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::swap</a>(cb);
00267 }
00268
00270
<a name="l00275"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a15">00275</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a16">push_back</a>(<a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item) {
00276 check_low_capacity();
00277 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::push_back</a>(item);
00278 }
00279
00281
<a name="l00286"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a16">00286</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a16">push_back</a>() { <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a16">push_back</a>(<a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w0">value_type</a>()); }
00287
00289
<a name="l00294"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a17">00294</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a18">push_front</a>(<a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item) {
00295 check_low_capacity();
00296 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::push_front</a>(item);
00297 }
00298
00300
<a name="l00305"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a18">00305</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a18">push_front</a>() { <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a18">push_front</a>(<a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w0">value_type</a>()); }
00306
00308
<a name="l00313"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a19">00313</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a19">pop_back</a>() {
00314 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::pop_back</a>();
00315 check_high_capacity();
00316 }
00317
00319
<a name="l00324"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a20">00324</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a20">pop_front</a>() {
00325 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::pop_front</a>();
00326 check_high_capacity();
00327 }
00328
00330
<a name="l00335"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">00335</a> <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos, <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item) {
00336 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> index = pos - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00337 check_low_capacity();
00338 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::insert</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index, item);
00339 }
00340
00342
<a name="l00347"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a22">00347</a> <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos) { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(pos, <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w0">value_type</a>()); }
00348
00350
<a name="l00355"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a23">00355</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos, <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> n, <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item) {
00356 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> index = pos - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00357 check_low_capacity(n);
00358 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::insert</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index, n, item);
00359 }
00360
00362
00367 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
<a name="l00368"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a24">00368</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos, InputIterator first, InputIterator last) {
00369 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(pos, first, last, cb_details::cb_iterator_category_traits&lt;InputIterator&gt;::tag());
00370 }
00371
00373
<a name="l00378"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">00378</a> <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos, <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item) {
00379 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> index = pos - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00380 check_low_capacity();
00381 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index, item);
00382 }
00383
00385
<a name="l00390"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a26">00390</a> <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos) { <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(pos, <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w0">value_type</a>()); }
00391
00393
<a name="l00398"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a27">00398</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos, <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> n, <a class="code" href="classboost_1_1circular__buffer.html">param_value_type</a> item) {
00399 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> index = pos - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00400 check_low_capacity(n);
00401 <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index, n, item);
00402 }
00403
00405
00410 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
<a name="l00411"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a28">00411</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos, InputIterator first, InputIterator last) {
00412 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(pos, first, last, cb_details::cb_iterator_category_traits&lt;InputIterator&gt;::tag());
00413 }
00414
00416
<a name="l00421"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a29">00421</a> <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a29">erase</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> pos) {
00422 <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> it = <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::erase</a>(pos);
00423 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> index = it - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00424 check_high_capacity();
00425 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index;
00426 }
00427
00429
<a name="l00434"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a30">00434</a> <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a29">erase</a>(<a class="code" href="classboost_1_1circular__buffer.html">iterator</a> first, <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> last) {
00435 <a class="code" href="classboost_1_1circular__buffer.html">iterator</a> it = <a class="code" href="classboost_1_1circular__buffer.html">circular_buffer&lt;T, Alloc&gt;::erase</a>(first, last);
00436 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> index = it - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00437 check_high_capacity();
00438 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index;
00439 }
00440
<a name="l00442"></a><a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a31">00442</a> <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a31">clear</a>() { <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a29">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>()); }
00443
00444 <span class="keyword">private</span>:
00445 <span class="comment">// Helper methods</span>
00446
00448 <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> ensure_reserve(<a class="code" href="classboost_1_1circular__buffer.html">size_type</a> new_capacity, <a class="code" href="classboost_1_1circular__buffer.html">size_type</a> size)<span class="keyword"> const </span>{
00449 <span class="keywordflow">if</span> (size + new_capacity / 5 &gt;= new_capacity)
00450 new_capacity *= 2; <span class="comment">// ensure at least 20% reserve</span>
00451 <span class="keywordflow">if</span> (new_capacity &gt; <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a5">capacity</a>())
00452 <span class="keywordflow">return</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a5">capacity</a>();
00453 <span class="keywordflow">return</span> new_capacity;
00454 }
00455
00457 <span class="comment">/*</span>
00458 <span class="comment"> \post If the capacity is low it will be increased.</span>
00459 <span class="comment"> */</span>
00460 <span class="keywordtype">void</span> check_low_capacity(size_type n = 1) {
00461 size_type new_size = <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>() + n;
00462 size_type new_capacity = circular_buffer&lt;T, Alloc&gt;::capacity();
00463 <span class="keywordflow">if</span> (new_size &gt; new_capacity) {
00464 <span class="keywordflow">if</span> (new_capacity == 0)
00465 new_capacity = 1;
00466 <span class="keywordflow">for</span> (; new_size &gt; new_capacity; new_capacity *= 2);
00467 circular_buffer&lt;T, Alloc&gt;::set_capacity(
00468 ensure_reserve(new_capacity, new_size));
00469 }
00470 }
00471
00473 <span class="comment">/*</span>
00474 <span class="comment"> \post If the capacity is high it will be decreased.</span>
00475 <span class="comment"> */</span>
00476 <span class="keywordtype">void</span> check_high_capacity() {
00477 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w5">size_type</a> new_capacity = circular_buffer&lt;T, Alloc&gt;::capacity();
00478 <span class="keywordflow">while</span> (new_capacity / 3 &gt;= <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>()) { <span class="comment">// (new_capacity / 3) -&gt; avoid oscillations</span>
00479 new_capacity /= 2;
00480 <span class="keywordflow">if</span> (new_capacity &lt;= <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a3">min_capacity</a>()) {
00481 new_capacity = <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a3">min_capacity</a>();
00482 <span class="keywordflow">break</span>;
00483 }
00484 }
00485 circular_buffer&lt;T, Alloc&gt;::set_capacity(
00486 ensure_reserve(new_capacity, <a class="code" href="classboost_1_1circular__buffer.html#a19">size</a>()));
00487 }
00488
00490 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
00491 <span class="keyword">static</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w5">size_type</a> init_capacity(size_type capacity, size_type min_capacity, InputIterator first, InputIterator last) {
00492 BOOST_CB_IS_CONVERTIBLE(InputIterator, value_type);
00493 <span class="keywordflow">return</span> std::min(capacity, std::max(min_capacity,
00494 static_cast&lt;size_type&gt;(std::distance(first, last))));
00495 }
00496
00498 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
00499 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(iterator pos, InputIterator n, InputIterator item, cb_details::cb_int_iterator_tag) {
00500 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(pos, (size_type)n, item);
00501 }
00502
00504 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
00505 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a21">insert</a>(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
00506 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w5">size_type</a> index = pos - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00507 check_low_capacity(std::distance(first, last));
00508 circular_buffer&lt;T, Alloc&gt;::insert(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index, first, last);
00509 }
00510
00512 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
00513 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(iterator pos, InputIterator n, InputIterator item, cb_details::cb_int_iterator_tag) {
00514 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(pos, (size_type)n, item);
00515 }
00516
00518 <span class="keyword">template</span> &lt;<span class="keyword">class</span> InputIterator&gt;
00519 <span class="keywordtype">void</span> <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#a25">rinsert</a>(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
00520 <a class="code" href="classboost_1_1circular__buffer__space__optimized.html#w5">size_type</a> index = pos - <a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>();
00521 check_low_capacity(std::distance(first, last));
00522 circular_buffer&lt;T, Alloc&gt;::rinsert(<a class="code" href="classboost_1_1circular__buffer.html#a2">begin</a>() + index, first, last);
00523 }
00524 };
00525
00526 <span class="comment">// Non-member functions</span>
00527
00529 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
00530 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator == (<span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; lhs,
00531 <span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; rhs) {
00532 <span class="keywordflow">return</span> lhs.size() == rhs.size() &amp;&amp;
00533 std::equal(lhs.begin(), lhs.end(), rhs.begin());
00534 }
00535
00537 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
00538 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &lt; (const circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; lhs,
00539 <span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; rhs) {
00540 <span class="keywordflow">return</span> std::lexicographical_compare(
00541 lhs.begin(), lhs.end(), rhs.begin(), rhs.end());
00542 }
00543
00544 <span class="preprocessor">#if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))</span>
00545 <span class="preprocessor"></span>
00547 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
00548 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator != (<span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; lhs,
00549 <span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; rhs) {
00550 <span class="keywordflow">return</span> !(lhs == rhs);
00551 }
00552
00554 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
00555 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &gt; (<span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; lhs,
00556 <span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; rhs) {
00557 <span class="keywordflow">return</span> rhs &lt; lhs;
00558 }
00559
00561 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
00562 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &lt;= (const circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; lhs,
00563 <span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; rhs) {
00564 <span class="keywordflow">return</span> !(rhs &lt; lhs);
00565 }
00566
00568 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
00569 <span class="keyword">inline</span> <span class="keywordtype">bool</span> operator &gt;= (<span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; lhs,
00570 <span class="keyword">const</span> circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; rhs) {
00571 <span class="keywordflow">return</span> !(lhs &lt; rhs);
00572 }
00573
00575 <span class="keyword">template</span> &lt;<span class="keyword">class</span> T, <span class="keyword">class</span> Alloc&gt;
00576 <span class="keyword">inline</span> <span class="keywordtype">void</span> swap(circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; lhs,
00577 circular_buffer_space_optimized&lt;T, Alloc&gt;&amp; rhs) {
00578 lhs.swap(rhs);
00579 }
00580
00581 <span class="preprocessor">#endif // #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) || BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))</span>
00582 <span class="preprocessor"></span>
00583 } <span class="comment">// namespace boost</span>
00584
00585 <span class="preprocessor">#endif // #if !defined(BOOST_CIRCULAR_BUFFER_ADAPTOR_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>