26 #ifndef __TBB__flow_graph_hash_buffer_impl_H 27 #define __TBB__flow_graph_hash_buffer_impl_H 29 #ifndef __TBB_flow_graph_H 30 #error Do not #include this internal file directly; use public TBB headers instead. 37 template<
typename ValueType>
54 static const size_t INITIAL_SIZE = 8;
72 size_t mask() {
return my_size - 1; }
75 for(
size_t i=0; i < sz - 1; ++i ) {
76 la[i].second = &(la[i+1]);
78 la[sz-1].second = NULL;
79 *p_free_list = (element_type *)&(la[0]);
88 DoCleanup(pointer_array_type &pa, list_array_type &my_els,
size_t sz) :
89 my_pa(&pa), my_elements(&my_els), my_size(sz) { }
93 internal_free_buffer(*my_pa, *my_elements, my_size, dont_care);
101 size_t new_nelements = nelements;
102 list_array_type new_elements_array = NULL;
103 pointer_array_type new_pointer_array = NULL;
104 list_array_type new_free_list = NULL;
106 DoCleanup my_cleanup(new_pointer_array, new_elements_array, new_size);
107 new_elements_array = elements_array_allocator().allocate(my_size);
108 new_pointer_array = pointer_array_allocator_type().allocate(new_size);
109 for(
size_t i=0; i <
new_size; ++i) new_pointer_array[i] = NULL;
110 set_up_free_list(&new_free_list, new_elements_array, my_size );
112 for(
size_t i=0; i < my_size; ++i) {
113 for( element_type* op = pointer_array[i]; op; op = (element_type *)(op->second)) {
114 value_type *ov =
reinterpret_cast<value_type *
>(&(op->first));
116 internal_insert_with_key(new_pointer_array, new_size, new_free_list, *ov);
119 my_cleanup.my_pa = NULL;
120 my_cleanup.my_elements = NULL;
123 internal_free_buffer(pointer_array, elements_array, my_size, nelements);
124 free_list = new_free_list;
125 pointer_array = new_pointer_array;
126 elements_array = new_elements_array;
128 nelements = new_nelements;
134 const value_type &v) {
135 size_t l_mask = p_sz-1;
136 __TBB_ASSERT(my_key,
"Error: value-to-key functor not provided");
137 size_t h = this->hash((*my_key)(v)) & l_mask;
138 __TBB_ASSERT(p_free_list,
"Error: free list not set up.");
139 element_type* my_elem = p_free_list; p_free_list = (element_type *)(p_free_list->second);
140 (
void)
new(&(my_elem->first)) value_type(v);
141 my_elem->second = p_pointer_array[
h];
142 p_pointer_array[
h] = my_elem;
146 pointer_array = pointer_array_allocator_type().allocate(my_size);
147 for(
size_t i = 0; i < my_size; ++i) pointer_array[i] = NULL;
148 elements_array = elements_array_allocator().allocate(my_size / 2);
149 set_up_free_list(&free_list, elements_array, my_size / 2);
155 for(
size_t i = 0; i < sz; ++i ) {
156 element_type *p_next;
157 for( element_type *
p = pa[i];
p;
p = p_next) {
158 p_next = (element_type *)
p->second;
159 internal::punned_cast<value_type *>(&(
p->first))->~value_type();
162 pointer_array_allocator_type().deallocate(pa, sz);
168 elements_array_allocator().deallocate(el, sz / 2);
176 hash_buffer() : my_key(NULL), my_size(INITIAL_SIZE), nelements(0) {
177 internal_initialize_buffer();
181 internal_free_buffer(pointer_array, elements_array, my_size, nelements);
182 if(my_key)
delete my_key;
186 internal_free_buffer(pointer_array, elements_array, my_size, nelements);
187 internal_initialize_buffer();
197 pointer_type
p = NULL;
198 __TBB_ASSERT(my_key,
"Error: value-to-key functor not provided");
199 if(find_ref_with_key((*my_key)(v), p)) {
201 (
void)
new(p) value_type(v);
205 if(nelements*2 > my_size) grow_array();
206 internal_insert_with_key(pointer_array, my_size, free_list, v);
212 size_t i = this->hash(k) &
mask();
213 for(element_type*
p = pointer_array[i];
p;
p = (element_type *)(
p->second)) {
214 pointer_type pv =
reinterpret_cast<pointer_type
>(&(
p->first));
215 __TBB_ASSERT(my_key,
"Error: value-to-key functor not provided");
216 if(this->equal((*my_key)(*pv), k)) {
226 if(find_ref_with_key(k, p)) {
235 size_t h = this->hash(k) &
mask();
236 element_type* prev = NULL;
237 for(element_type*
p = pointer_array[h];
p; prev =
p,
p = (element_type *)(p->second)) {
238 value_type *vp =
reinterpret_cast<value_type *
>(&(p->first));
239 __TBB_ASSERT(my_key,
"Error: value-to-key functor not provided");
240 if(this->equal((*my_key)(*vp), k)) {
242 if(prev) prev->second = p->second;
243 else pointer_array[
h] = (element_type *)(p->second);
244 p->second = free_list;
253 #endif // __TBB__flow_graph_hash_buffer_impl_H ValueToKey * get_key_func()
void internal_initialize_buffer()
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
Allocator::template rebind< list_array_type >::other pointer_array_allocator_type
pointer_array_type pointer_array
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
aligned_pair< ValueType, void * >::type 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 new_size
Meets "allocator" requirements of ISO C++ Standard, Section 20.1.5.
void delete_with_key(const Knoref &k)
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_id __itt_string_handle __itt_metadata_type type
element_type * list_array_type
pointer_array_type * my_pa
static void internal_free_buffer(pointer_array_type &pa, list_array_type &el, size_t &sz, size_t &ne)
void set_up_free_list(element_type **p_free_list, list_array_type la, size_t sz)
list_array_type * pointer_array_type
void const char const char int ITT_FORMAT __itt_group_sync p
bool find_ref_with_key(const Knoref &k, pointer_type &v)
tbb::internal::strip< Key >::type Knoref
value_type * pointer_type
DoCleanup(pointer_array_type &pa, list_array_type &my_els, size_t sz)
buffer_element_type< value_type >::type element_type
Allocator::template rebind< element_type >::other elements_array_allocator
void internal_insert_with_key(element_type **p_pointer_array, size_t p_sz, list_array_type &p_free_list, const value_type &v)
bool insert_with_key(const value_type &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 mask
void set_key_func(ValueToKey *vtk)
bool find_with_key(const Knoref &k, value_type &v)
list_array_type * my_elements
list_array_type elements_array