blob: 243821a092662f0ff21feb82a9c725ce3a7eba1c [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>concurrent_queue.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.7 -->
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="annotated.html"><span>Classes</span></a></li>
<li id="current"><a href="files.html"><span>Files</span></a></li>
<li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
</ul></div>
<div class="tabs">
<ul>
<li><a href="files.html"><span>File&nbsp;List</span></a></li>
<li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
</ul></div>
<h1>concurrent_queue.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2010 Intel Corporation. All Rights Reserved.</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> The source code contained or described herein and all documents related</span>
<a name="l00005"></a>00005 <span class="comment"> to the source code ("Material") are owned by Intel Corporation or its</span>
<a name="l00006"></a>00006 <span class="comment"> suppliers or licensors. Title to the Material remains with Intel</span>
<a name="l00007"></a>00007 <span class="comment"> Corporation or its suppliers and licensors. The Material is protected</span>
<a name="l00008"></a>00008 <span class="comment"> by worldwide copyright laws and treaty provisions. No part of the</span>
<a name="l00009"></a>00009 <span class="comment"> Material may be used, copied, reproduced, modified, published, uploaded,</span>
<a name="l00010"></a>00010 <span class="comment"> posted, transmitted, distributed, or disclosed in any way without</span>
<a name="l00011"></a>00011 <span class="comment"> Intel's prior express written permission.</span>
<a name="l00012"></a>00012 <span class="comment"></span>
<a name="l00013"></a>00013 <span class="comment"> No license under any patent, copyright, trade secret or other</span>
<a name="l00014"></a>00014 <span class="comment"> intellectual property right is granted to or conferred upon you by</span>
<a name="l00015"></a>00015 <span class="comment"> disclosure or delivery of the Materials, either expressly, by</span>
<a name="l00016"></a>00016 <span class="comment"> implication, inducement, estoppel or otherwise. Any license under such</span>
<a name="l00017"></a>00017 <span class="comment"> intellectual property rights must be express and approved by Intel in</span>
<a name="l00018"></a>00018 <span class="comment"> writing.</span>
<a name="l00019"></a>00019 <span class="comment">*/</span>
<a name="l00020"></a>00020
<a name="l00021"></a>00021 <span class="preprocessor">#ifndef __TBB_concurrent_queue_H</span>
<a name="l00022"></a>00022 <span class="preprocessor"></span><span class="preprocessor">#define __TBB_concurrent_queue_H</span>
<a name="l00023"></a>00023 <span class="preprocessor"></span>
<a name="l00024"></a>00024 <span class="preprocessor">#include "_concurrent_queue_internal.h"</span>
<a name="l00025"></a>00025
<a name="l00026"></a>00026 <span class="keyword">namespace </span>tbb {
<a name="l00027"></a>00027
<a name="l00028"></a>00028 <span class="keyword">namespace </span>strict_ppl {
<a name="l00029"></a>00029
<a name="l00031"></a>00031
<a name="l00034"></a>00034 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">typename</span> A = cache_aligned_allocator&lt;T&gt; &gt;
<a name="l00035"></a><a class="code" href="a00160.html">00035</a> <span class="keyword">class </span><a class="code" href="a00160.html">concurrent_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3&lt;T&gt; {
<a name="l00036"></a>00036 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value&gt; <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
<a name="l00037"></a>00037
<a name="l00039"></a>00039 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind&lt;char&gt;::other page_allocator_type;
<a name="l00040"></a>00040 page_allocator_type my_allocator;
<a name="l00041"></a>00041
<a name="l00043"></a>00043 <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *allocate_block( size_t n ) {
<a name="l00044"></a>00044 <span class="keywordtype">void</span> *b = reinterpret_cast&lt;void*&gt;(my_allocator.allocate( n ));
<a name="l00045"></a>00045 <span class="keywordflow">if</span>( !b )
<a name="l00046"></a>00046 internal::throw_exception(internal::eid_bad_alloc);
<a name="l00047"></a>00047 <span class="keywordflow">return</span> b;
<a name="l00048"></a>00048 }
<a name="l00049"></a>00049
<a name="l00051"></a>00051 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_block( <span class="keywordtype">void</span> *b, size_t n ) {
<a name="l00052"></a>00052 my_allocator.deallocate( reinterpret_cast&lt;char*&gt;(b), n );
<a name="l00053"></a>00053 }
<a name="l00054"></a>00054
<a name="l00055"></a>00055 <span class="keyword">public</span>:
<a name="l00057"></a><a class="code" href="a00160.html#682c3978d5cb0620000994f11c44a476">00057</a> <span class="keyword">typedef</span> T <a class="code" href="a00160.html#682c3978d5cb0620000994f11c44a476">value_type</a>;
<a name="l00058"></a>00058
<a name="l00060"></a><a class="code" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">00060</a> <span class="keyword">typedef</span> T&amp; <a class="code" href="a00160.html#a8d725c50a9834bb7af5b67c0aff92b8">reference</a>;
<a name="l00061"></a>00061
<a name="l00063"></a><a class="code" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">00063</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T&amp; <a class="code" href="a00160.html#4d48e7ff93f81636bca2c74f7da34750">const_reference</a>;
<a name="l00064"></a>00064
<a name="l00066"></a><a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">00066</a> <span class="keyword">typedef</span> size_t <a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a>;
<a name="l00067"></a>00067
<a name="l00069"></a><a class="code" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">00069</a> <span class="keyword">typedef</span> ptrdiff_t <a class="code" href="a00160.html#068576d16c7e4e05d52f9db7a45b5b65">difference_type</a>;
<a name="l00070"></a>00070
<a name="l00072"></a><a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">00072</a> <span class="keyword">typedef</span> A <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>;
<a name="l00073"></a>00073
<a name="l00075"></a><a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">00075</a> <span class="keyword">explicit</span> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>(<span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>&amp; a = <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
<a name="l00076"></a>00076 my_allocator( a )
<a name="l00077"></a>00077 {
<a name="l00078"></a>00078 }
<a name="l00079"></a>00079
<a name="l00081"></a>00081 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> InputIterator&gt;
<a name="l00082"></a><a class="code" href="a00160.html#25209656c84f2f9b030e2f9162713341">00082</a> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>&amp; a = <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
<a name="l00083"></a>00083 my_allocator( a )
<a name="l00084"></a>00084 {
<a name="l00085"></a>00085 <span class="keywordflow">for</span>( ; begin != end; ++begin )
<a name="l00086"></a>00086 internal_push(&amp;*begin);
<a name="l00087"></a>00087 }
<a name="l00088"></a>00088
<a name="l00090"></a><a class="code" href="a00160.html#8a6b98ea11a867db8ac868f0113ca429">00090</a> <a class="code" href="a00160.html#7c48a05a94a1f4f98fdfadfbef98ecf6">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00160.html">concurrent_queue</a>&amp; src, <span class="keyword">const</span> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>&amp; a = <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a>()) :
<a name="l00091"></a>00091 internal::concurrent_queue_base_v3&lt;T&gt;(), my_allocator( a )
<a name="l00092"></a>00092 {
<a name="l00093"></a>00093 assign( src );
<a name="l00094"></a>00094 }
<a name="l00095"></a>00095
<a name="l00097"></a>00097 <a class="code" href="a00160.html#830b33753d6b149c366344e29b2edd8c">~concurrent_queue</a>();
<a name="l00098"></a>00098
<a name="l00100"></a><a class="code" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">00100</a> <span class="keywordtype">void</span> <a class="code" href="a00160.html#73c47563ffcc4c2f6452f25a04ebe2e2">push</a>( <span class="keyword">const</span> T&amp; source ) {
<a name="l00101"></a>00101 internal_push( &amp;source );
<a name="l00102"></a>00102 }
<a name="l00103"></a>00103
<a name="l00105"></a>00105
<a name="l00107"></a><a class="code" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">00107</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.html#ae31ca0db34ef96ef1e74aa0d28c95f8">try_pop</a>( T&amp; result ) {
<a name="l00108"></a>00108 <span class="keywordflow">return</span> internal_try_pop( &amp;result );
<a name="l00109"></a>00109 }
<a name="l00110"></a>00110
<a name="l00112"></a><a class="code" href="a00160.html#eaa35a5274606779802e9a669a706260">00112</a> <a class="code" href="a00160.html#8fc30e93f8342a1960357f71e4fe8a2b">size_type</a> <a class="code" href="a00160.html#eaa35a5274606779802e9a669a706260">unsafe_size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this-&gt;internal_size();}
<a name="l00113"></a>00113
<a name="l00115"></a><a class="code" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">00115</a> <span class="keywordtype">bool</span> <a class="code" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this-&gt;internal_empty();}
<a name="l00116"></a>00116
<a name="l00118"></a>00118 <span class="keywordtype">void</span> <a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a>() ;
<a name="l00119"></a>00119
<a name="l00121"></a><a class="code" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">00121</a> <a class="code" href="a00160.html#5a3956341728eaa558d8827063718cac">allocator_type</a> <a class="code" href="a00160.html#f034f70caef445fe8abc9113ec926a8d">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this-&gt;my_allocator; }
<a name="l00122"></a>00122
<a name="l00123"></a>00123 <span class="keyword">typedef</span> internal::concurrent_queue_iterator&lt;concurrent_queue,T&gt; iterator;
<a name="l00124"></a>00124 <span class="keyword">typedef</span> internal::concurrent_queue_iterator&lt;concurrent_queue,const T&gt; const_iterator;
<a name="l00125"></a>00125
<a name="l00126"></a>00126 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00127"></a>00127 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
<a name="l00128"></a>00128 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00129"></a>00129 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
<a name="l00130"></a>00130 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
<a name="l00131"></a>00131 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
<a name="l00132"></a>00132 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
<a name="l00133"></a>00133 } ;
<a name="l00134"></a>00134
<a name="l00135"></a>00135 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">class</span> A&gt;
<a name="l00136"></a><a class="code" href="a00160.html#830b33753d6b149c366344e29b2edd8c">00136</a> <a class="code" href="a00160.html">concurrent_queue&lt;T,A&gt;::~concurrent_queue</a>() {
<a name="l00137"></a>00137 <a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">clear</a>();
<a name="l00138"></a>00138 this-&gt;internal_finish_clear();
<a name="l00139"></a>00139 }
<a name="l00140"></a>00140
<a name="l00141"></a>00141 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">class</span> A&gt;
<a name="l00142"></a><a class="code" href="a00160.html#c32e8e84c0524155133b4aae32d2a827">00142</a> <span class="keywordtype">void</span> <a class="code" href="a00160.html">concurrent_queue&lt;T,A&gt;::clear</a>() {
<a name="l00143"></a>00143 <span class="keywordflow">while</span>( !<a class="code" href="a00160.html#f3f6fce0cfa2d581d6f3b47e0613ad64">empty</a>() ) {
<a name="l00144"></a>00144 T value;
<a name="l00145"></a>00145 this-&gt;internal_try_pop(&amp;value);
<a name="l00146"></a>00146 }
<a name="l00147"></a>00147 }
<a name="l00148"></a>00148
<a name="l00149"></a>00149 } <span class="comment">// namespace strict_ppl</span>
<a name="l00150"></a>00150
<a name="l00152"></a>00152
<a name="l00157"></a>00157 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator&lt;T&gt; &gt;
<a name="l00158"></a><a class="code" href="a00155.html">00158</a> <span class="keyword">class </span><a class="code" href="a00155.html">concurrent_bounded_queue</a>: <span class="keyword">public</span> internal::concurrent_queue_base_v3 {
<a name="l00159"></a>00159 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value&gt; <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
<a name="l00160"></a>00160
<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> A::template rebind&lt;char&gt;::other page_allocator_type;
<a name="l00163"></a>00163 page_allocator_type my_allocator;
<a name="l00164"></a>00164
<a name="l00165"></a>00165 <span class="keyword">typedef</span> <span class="keyword">typename</span> concurrent_queue_base_v3::padded_page&lt;T&gt; padded_page;
<a name="l00166"></a>00166
<a name="l00168"></a>00168 <span class="keyword">class </span>destroyer: internal::no_copy {
<a name="l00169"></a>00169 T&amp; my_value;
<a name="l00170"></a>00170 <span class="keyword">public</span>:
<a name="l00171"></a>00171 destroyer( T&amp; value ) : my_value(value) {}
<a name="l00172"></a>00172 ~destroyer() {my_value.~T();}
<a name="l00173"></a>00173 };
<a name="l00174"></a>00174
<a name="l00175"></a>00175 T&amp; get_ref( page&amp; p, size_t index ) {
<a name="l00176"></a>00176 __TBB_ASSERT( index&lt;items_per_page, NULL );
<a name="l00177"></a>00177 <span class="keywordflow">return</span> (&amp;static_cast&lt;padded_page*&gt;(static_cast&lt;void*&gt;(&amp;p))-&gt;last)[index];
<a name="l00178"></a>00178 }
<a name="l00179"></a>00179
<a name="l00180"></a>00180 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_item( page&amp; dst, size_t index, <span class="keyword">const</span> <span class="keywordtype">void</span>* src ) {
<a name="l00181"></a>00181 <span class="keyword">new</span>( &amp;get_ref(dst,index) ) T(*static_cast&lt;const T*&gt;(src));
<a name="l00182"></a>00182 }
<a name="l00183"></a>00183
<a name="l00184"></a>00184 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> copy_page_item( page&amp; dst, size_t dindex, <span class="keyword">const</span> page&amp; src, size_t sindex ) {
<a name="l00185"></a>00185 <span class="keyword">new</span>( &amp;get_ref(dst,dindex) ) T( get_ref( const_cast&lt;page&amp;&gt;(src), sindex ) );
<a name="l00186"></a>00186 }
<a name="l00187"></a>00187
<a name="l00188"></a>00188 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> assign_and_destroy_item( <span class="keywordtype">void</span>* dst, page&amp; src, size_t index ) {
<a name="l00189"></a>00189 T&amp; from = get_ref(src,index);
<a name="l00190"></a>00190 destroyer d(from);
<a name="l00191"></a>00191 *static_cast&lt;T*&gt;(dst) = from;
<a name="l00192"></a>00192 }
<a name="l00193"></a>00193
<a name="l00194"></a>00194 <span class="comment">/*overide*/</span> <span class="keyword">virtual</span> page *allocate_page() {
<a name="l00195"></a>00195 size_t n = <span class="keyword">sizeof</span>(padded_page) + (items_per_page-1)*<span class="keyword">sizeof</span>(T);
<a name="l00196"></a>00196 page *p = reinterpret_cast&lt;page*&gt;(my_allocator.allocate( n ));
<a name="l00197"></a>00197 <span class="keywordflow">if</span>( !p )
<a name="l00198"></a>00198 internal::throw_exception(internal::eid_bad_alloc);
<a name="l00199"></a>00199 <span class="keywordflow">return</span> p;
<a name="l00200"></a>00200 }
<a name="l00201"></a>00201
<a name="l00202"></a>00202 <span class="comment">/*override*/</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> deallocate_page( page *p ) {
<a name="l00203"></a>00203 size_t n = <span class="keyword">sizeof</span>(padded_page) + items_per_page*<span class="keyword">sizeof</span>(T);
<a name="l00204"></a>00204 my_allocator.deallocate( reinterpret_cast&lt;char*&gt;(p), n );
<a name="l00205"></a>00205 }
<a name="l00206"></a>00206
<a name="l00207"></a>00207 <span class="keyword">public</span>:
<a name="l00209"></a><a class="code" href="a00155.html#98245517a931e5893f6601e66c51fc75">00209</a> <span class="keyword">typedef</span> T <a class="code" href="a00155.html#98245517a931e5893f6601e66c51fc75">value_type</a>;
<a name="l00210"></a>00210
<a name="l00212"></a><a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">00212</a> <span class="keyword">typedef</span> A <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>;
<a name="l00213"></a>00213
<a name="l00215"></a><a class="code" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">00215</a> <span class="keyword">typedef</span> T&amp; <a class="code" href="a00155.html#dcd44ca6a88c0dc7a847a47a10811f0c">reference</a>;
<a name="l00216"></a>00216
<a name="l00218"></a><a class="code" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">00218</a> <span class="keyword">typedef</span> <span class="keyword">const</span> T&amp; <a class="code" href="a00155.html#796713d0b9ba93a4721cbe13e4474068">const_reference</a>;
<a name="l00219"></a>00219
<a name="l00221"></a>00221
<a name="l00223"></a><a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">00223</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a>;
<a name="l00224"></a>00224
<a name="l00226"></a><a class="code" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">00226</a> <span class="keyword">typedef</span> std::ptrdiff_t <a class="code" href="a00155.html#4b45c91297e69515d83d5eef85ae1f49">difference_type</a>;
<a name="l00227"></a>00227
<a name="l00229"></a><a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">00229</a> <span class="keyword">explicit</span> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>(<span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>&amp; a = <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
<a name="l00230"></a>00230 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
<a name="l00231"></a>00231 {
<a name="l00232"></a>00232 }
<a name="l00233"></a>00233
<a name="l00235"></a><a class="code" href="a00155.html#7b7fb414d2eaa8a7f5d68fc4cd63ac50">00235</a> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( <span class="keyword">const</span> <a class="code" href="a00155.html">concurrent_bounded_queue</a>&amp; src, <span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>&amp; a = <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
<a name="l00236"></a>00236 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
<a name="l00237"></a>00237 {
<a name="l00238"></a>00238 assign( src );
<a name="l00239"></a>00239 }
<a name="l00240"></a>00240
<a name="l00242"></a>00242 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> InputIterator&gt;
<a name="l00243"></a><a class="code" href="a00155.html#a5e04dcd7db9fd9b583b4e7df832246a">00243</a> <a class="code" href="a00155.html#e3525226732963ff0f13e89d8e6dab5b">concurrent_bounded_queue</a>( InputIterator begin, InputIterator end, <span class="keyword">const</span> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>&amp; a = <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a>()) :
<a name="l00244"></a>00244 concurrent_queue_base_v3( sizeof(T) ), my_allocator( a )
<a name="l00245"></a>00245 {
<a name="l00246"></a>00246 <span class="keywordflow">for</span>( ; begin != end; ++begin )
<a name="l00247"></a>00247 internal_push_if_not_full(&amp;*begin);
<a name="l00248"></a>00248 }
<a name="l00249"></a>00249
<a name="l00251"></a>00251 <a class="code" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">~concurrent_bounded_queue</a>();
<a name="l00252"></a>00252
<a name="l00254"></a><a class="code" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">00254</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html#ceb08c743b11ba88c878e73fff8af20b">push</a>( <span class="keyword">const</span> T&amp; source ) {
<a name="l00255"></a>00255 internal_push( &amp;source );
<a name="l00256"></a>00256 }
<a name="l00257"></a>00257
<a name="l00259"></a>00259
<a name="l00260"></a><a class="code" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">00260</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html#41f4c6bd7a82ab070e840bbf81b0b123">pop</a>( T&amp; destination ) {
<a name="l00261"></a>00261 internal_pop( &amp;destination );
<a name="l00262"></a>00262 }
<a name="l00263"></a>00263
<a name="l00265"></a>00265
<a name="l00267"></a><a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">00267</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( <span class="keyword">const</span> T&amp; source ) {
<a name="l00268"></a>00268 <span class="keywordflow">return</span> internal_push_if_not_full( &amp;source );
<a name="l00269"></a>00269 }
<a name="l00270"></a>00270
<a name="l00272"></a>00272
<a name="l00274"></a><a class="code" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">00274</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( T&amp; destination ) {
<a name="l00275"></a>00275 <span class="keywordflow">return</span> internal_pop_if_present( &amp;destination );
<a name="l00276"></a>00276 }
<a name="l00277"></a>00277
<a name="l00279"></a>00279
<a name="l00282"></a><a class="code" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">00282</a> <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00155.html#7dc14d1a579a4cccda9f857585e1768d">size</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_size();}
<a name="l00283"></a>00283
<a name="l00285"></a><a class="code" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">00285</a> <span class="keywordtype">bool</span> <a class="code" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>()<span class="keyword"> const </span>{<span class="keywordflow">return</span> internal_empty();}
<a name="l00286"></a>00286
<a name="l00288"></a><a class="code" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">00288</a> <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> <a class="code" href="a00155.html#b2888b3e4e837d7e03f2c731963a402b">capacity</a>()<span class="keyword"> const </span>{
<a name="l00289"></a>00289 <span class="keywordflow">return</span> my_capacity;
<a name="l00290"></a>00290 }
<a name="l00291"></a>00291
<a name="l00293"></a>00293
<a name="l00295"></a><a class="code" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">00295</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html#f3c6c934f85fd02aedbc83a16943193b">set_capacity</a>( <a class="code" href="a00155.html#a80e4c11dbb324e4b92a24a77bbcde68">size_type</a> new_capacity ) {
<a name="l00296"></a>00296 internal_set_capacity( new_capacity, <span class="keyword">sizeof</span>(T) );
<a name="l00297"></a>00297 }
<a name="l00298"></a>00298
<a name="l00300"></a><a class="code" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">00300</a> <a class="code" href="a00155.html#2e2726fccf6d975dc1071608cc0bbf90">allocator_type</a> <a class="code" href="a00155.html#415eb87e53b1c6a266de06ecbc490d16">get_allocator</a>()<span class="keyword"> const </span>{ <span class="keywordflow">return</span> this-&gt;my_allocator; }
<a name="l00301"></a>00301
<a name="l00303"></a>00303 <span class="keywordtype">void</span> <a class="code" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>() ;
<a name="l00304"></a>00304
<a name="l00305"></a>00305 <span class="keyword">typedef</span> internal::concurrent_queue_iterator&lt;concurrent_bounded_queue,T&gt; iterator;
<a name="l00306"></a>00306 <span class="keyword">typedef</span> internal::concurrent_queue_iterator&lt;concurrent_bounded_queue,const T&gt; const_iterator;
<a name="l00307"></a>00307
<a name="l00308"></a>00308 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00309"></a>00309 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
<a name="l00310"></a>00310 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00311"></a>00311 iterator unsafe_begin() {<span class="keywordflow">return</span> iterator(*<span class="keyword">this</span>);}
<a name="l00312"></a>00312 iterator unsafe_end() {<span class="keywordflow">return</span> iterator();}
<a name="l00313"></a>00313 const_iterator unsafe_begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator(*<span class="keyword">this</span>);}
<a name="l00314"></a>00314 const_iterator unsafe_end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> const_iterator();}
<a name="l00315"></a>00315
<a name="l00316"></a>00316 };
<a name="l00317"></a>00317
<a name="l00318"></a>00318 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">class</span> A&gt;
<a name="l00319"></a><a class="code" href="a00155.html#acaf5b510dc0dfc7780b8c956cf773cf">00319</a> <a class="code" href="a00155.html">concurrent_bounded_queue&lt;T,A&gt;::~concurrent_bounded_queue</a>() {
<a name="l00320"></a>00320 <a class="code" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">clear</a>();
<a name="l00321"></a>00321 internal_finish_clear();
<a name="l00322"></a>00322 }
<a name="l00323"></a>00323
<a name="l00324"></a>00324 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">class</span> A&gt;
<a name="l00325"></a><a class="code" href="a00155.html#90b31e2954c6e4596c7900435a5f4bc1">00325</a> <span class="keywordtype">void</span> <a class="code" href="a00155.html">concurrent_bounded_queue&lt;T,A&gt;::clear</a>() {
<a name="l00326"></a>00326 <span class="keywordflow">while</span>( !<a class="code" href="a00155.html#f64924f2ee9225c368a270fc3c394db9">empty</a>() ) {
<a name="l00327"></a>00327 T value;
<a name="l00328"></a>00328 internal_pop_if_present(&amp;value);
<a name="l00329"></a>00329 }
<a name="l00330"></a>00330 }
<a name="l00331"></a>00331
<a name="l00332"></a>00332 <span class="keyword">namespace </span>deprecated {
<a name="l00333"></a>00333
<a name="l00335"></a>00335
<a name="l00340"></a>00340 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T, <span class="keyword">class</span> A = cache_aligned_allocator&lt;T&gt; &gt;
<a name="l00341"></a><a class="code" href="a00161.html">00341</a> <span class="keyword">class </span><a class="code" href="a00161.html">concurrent_queue</a>: <span class="keyword">public</span> <a class="code" href="a00155.html">concurrent_bounded_queue</a>&lt;T,A&gt; {
<a name="l00342"></a>00342 <span class="preprocessor">#if !__TBB_TEMPLATE_FRIENDS_BROKEN</span>
<a name="l00343"></a>00343 <span class="preprocessor"></span> <span class="keyword">template</span>&lt;<span class="keyword">typename</span> Container, <span class="keyword">typename</span> Value&gt; <span class="keyword">friend</span> <span class="keyword">class </span>internal::concurrent_queue_iterator;
<a name="l00344"></a>00344 <span class="preprocessor">#endif </span>
<a name="l00345"></a>00345 <span class="preprocessor"></span>
<a name="l00346"></a>00346 <span class="keyword">public</span>:
<a name="l00348"></a><a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">00348</a> <span class="keyword">explicit</span> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>(<span class="keyword">const</span> A&amp; a = A()) :
<a name="l00349"></a>00349 <a class="code" href="a00155.html">concurrent_bounded_queue</a>&lt;T,A&gt;( a )
<a name="l00350"></a>00350 {
<a name="l00351"></a>00351 }
<a name="l00352"></a>00352
<a name="l00354"></a><a class="code" href="a00161.html#fc092b9082f233482f3513fc3bb670f7">00354</a> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( <span class="keyword">const</span> <a class="code" href="a00161.html">concurrent_queue</a>&amp; src, <span class="keyword">const</span> A&amp; a = A()) :
<a name="l00355"></a>00355 <a class="code" href="a00155.html">concurrent_bounded_queue</a>&lt;T,A&gt;( src, a )
<a name="l00356"></a>00356 {
<a name="l00357"></a>00357 }
<a name="l00358"></a>00358
<a name="l00360"></a>00360 <span class="keyword">template</span>&lt;<span class="keyword">typename</span> InputIterator&gt;
<a name="l00361"></a><a class="code" href="a00161.html#9102b897776bd2d9e908e6604ff16b5f">00361</a> <a class="code" href="a00161.html#aaf19bd7337b72f3131ece60f7315ef7">concurrent_queue</a>( InputIterator b <span class="comment">/*begin*/</span>, InputIterator e <span class="comment">/*end*/</span>, <span class="keyword">const</span> A&amp; a = A()) :
<a name="l00362"></a>00362 <a class="code" href="a00155.html">concurrent_bounded_queue</a>&lt;T,A&gt;( b, e, a )
<a name="l00363"></a>00363 {
<a name="l00364"></a>00364 }
<a name="l00365"></a>00365
<a name="l00367"></a>00367
<a name="l00369"></a><a class="code" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">00369</a> <span class="keywordtype">bool</span> <a class="code" href="a00161.html#7c45561bafe71107d09b2bc1b8f4e681">push_if_not_full</a>( <span class="keyword">const</span> T&amp; source ) {
<a name="l00370"></a>00370 <span class="keywordflow">return</span> <a class="code" href="a00155.html#2bd6232531279fb3ccbd296bea23066b">try_push</a>( source );
<a name="l00371"></a>00371 }
<a name="l00372"></a>00372
<a name="l00374"></a>00374
<a name="l00378"></a><a class="code" href="a00161.html#48da3536245318af6cb5fd58bac78039">00378</a> <span class="keywordtype">bool</span> <a class="code" href="a00161.html#48da3536245318af6cb5fd58bac78039">pop_if_present</a>( T&amp; destination ) {
<a name="l00379"></a>00379 <span class="keywordflow">return</span> <a class="code" href="a00155.html#0ca487019bbb00a196442aff78a1e4f7">try_pop</a>( destination );
<a name="l00380"></a>00380 }
<a name="l00381"></a>00381
<a name="l00382"></a>00382 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00155.html">concurrent_bounded_queue&lt;T,A&gt;::iterator</a> iterator;
<a name="l00383"></a>00383 <span class="keyword">typedef</span> <span class="keyword">typename</span> <a class="code" href="a00155.html">concurrent_bounded_queue&lt;T,A&gt;::const_iterator</a> const_iterator;
<a name="l00384"></a>00384 <span class="comment">//</span>
<a name="l00385"></a>00385 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00386"></a>00386 <span class="comment">// The iterators are intended only for debugging. They are slow and not thread safe.</span>
<a name="l00387"></a>00387 <span class="comment">//------------------------------------------------------------------------</span>
<a name="l00388"></a>00388 iterator begin() {<span class="keywordflow">return</span> this-&gt;unsafe_begin();}
<a name="l00389"></a>00389 iterator end() {<span class="keywordflow">return</span> this-&gt;unsafe_end();}
<a name="l00390"></a>00390 const_iterator begin()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this-&gt;unsafe_begin();}
<a name="l00391"></a>00391 const_iterator end()<span class="keyword"> const </span>{<span class="keywordflow">return</span> this-&gt;unsafe_end();}
<a name="l00392"></a>00392 };
<a name="l00393"></a>00393
<a name="l00394"></a>00394 }
<a name="l00395"></a>00395
<a name="l00396"></a>00396
<a name="l00397"></a>00397 <span class="preprocessor">#if TBB_DEPRECATED</span>
<a name="l00398"></a>00398 <span class="preprocessor"></span><span class="keyword">using</span> deprecated::concurrent_queue;
<a name="l00399"></a>00399 <span class="preprocessor">#else</span>
<a name="l00400"></a>00400 <span class="preprocessor"></span><span class="keyword">using</span> strict_ppl::concurrent_queue;
<a name="l00401"></a>00401 <span class="preprocessor">#endif</span>
<a name="l00402"></a>00402 <span class="preprocessor"></span>
<a name="l00403"></a>00403 } <span class="comment">// namespace tbb</span>
<a name="l00404"></a>00404
<a name="l00405"></a>00405 <span class="preprocessor">#endif </span><span class="comment">/* __TBB_concurrent_queue_H */</span>
</pre></div><hr>
<p></p>
Copyright &copy; 2005-2010 Intel Corporation. All Rights Reserved.
<p></p>
Intel, Pentium, Intel Xeon, Itanium, Intel XScale and VTune are
registered trademarks or trademarks of Intel Corporation or its
subsidiaries in the United States and other countries.
<p></p>
* Other names and brands may be claimed as the property of others.