21 #ifndef __TBB_concurrent_queue_H 22 #define __TBB_concurrent_queue_H 29 namespace strict_ppl {
35 template<
typename T,
typename A = cache_aligned_allocator<T> >
45 void *b = reinterpret_cast<void*>(
my_allocator.allocate( n ));
53 my_allocator.deallocate( reinterpret_cast<char*>(b), n );
57 new (location) T(*static_cast<const T*>(src));
60 #if __TBB_CPP11_RVALUE_REF_PRESENT 62 new (location) T(
std::move(*static_cast<T*>(const_cast<void*>(src))) );
91 template<
typename InputIterator>
106 #if __TBB_CPP11_RVALUE_REF_PRESENT 137 #if __TBB_CPP11_RVALUE_REF_PRESENT 142 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 143 template<
typename... Arguments>
145 push( T(std::forward<Arguments>( args )...) );
147 #endif //__TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 169 typedef internal::concurrent_queue_iterator<concurrent_queue,T>
iterator;
170 typedef internal::concurrent_queue_iterator<concurrent_queue,const T>
const_iterator;
181 #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT 183 template<
typename InputIterator,
184 typename T =
typename std::iterator_traits<InputIterator>::value_type,
190 template<
typename T,
class A>
193 this->internal_finish_clear();
196 template<
typename T,
class A>
199 while( !empty() ) try_pop(
value);
210 template<
typename T,
class A = cache_aligned_allocator<T> >
231 return (&static_cast<padded_page*>(static_cast<void*>(&
p))->
last)[index];
235 new( &
get_ref(dst,index) ) T(*static_cast<const T*>(src));
238 #if __TBB_CPP11_RVALUE_REF_PRESENT 240 new( &
get_ref(dst,index) ) T(
std::move(*static_cast<T*>(const_cast<void*>(src))) );
249 new( &
get_ref(dst,dindex) ) T(
get_ref( const_cast<page&>(src), sindex ) );
252 #if __TBB_CPP11_RVALUE_REF_PRESENT 315 #if __TBB_CPP11_RVALUE_REF_PRESENT 339 template<
typename InputIterator>
356 #if __TBB_CPP11_RVALUE_REF_PRESENT 357 void push( T&& source ) {
362 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 363 template<
typename... Arguments>
365 push( T(std::forward<Arguments>( args )...) );
372 void pop( T& destination ) {
376 #if TBB_USE_EXCEPTIONS 390 #if __TBB_CPP11_RVALUE_REF_PRESENT 397 #if __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT 398 template<
typename... Arguments>
400 return try_push( T(std::forward<Arguments>( args )...) );
439 typedef internal::concurrent_queue_iterator<concurrent_bounded_queue,T>
iterator;
440 typedef internal::concurrent_queue_iterator<concurrent_bounded_queue,const T>
const_iterator;
452 #if __TBB_CPP17_DEDUCTION_GUIDES_PRESENT 454 template<
typename InputIterator,
455 typename T =
typename std::iterator_traits<InputIterator>::value_type,
456 typename A = cache_aligned_allocator<T>
457 > concurrent_bounded_queue(InputIterator, InputIterator,
const A& = A())
458 -> concurrent_bounded_queue<T, A>;
461 template<
typename T,
class A>
464 internal_finish_clear();
467 template<
typename T,
class A>
470 while( try_pop(
value) ) ;
T value_type
Element type in the queue.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp end
void clear()
clear the queue. not thread-safe.
const_iterator unsafe_begin() const
void pop(T &destination)
Dequeue item from head of queue.
void emplace(Arguments &&... args)
~concurrent_queue()
Destroy queue.
bool __TBB_EXPORTED_METHOD internal_push_move_if_not_full(const void *src)
Attempt to enqueue item onto queue using move operation.
concurrent_bounded_queue(const concurrent_bounded_queue &src, const allocator_type &a=allocator_type())
Copy constructor.
concurrent_queue(const concurrent_queue &src, const allocator_type &a=allocator_type())
Copy constructor.
T & get_ref(page &p, size_t index)
Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
concurrent_bounded_queue(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())
[begin,end) constructor
T value_type
Element type in the queue.
size_t items_per_page
Always a power of 2.
const_iterator unsafe_end() const
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
page_allocator_type my_allocator
Allocator type.
std::ptrdiff_t size_type
Integral type for representing size of the queue.
allocator_type get_allocator() const
return allocator object
friend class internal::concurrent_queue_iterator
internal::concurrent_queue_iterator< concurrent_bounded_queue, T > iterator
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp begin
A high-performance thread-safe non-blocking concurrent queue.
virtual void copy_item(page &dst, size_t index, const void *src) __TBB_override
virtual void copy_page_item(page &dst, size_t dindex, const page &src, size_t sindex) __TBB_override
void __TBB_EXPORTED_METHOD internal_abort()
Abort all pending queue operations.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d
void emplace(Arguments &&... args)
ptrdiff_t my_capacity
Capacity of the queue.
internal::concurrent_queue_iterator< concurrent_bounded_queue, const T > const_iterator
size_t internal_size() const
Get size of queue; result may be invalid if queue is modified concurrently.
allocator_traits< Alloc >::template rebind_alloc< T >::other type
bool __TBB_EXPORTED_METHOD internal_push_if_not_full(const void *src)
Attempt to enqueue item onto queue using copy operation.
bool __TBB_EXPORTED_METHOD internal_empty() const
Check if the queue is emtpy.
const_iterator unsafe_end() const
Class used to ensure exception-safety of method "pop".
bool try_pop(T &destination)
Attempt to dequeue an item from head of queue.
const T & const_reference
Const reference type.
void internal_swap(concurrent_queue_base_v3 &src)
swap queues
size_type size() const
Return number of pushes minus number of pops.
void assign(const concurrent_queue_base_v3 &src, item_constructor_t construct_item)
copy or move internal representation
void const char const char int ITT_FORMAT __itt_group_sync p
void __TBB_EXPORTED_METHOD internal_push_move(const void *src)
Enqueue item at tail of queue using move operation.
virtual page * allocate_page() __TBB_override
custom allocator
void throw_exception(exception_id eid)
Versionless convenience wrapper for throw_exception_v4()
auto last(Container &c) -> decltype(begin(c))
const_iterator unsafe_begin() const
concurrent_queue(InputIterator begin, InputIterator end, const allocator_type &a=allocator_type())
[begin,end) constructor
virtual void deallocate_block(void *b, size_t n) __TBB_override
Deallocates block created by allocate_block.
void __TBB_EXPORTED_METHOD internal_set_capacity(ptrdiff_t capacity, size_t element_size)
Set the queue capacity.
bool empty() const
Equivalent to size()==0.
~concurrent_bounded_queue()
Destroy queue.
bool internal_empty() const
check if the queue is empty; thread safe
void clear()
Clear the queue. not thread-safe.
tbb::internal::allocator_rebind< A, char >::type page_allocator_type
concurrent_queue(concurrent_queue &&src, const allocator_type &a)
virtual void deallocate_page(page *p) __TBB_override
custom de-allocator
allocator_type get_allocator() const
Return allocator object.
concurrent_queue_base_v3::copy_specifics copy_specifics
virtual void * allocate_block(size_t n) __TBB_override
Allocates a block of size n (bytes)
T & reference
Reference type.
const T & const_reference
Const reference type.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
bool __TBB_EXPORTED_METHOD internal_pop_if_present(void *dst)
Attempt to dequeue item from queue.
void __TBB_EXPORTED_METHOD move_content(concurrent_queue_base_v8 &src)
move items
void set_capacity(size_type new_capacity)
Set the capacity.
size_type capacity() const
Maximum number of allowed elements.
concurrent_queue(const allocator_type &a=allocator_type())
Construct empty queue.
ptrdiff_t __TBB_EXPORTED_METHOD internal_size() const
Get size of queue.
concurrent_queue_base_v3::padded_page< T > padded_page
concurrent_bounded_queue(const allocator_type &a=allocator_type())
Construct empty queue.
virtual void assign_and_destroy_item(void *dst, page &src, size_t index) __TBB_override
void __TBB_EXPORTED_METHOD internal_push(const void *src)
Enqueue item at tail of queue using copy operation.
virtual void move_item(page &dst, size_t index, const void *src) __TBB_override
virtual void move_page_item(page &dst, size_t dindex, const page &src, size_t sindex) __TBB_override
void move(tbb_thread &t1, tbb_thread &t2)
bool internal_try_pop(void *dst)
Attempt to dequeue item from queue.
void __TBB_EXPORTED_METHOD internal_pop(void *dst)
Dequeue item from head of queue.
T & reference
Reference type.
internal::concurrent_queue_iterator< concurrent_queue, const T > const_iterator
std::ptrdiff_t difference_type
Difference type for iterator.
static void move_construct_item(T *location, const void *src)
size_t size_type
Integral type for representing size of the queue.
bool try_pop(T &result)
Attempt to dequeue an item from head of queue.
void push(const T &source)
Enqueue an item at tail of queue.
bool try_emplace(Arguments &&... args)
A allocator_type
Allocator type.
page_allocator_type my_allocator
void internal_push(const void *src, item_constructor_t construct_item)
Enqueue item at tail of queue.
A allocator_type
Allocator type.
size_type unsafe_size() const
Return the number of items in the queue; thread unsafe.
concurrent_bounded_queue(concurrent_bounded_queue &&src, const allocator_type &a)
ptrdiff_t difference_type
Difference type for iterator.
A high-performance thread-safe blocking concurrent bounded queue.
bool try_push(T &&source)
Move an item at tail of queue if queue is not already full.
friend class internal::concurrent_queue_iterator
tbb::internal::allocator_rebind< A, char >::type page_allocator_type
Allocator type.
bool empty() const
Equivalent to size()<=0.
void internal_swap(concurrent_queue_base_v3 &src)
swap internal representation
void push(const T &source)
Enqueue an item at tail of queue.
void __TBB_EXPORTED_METHOD assign(const concurrent_queue_base_v3 &src)
copy internal representation
internal::concurrent_queue_iterator< concurrent_queue, T > iterator
static void copy_construct_item(T *location, const void *src)
bool try_push(const T &source)
Enqueue an item at tail of queue if queue is not already full.