17 #ifndef __TBB_enumerable_thread_specific_H 18 #define __TBB_enumerable_thread_specific_H 20 #define __TBB_enumerable_thread_specific_H_include_area 34 #if __TBB_PREVIEW_RESUMABLE_TASKS 44 #define __TBB_ETS_USE_CPP11 \ 45 (__TBB_CPP11_RVALUE_REF_PRESENT && __TBB_CPP11_VARIADIC_TEMPLATES_PRESENT \ 46 && __TBB_CPP11_DECLTYPE_PRESENT && __TBB_CPP11_LAMBDAS_PRESENT) 54 #if __TBB_PREVIEW_RESUMABLE_TASKS 59 namespace interface6 {
62 template <
typename T,
typename Allocator, ets_key_usage_type ETS_key_type>
70 template <ets_key_usage_type ETS_key_type>
71 struct ets_key_selector {
73 static key_type current_key() {
78 #if __TBB_PREVIEW_RESUMABLE_TASKS 80 struct ets_key_selector<ets_suspend_aware> {
81 typedef task::suspend_point key_type;
82 static key_type current_key() {
83 return internal_current_suspend_point();
87 inline task::suspend_point atomic_compare_and_swap(task::suspend_point& location,
88 const task::suspend_point&
value,
const task::suspend_point& comparand) {
93 template<ets_key_usage_type ETS_key_type>
96 typedef typename ets_key_selector<ETS_key_type>::key_type key_type;
97 #if __TBB_PROTECTED_NESTED_CLASS_BROKEN 105 slot& at(
size_t k ) {
106 return ((slot*)(
void*)(
this+1))[k];
108 size_t size()
const {
return size_t(1)<<lg_size;}
109 size_t mask()
const {
return size()-1;}
110 size_t start(
size_t h )
const {
111 return h>>(8*
sizeof(size_t)-lg_size);
117 bool empty()
const {
return key == key_type();}
118 bool match( key_type k )
const {
return key == k;}
119 bool claim( key_type k ) {
121 return atomic_compare_and_swap(
key, k, key_type()) == key_type();
124 #if __TBB_PROTECTED_NESTED_CLASS_BROKEN 131 atomic<array*> my_root;
132 atomic<size_t> my_count;
133 virtual void* create_local() = 0;
134 virtual void* create_array(
size_t _size) = 0;
135 virtual void free_array(
void* ptr,
size_t _size) = 0;
136 array* allocate(
size_t lg_size ) {
137 size_t n = size_t(1)<<lg_size;
138 array* a = static_cast<array*>(create_array(
sizeof(array)+n*
sizeof(slot) ));
139 a->lg_size = lg_size;
140 std::memset( a+1, 0, n*
sizeof(slot) );
143 void free(array* a) {
144 size_t n = size_t(1)<<(a->lg_size);
145 free_array( (
void *)a,
size_t(
sizeof(array)+n*
sizeof(slot)) );
148 ets_base() {my_root=NULL; my_count=0;}
150 void* table_lookup(
bool& exists );
154 template <ets_key_usage_type E2>
155 void table_elementwise_copy(
const ets_base& other,
156 void*(*add_element)(ets_base<E2>&,
void*) ) {
159 if( !other.my_root )
return;
160 array* root = my_root = allocate(other.my_root->lg_size);
162 my_count = other.my_count;
163 size_t mask = root->mask();
164 for( array* r=other.my_root; r; r=r->next ) {
165 for(
size_t i=0; i<r->size(); ++i ) {
168 for(
size_t j = root->start(tbb::tbb_hash<key_type>()(s1.key)); ; j=(j+1)&
mask ) {
169 slot& s2 = root->at(j);
171 s2.ptr = add_element(
static_cast<ets_base<E2>&
>(*
this), s1.ptr);
175 else if( s2.match(s1.key) )
182 void table_swap( ets_base& other ) {
183 __TBB_ASSERT(
this!=&other,
"Don't swap an instance with itself");
184 tbb::internal::swap<relaxed>(my_root, other.my_root);
185 tbb::internal::swap<relaxed>(my_count, other.my_count);
189 template<ets_key_usage_type ETS_key_type>
190 ets_base<ETS_key_type>::~ets_base() {
194 template<ets_key_usage_type ETS_key_type>
195 void ets_base<ETS_key_type>::table_clear() {
196 while( array* r = my_root ) {
203 template<ets_key_usage_type ETS_key_type>
204 void* ets_base<ETS_key_type>::table_lookup(
bool& exists ) {
205 const key_type k = ets_key_selector<ETS_key_type>::current_key();
209 size_t h = tbb::tbb_hash<key_type>()(k);
210 for( array* r=my_root; r; r=r->next ) {
212 size_t mask=r->mask();
213 for(
size_t i = r->start(
h); ;i=(i+1)&
mask) {
215 if(
s.empty() )
break;
234 found = create_local();
236 size_t c = ++my_count;
239 if( !r || c>r->size()/2 ) {
240 size_t s = r ? r->lg_size : 2;
241 while( c>
size_t(1)<<(
s-1) ) ++
s;
242 array* a = allocate(
s);
246 array* new_r = my_root.compare_and_swap(a,r);
247 if( new_r==r )
break;
249 if( new_r->lg_size>=
s ) {
264 size_t mask = ir->mask();
265 for(
size_t i = ir->start(
h);;i=(i+1)&
mask) {
279 typedef ets_base<ets_no_key> super;
281 #if __TBB_WIN8UI_SUPPORT 282 typedef DWORD tls_key_t;
283 void create_key() { my_key = FlsAlloc(NULL); }
284 void destroy_key() { FlsFree(my_key); }
285 void set_tls(
void *
value) { FlsSetValue(my_key, (LPVOID)
value); }
286 void* get_tls() {
return (
void *)FlsGetValue(my_key); }
288 typedef DWORD tls_key_t;
289 void create_key() { my_key = TlsAlloc(); }
290 void destroy_key() { TlsFree(my_key); }
291 void set_tls(
void *
value) { TlsSetValue(my_key, (LPVOID)
value); }
292 void* get_tls() {
return (
void *)TlsGetValue(my_key); }
295 typedef pthread_key_t tls_key_t;
296 void create_key() { pthread_key_create(&my_key, NULL); }
297 void destroy_key() { pthread_key_delete(my_key); }
298 void set_tls(
void *
value )
const { pthread_setspecific(my_key,
value); }
299 void* get_tls()
const {
return pthread_getspecific(my_key); }
304 virtual
void free_array(
void* ptr,
size_t _size)
__TBB_override = 0;
306 ets_base() {create_key();}
307 ~ets_base() {destroy_key();}
308 void* table_lookup(
bool& exists ) {
309 void* found = get_tls();
313 found = super::table_lookup(exists);
321 super::table_clear();
323 void table_swap( ets_base& other ) {
325 __TBB_ASSERT(
this!=&other,
"Don't swap an instance with itself");
326 swap(my_key, other.my_key);
327 super::table_swap(other);
332 template<
typename Container,
typename Value >
333 class enumerable_thread_specific_iterator
334 #if defined(_WIN64) && defined(_MSC_VER)
336 : public std::iterator<std::random_access_iterator_tag,Value>
341 Container *my_container;
342 typename Container::size_type my_index;
343 mutable Value *my_value;
345 template<
typename C,
typename T>
346 friend enumerable_thread_specific_iterator<C,T>
347 operator+( ptrdiff_t offset,
const enumerable_thread_specific_iterator<C,T>& v );
349 template<
typename C,
typename T,
typename U>
350 friend bool operator==(
const enumerable_thread_specific_iterator<C,T>& i,
351 const enumerable_thread_specific_iterator<C,U>& j );
353 template<
typename C,
typename T,
typename U>
354 friend bool operator<(
const enumerable_thread_specific_iterator<C,T>& i,
355 const enumerable_thread_specific_iterator<C,U>& j );
357 template<
typename C,
typename T,
typename U>
358 friend ptrdiff_t
operator-(
const enumerable_thread_specific_iterator<C,T>& i,
359 const enumerable_thread_specific_iterator<C,U>& j );
361 template<
typename C,
typename U>
362 friend class enumerable_thread_specific_iterator;
366 enumerable_thread_specific_iterator(
const Container &container,
typename Container::size_type index ) :
367 my_container(&const_cast<Container &>(container)), my_index(index), my_value(NULL) {}
370 enumerable_thread_specific_iterator() : my_container(NULL), my_index(0), my_value(NULL) {}
373 enumerable_thread_specific_iterator(
const enumerable_thread_specific_iterator<Container, U>& other ) :
374 my_container( other.my_container ), my_index( other.my_index), my_value( const_cast<Value *>(other.my_value) ) {}
376 enumerable_thread_specific_iterator
operator+( ptrdiff_t offset )
const {
377 return enumerable_thread_specific_iterator(*my_container, my_index + offset);
380 enumerable_thread_specific_iterator &operator+=( ptrdiff_t offset ) {
386 enumerable_thread_specific_iterator
operator-( ptrdiff_t offset )
const {
387 return enumerable_thread_specific_iterator( *my_container, my_index-offset );
390 enumerable_thread_specific_iterator &operator-=( ptrdiff_t offset ) {
396 Value& operator*()
const {
397 Value*
value = my_value;
399 value = my_value = (*my_container)[my_index].value();
405 Value& operator[]( ptrdiff_t k )
const {
406 return (*my_container)[my_index + k].value;
409 Value* operator->()
const {
return &operator*();}
411 enumerable_thread_specific_iterator& operator++() {
417 enumerable_thread_specific_iterator& operator--() {
424 enumerable_thread_specific_iterator operator++(
int) {
425 enumerable_thread_specific_iterator result = *
this;
432 enumerable_thread_specific_iterator operator--(
int) {
433 enumerable_thread_specific_iterator result = *
this;
440 typedef ptrdiff_t difference_type;
441 typedef Value value_type;
442 typedef Value* pointer;
443 typedef Value& reference;
444 typedef std::random_access_iterator_tag iterator_category;
447 template<
typename Container,
typename T>
448 enumerable_thread_specific_iterator<Container,T>
449 operator+( ptrdiff_t offset,
const enumerable_thread_specific_iterator<Container,T>& v ) {
450 return enumerable_thread_specific_iterator<Container,T>( v.my_container, v.my_index + offset );
453 template<
typename Container,
typename T,
typename U>
454 bool operator==(
const enumerable_thread_specific_iterator<Container,T>& i,
455 const enumerable_thread_specific_iterator<Container,U>& j ) {
456 return i.my_index==j.my_index && i.my_container == j.my_container;
459 template<
typename Container,
typename T,
typename U>
460 bool operator!=(
const enumerable_thread_specific_iterator<Container,T>& i,
461 const enumerable_thread_specific_iterator<Container,U>& j ) {
465 template<
typename Container,
typename T,
typename U>
466 bool operator<(
const enumerable_thread_specific_iterator<Container,T>& i,
467 const enumerable_thread_specific_iterator<Container,U>& j ) {
468 return i.my_index<j.my_index;
471 template<
typename Container,
typename T,
typename U>
472 bool operator>(
const enumerable_thread_specific_iterator<Container,T>& i,
473 const enumerable_thread_specific_iterator<Container,U>& j ) {
477 template<
typename Container,
typename T,
typename U>
478 bool operator>=(
const enumerable_thread_specific_iterator<Container,T>& i,
479 const enumerable_thread_specific_iterator<Container,U>& j ) {
483 template<
typename Container,
typename T,
typename U>
484 bool operator<=(
const enumerable_thread_specific_iterator<Container,T>& i,
485 const enumerable_thread_specific_iterator<Container,U>& j ) {
489 template<
typename Container,
typename T,
typename U>
490 ptrdiff_t
operator-(
const enumerable_thread_specific_iterator<Container,T>& i,
491 const enumerable_thread_specific_iterator<Container,U>& j ) {
492 return i.my_index-j.my_index;
495 template<
typename SegmentedContainer,
typename Value >
496 class segmented_iterator
497 #if defined(_WIN64) && defined(_MSC_VER)
498 : public std::iterator<std::input_iterator_tag, Value>
501 template<
typename C,
typename T,
typename U>
502 friend bool operator==(
const segmented_iterator<C,T>& i,
const segmented_iterator<C,U>& j);
504 template<
typename C,
typename T,
typename U>
505 friend bool operator!=(
const segmented_iterator<C,T>& i,
const segmented_iterator<C,U>& j);
507 template<
typename C,
typename U>
508 friend class segmented_iterator;
512 segmented_iterator() {my_segcont = NULL;}
514 segmented_iterator(
const SegmentedContainer& _segmented_container ) :
515 my_segcont(const_cast<SegmentedContainer*>(&_segmented_container)),
516 outer_iter(my_segcont->
end()) { }
518 ~segmented_iterator() {}
520 typedef typename SegmentedContainer::iterator outer_iterator;
521 typedef typename SegmentedContainer::value_type InnerContainer;
522 typedef typename InnerContainer::iterator inner_iterator;
525 typedef ptrdiff_t difference_type;
526 typedef Value value_type;
527 typedef typename SegmentedContainer::size_type size_type;
528 typedef Value* pointer;
529 typedef Value& reference;
530 typedef std::input_iterator_tag iterator_category;
534 segmented_iterator(
const segmented_iterator<SegmentedContainer, U>& other) :
535 my_segcont(other.my_segcont),
536 outer_iter(other.outer_iter),
538 inner_iter(other.inner_iter)
543 segmented_iterator& operator=(
const segmented_iterator<SegmentedContainer, U>& other) {
545 my_segcont = other.my_segcont;
546 outer_iter = other.outer_iter;
547 if(outer_iter != my_segcont->end()) inner_iter = other.inner_iter;
555 segmented_iterator& operator=(
const outer_iterator& new_outer_iter) {
558 for(outer_iter = new_outer_iter ;outer_iter!=my_segcont->end(); ++outer_iter) {
559 if( !outer_iter->empty() ) {
560 inner_iter = outer_iter->begin();
568 segmented_iterator& operator++() {
574 segmented_iterator operator++(
int) {
575 segmented_iterator tmp = *
this;
580 bool operator==(
const outer_iterator& other_outer)
const {
582 return (outer_iter == other_outer &&
583 (outer_iter == my_segcont->end() || inner_iter == outer_iter->begin()));
586 bool operator!=(
const outer_iterator& other_outer)
const {
592 reference operator*()
const {
594 __TBB_ASSERT(outer_iter != my_segcont->end(),
"Dereferencing a pointer at end of container");
600 pointer operator->()
const {
return &operator*();}
603 SegmentedContainer* my_segcont;
604 outer_iterator outer_iter;
605 inner_iterator inner_iter;
612 while(inner_iter == outer_iter->end() && ++outer_iter != my_segcont->end()) {
613 inner_iter = outer_iter->begin();
618 template<
typename SegmentedContainer,
typename T,
typename U>
619 bool operator==(
const segmented_iterator<SegmentedContainer,T>& i,
620 const segmented_iterator<SegmentedContainer,U>& j ) {
621 if(i.my_segcont != j.my_segcont)
return false;
622 if(i.my_segcont == NULL)
return true;
623 if(i.outer_iter != j.outer_iter)
return false;
624 if(i.outer_iter == i.my_segcont->end())
return true;
625 return i.inner_iter == j.inner_iter;
629 template<
typename SegmentedContainer,
typename T,
typename U>
630 bool operator!=(
const segmented_iterator<SegmentedContainer,T>& i,
631 const segmented_iterator<SegmentedContainer,U>& j ) {
637 void construct(
void*where) {
new(where) T();}
638 construct_by_default(
int ) {}
644 void construct(
void*where) {
new(where) T(exemplar);}
645 construct_by_exemplar(
const T& t ) : exemplar(t) {}
646 #if __TBB_ETS_USE_CPP11 647 construct_by_exemplar( T&& t ) : exemplar(std::
move(t)) {}
651 template<
typename T,
typename Finit>
654 void construct(
void* where) {
new(where) T(f());}
655 construct_by_finit(
const Finit& f_ ) : f(f_) {}
656 #if __TBB_ETS_USE_CPP11 657 construct_by_finit( Finit&& f_ ) : f(std::
move(f_)) {}
661 #if __TBB_ETS_USE_CPP11 662 template<
typename T,
typename... P>
664 internal::stored_pack<P...> pack;
665 void construct(
void* where) {
667 new(where) T(args...);
670 construct_by_args( P&& ... args ) : pack(std::forward<P>(args)...) {}
677 class callback_base {
680 virtual callback_base* clone()
const = 0;
682 virtual void destroy() = 0;
684 virtual ~callback_base() { }
686 virtual void construct(
void* where) = 0;
689 template <
typename T,
typename Constructor>
690 class callback_leaf:
public callback_base<T>, Constructor {
691 #if __TBB_ETS_USE_CPP11 692 template<
typename... P> callback_leaf( P&& ... params ) : Constructor(std::forward<P>(params)...) {}
694 template<
typename X> callback_leaf(
const X& x ) : Constructor(x) {}
704 my_allocator_type().destroy(
this);
705 my_allocator_type().deallocate(
this,1);
709 Constructor::construct(where);
712 #if __TBB_ETS_USE_CPP11 713 template<
typename... P>
714 static callback_base<T>* make( P&& ... params ) {
715 void* where = my_allocator_type().allocate(1);
716 return new(where) callback_leaf( std::forward<P>(params)... );
720 static callback_base<T>* make(
const X& x ) {
721 void* where = my_allocator_type().allocate(1);
722 return new(where) callback_leaf(x);
738 tbb::aligned_space<U> my_space;
740 ets_element() { is_built =
false; }
741 U*
value() {
return my_space.begin(); }
742 U* value_committed() { is_built =
true;
return my_space.begin(); }
745 my_space.begin()->~U();
754 template<
typename T,
typename ETS>
struct is_compatible_ets {
static const bool value =
false; };
755 template<
typename T,
typename U,
typename A, ets_key_usage_type C>
758 #if __TBB_ETS_USE_CPP11 760 template <
typename T>
761 class is_callable_no_args {
766 template<
typename U>
static yes& decide( decltype(declval<U>()())* );
767 template<
typename U>
static no& decide(...);
769 static const bool value = (
sizeof(decide<T>(NULL)) ==
sizeof(yes));
796 template <
typename T,
797 typename Allocator=cache_aligned_allocator<T>,
799 class enumerable_thread_specific: internal::ets_base<ETS_key_type> {
831 my_construct_callback->construct(lref.value());
832 return lref.value_committed();
838 new(lref.value()) T(*static_cast<T*>(
p));
839 return lref.value_committed();
842 #if __TBB_ETS_USE_CPP11 846 new(lref.value()) T(
std::move(*static_cast<T*>(
p)));
847 return lref.value_committed();
855 size_t nelements = (_size +
sizeof(uintptr_t) -1) /
sizeof(uintptr_t);
860 size_t nelements = (_size +
sizeof(uintptr_t) -1) /
sizeof(uintptr_t);
877 typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, value_type >
iterator;
878 typedef typename internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type >
const_iterator;
890 template <
typename Finit
891 #if __TBB_ETS_USE_CPP11 901 internal::callback_leaf<T,
internal::construct_by_exemplar<T> >::make( exemplar )
904 #if __TBB_ETS_USE_CPP11 910 template <
typename P1,
typename... P,
916 internal::callback_leaf<T,
internal::construct_by_args<T,P1,P...> >::make( std::forward<P1>(arg1), std::forward<P>(args)... )
922 if(my_construct_callback) my_construct_callback->destroy();
924 this->internal::ets_base<ETS_key_type>::table_clear();
930 return local(exists);
935 void* ptr = this->table_lookup(exists);
971 template<
typename A2, ets_key_usage_type C2>
973 #if __TBB_ETS_USE_CPP11 && TBB_USE_ASSERT 978 my_construct_callback = other.my_construct_callback->clone();
980 my_locals.
reserve(other.size());
981 this->table_elementwise_copy( other, create_local_by_copy );
987 swap(my_construct_callback, other.my_construct_callback);
990 swap(my_locals, other.my_locals);
991 this->internal::ets_base<ETS_key_type>::table_swap(other);
994 #if __TBB_ETS_USE_CPP11 995 template<
typename A2, ets_key_usage_type C2>
1001 my_construct_callback = other.my_construct_callback;
1002 other.my_construct_callback = NULL;
1004 my_locals.
reserve(other.size());
1005 this->table_elementwise_copy( other, create_local_by_move );
1012 :
internal::ets_base<ETS_key_type>()
1014 internal_copy(other);
1017 template<
typename Alloc, ets_key_usage_type Cachetype>
1020 internal_copy(other);
1023 #if __TBB_ETS_USE_CPP11 1026 internal_swap(other);
1029 template<
typename Alloc, ets_key_usage_type Cachetype>
1038 if(
this != &other ) {
1040 my_construct_callback->destroy();
1041 internal_copy( other );
1046 template<
typename Alloc, ets_key_usage_type Cachetype>
1049 __TBB_ASSERT( static_cast<void*>(
this)!=static_cast<const void*>(&other), NULL );
1051 my_construct_callback->destroy();
1052 internal_copy(other);
1056 #if __TBB_ETS_USE_CPP11 1059 if(
this != &other )
1060 internal_swap(other);
1064 template<
typename Alloc, ets_key_usage_type Cachetype>
1067 __TBB_ASSERT( static_cast<void*>(
this)!=static_cast<const void*>(&other), NULL );
1069 my_construct_callback->destroy();
1076 template <
typename combine_func_t>
1079 internal::ets_element<T> location;
1080 my_construct_callback->construct(location.value());
1081 return *location.value_committed();
1085 while(++ci !=
end())
1086 my_result = f_combine( my_result, *ci );
1091 template <
typename combine_func_t>
1100 template<
typename Container >
1118 typedef typename internal::segmented_iterator<Container, value_type>
iterator;
1119 typedef typename internal::segmented_iterator<Container, const value_type>
const_iterator;
1121 flattened2d(
const Container &c,
typename Container::const_iterator b,
typename Container::const_iterator e ) :
1122 my_container(const_cast<Container*>(&c)), my_begin(b), my_end(e) { }
1125 my_container(const_cast<Container*>(&c)), my_begin(c.
begin()), my_end(c.
end()) { }
1134 for(
typename Container::const_iterator i = my_begin; i != my_end; ++i) {
1135 tot_size += i->size();
1148 template <
typename Container>
1153 template <
typename Container>
1161 using interface6::internal::segmented_iterator;
1164 using interface6::enumerable_thread_specific;
1165 using interface6::flattened2d;
1171 #undef __TBB_enumerable_thread_specific_H_include_area enumerable_thread_specific(P1 &&arg1, P &&... args)
Variadic constructor with initializer arguments. Each local instance of T is constructed by T(args....
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 id
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
tbb_thread_v3::id __TBB_EXPORTED_FUNC thread_get_id_v3()
generic_range_type(I begin_, I end_, size_t grainsize_=1)
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 h
enumerable_thread_specific()
Default constructor. Each local instance of T is default constructed.
tbb::concurrent_vector< padded_element, padded_allocator_type > internal_collection_type
void call(F &&f, Pack &&p)
Calls the given function with arguments taken from a stored_pack.
Allocator::template rebind< padded_element >::other padded_allocator_type
ptrdiff_t difference_type
void * create_local() __TBB_override
conval_type::difference_type difference_type
enumerable_thread_specific(const enumerable_thread_specific &other)
reference local(bool &exists)
Returns reference to calling thread's local copy, creating one if necessary.
void internal_copy(const enumerable_thread_specific< T, A2, C2 > &other)
ptrdiff_t difference_type
bool operator>(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
iterator grow_by(size_type delta)
Grow by "delta" elements.
void call_itt_notify(notify_type, void *)
vector_iterator< Container, T > operator+(ptrdiff_t offset, const vector_iterator< Container, T > &v)
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
void swap(concurrent_hash_map< Key, T, HashCompare, A > &a, concurrent_hash_map< Key, T, HashCompare, A > &b)
internal::concurrent_vector_base_v3::size_type size_type
const_iterator begin() const
begin const 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 __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 ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle * key
void internal_move(enumerable_thread_specific< T, A2, C2 > &&other)
conval_type::const_reference const_reference
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 size
reference local()
returns reference to local, discarding exists
enumerable_thread_specific & operator=(enumerable_thread_specific< T, Alloc, Cachetype > &&other)
Base class for types that should not be assigned.
bool operator==(const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)
generic_range_type< iterator > range_type
enumerable_thread_specific(T &&exemplar)
const T & const_reference
bool empty() const
Return false if vector is not empty or has elements under construction at least.
internal::enumerable_thread_specific_iterator< internal_collection_type, value_type > iterator
internal::enumerable_thread_specific_iterator< internal_collection_type, const value_type > const_iterator
enumerable_thread_specific & operator=(const enumerable_thread_specific< T, Alloc, Cachetype > &other)
bool operator>=(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
conval_type::size_type size_type
Basic types.
#define __TBB_STATIC_ASSERT(condition, msg)
const_iterator begin() const
Container::value_type conval_type
const_iterator end() const
T combine(combine_func_t f_combine)
conval_type::reference reference
enumerable_thread_specific & operator=(enumerable_thread_specific &&other)
internal_collection_type::difference_type difference_type
bool operator<(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
tick_count::interval_t operator-(const tick_count &t1, const tick_count &t0)
generic_range_type(generic_range_type &r, split)
const T & const_reference
size_type size() const
Return size of vector. It may include elements under construction.
flattened2d(const Container &c, typename Container::const_iterator b, typename Container::const_iterator e)
size_type size() const
Get the number of local copies.
internal::callback_base< T > * my_construct_callback
enumerable_thread_specific(enumerable_thread_specific &&other)
enumerable_thread_specific(enumerable_thread_specific< T, Alloc, Cachetype > &&other)
Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
Pads type T to fill out to a multiple of cache line size.
enumerable_thread_specific(const enumerable_thread_specific< T, Alloc, Cachetype > &other)
void const char const char int ITT_FORMAT __itt_group_sync p
The enumerable_thread_specific container.
flattened2d< Container > flatten2d(const Container &c, const typename Container::const_iterator b, const typename Container::const_iterator e)
static void * create_local_by_move(internal::ets_base< ETS_key_type > &base, void *p)
flattened2d(const Container &c)
internal_collection_type::size_type size_type
void clear()
Clear container while keeping memory allocated.
Dummy type that distinguishes splitting constructor from copy constructor.
generic_range_type< const_iterator > const_range_type
Container::const_iterator my_begin
void clear()
Destroys local copies.
Base class for types that should not be copied or assigned.
conval_type::pointer pointer
Enables one or the other code branches.
conval_type::allocator_type allocator_type
void free_array(void *_ptr, size_t _size) __TBB_override
range_type range(size_t grainsize=1)
Get range for parallel algorithms.
generic_range_type(const generic_range_type< U > &r)
Detects whether two given types are the same.
void reserve(size_type n)
Allocate enough space to grow to size n without having to allocate more memory later.
void swap(atomic< T > &lhs, atomic< T > &rhs)
void const char const char int ITT_FORMAT __itt_group_sync s
conval_type::value_type value_type
ets_key_usage_type
enum for selecting between single key and key-per-instance versions
A range over which to iterate.
enumerable_thread_specific(Finit finit)
Constructor with initializer functor. Each local instance of T is constructed by T(finit()).
const_iterator end() const
end const iterator
const_range_type range(size_t grainsize=1) const
Get const range for parallel algorithms.
void * create_array(size_t _size) __TBB_override
bool operator!=(const memory_pool_allocator< T, P > &a, const memory_pool_allocator< U, P > &b)
iterator begin()
begin iterator
internal::segmented_iterator< Container, value_type > iterator
Strips its template type argument from cv- and ref-qualifiers.
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
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 mask
internal::padded< internal::ets_element< T > > padded_element
iterator end()
end iterator
~enumerable_thread_specific()
Destructor.
atomic< T > & as_atomic(T &t)
Allocator::template rebind< uintptr_t >::other array_allocator_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
internal::segmented_iterator< Container, const value_type > const_iterator
bool empty() const
true if there have been no local copies created
enumerable_thread_specific & operator=(const enumerable_thread_specific &other)
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 ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
bool operator<=(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
enumerable_thread_specific(const T &exemplar)
Constructor with exemplar. Each local instance of T is copy-constructed from the exemplar.
internal_collection_type my_locals
static void * create_local_by_copy(internal::ets_base< ETS_key_type > &base, void *p)
void internal_swap(enumerable_thread_specific &other)
void combine_each(combine_func_t f_combine)
Allocator allocator_type
Basic types.
Identifiers declared inside namespace internal should never be used directly by client code.
Container::const_iterator my_end
A generic range, used to create range objects from the iterators.
conval_type::const_pointer const_pointer
void move(tbb_thread &t1, tbb_thread &t2)