28POLAR_FUNCTION_INTERNAL
void
34 assert( POLAR_IS_SPARSE_ARRAY(self) );
40POLAR_FUNCTION_INTERNAL
void
47 assert( POLAR_IS_SPARSE_ARRAY(self) );
48 assert( self->data_inherited.node_root != NULL );
49 assert( POLAR_IS_SPARSE_ARRAY_PAGE(page_root_new) );
52 if( page_root_current != page_root_new )
58 if( polar_sparse_array_page_compare_elements_used(page_root_new, page_root_current, self->value_element_empty) > 0 )
68 instance_size = polar_internal_type_get_instance_size( ((
polar_btree *)self)->id_node_type );
71 objc_memcpy(page_root_current, page_root_new, instance_size);
72 objc_memcpy(page_root_new, page_temp, instance_size);
74 polar_memory_free(page_temp, instance_size);
78 for( i = 0; i < self->data_inherited.count_nodes; i++ )
80 page_current = polar_sparse_array_next_page_after(self, page_current);
82 if( page_current != page_root_current )
87 polar_sparse_array_insert_page(self, page_current);
97 assert( *p_array_target != NULL );
98 assert( POLAR_IS_SPARSE_ARRAY(*p_array_target) );
102 if( (*p_array_target)->value_element_empty == NULL )
105 polar_sparse_array_page_fill_elements(result, (*p_array_target)->value_element_empty);
115 assert( POLAR_IS_SPARSE_ARRAY(self) );
116 assert( idx_page_desired >= 0 );
121 for( i = 0; i < self->data_inherited.count_nodes; i++ )
126 else if( (
void *)idx_page_desired < ((
polar_btree_node *)result)->node_key )
136 return &self->page_empty;
139 return &self->page_empty;
142POLAR_FUNCTION_INTERNAL
void
147 size_t instance_size;
148 intptr_t idx_logical_max;
150 assert( POLAR_IS_SPARSE_ARRAY(self) );
152 if( page_new != NULL )
153 assert( POLAR_IS_SPARSE_ARRAY_PAGE(page_new) );
160 if( page_current == NULL )
163 else if( polar_sparse_array_page_compare_elements_used(page_new, page_current, self->value_element_empty) > 0 )
164 polar_sparse_array_maybe_replace_root(self, page_new);
173 page_placement = NULL;
194 }
while( page_placement == NULL );
196 if( polar_sparse_array_page_compare_elements_used(page_new, page_current, self->value_element_empty) > 0 )
203 instance_size = polar_internal_type_get_instance_size( ((
polar_btree *)self)->id_node_type );
207 objc_memcpy(page_current, page_new, instance_size);
208 objc_memcpy(page_new, page_temp, instance_size);
210 polar_memory_free(page_temp, instance_size);
212 page_temp = page_current;
213 page_current = page_new;
214 page_new = page_temp;
228 idx_logical_max = POLAR_MASK_SPARSE_ARRAY +
229 ( polar_sparse_array_page_get_page_number(page_new) << POLAR_SHIFT_SPARSE_ARRAY );
231 if( idx_logical_max > self->idx_logical_max )
232 self->idx_logical_max = idx_logical_max;
242 POLAR_RUNTIME_OBJECT_CLASS(superclass_polar_sparse_array)->init( (
polar_runtime_object *)self );
246 self->data_inherited.id_node_type = POLAR_TYPE_SPARSE_ARRAY_PAGE;
247 self->idx_logical_max = -1;
249 ( (
polar_runtime_object *)(&self->page_empty) )->class_pointer = self->data_inherited.id_node_type;
255POLAR_FUNCTION_INTERNAL
void
259 superclass_polar_sparse_array = POLAR_RUNTIME_OBJECT_CLASS(self)->class_superclass;
267 .name_type =
"polar_sparse_array",
270 .type_class_init = (polar_func_runtime_object_class_lifecycle)_polar_sparse_array_class_init
275POLAR_FUNCTION_INTERNAL OBJC_FUNCTION_CONSTANT polar_internal_type
276polar_sparse_array_get_type(
void )
278 static polar_internal_type pt_polar_sparse_array = POLAR_INTERNAL_TYPE_INVALID;
280 if( pt_polar_sparse_array != POLAR_INTERNAL_TYPE_INVALID )
281 return pt_polar_sparse_array;
283 pt_polar_sparse_array = polar_internal_type_init( POLAR_TYPE_BTREE, &class_polar_sparse_array,
284 &pti_polar_sparse_array) ;
286 return pt_polar_sparse_array;
290polar_sparse_array_new(
void *value_element_empty )
295 result->value_element_empty = value_element_empty;
297 if( value_element_empty == NULL )
301 polar_sparse_array_page_fill_elements( &result->page_empty, value_element_empty );
306POLAR_FUNCTION_INTERNAL OBJC_FUNCTION_HOTSPOT
void *
309 intptr_t idx_page, idx_element;
312 assert( POLAR_IS_SPARSE_ARRAY(self) );
313 assert( idx_logical >= 0 );
315 if( idx_logical <= self->idx_logical_max )
317 idx_page = ( idx_logical >> POLAR_SHIFT_SPARSE_ARRAY );
318 page_target = polar_sparse_array_get_page(self, idx_page);
320 idx_element = ( idx_logical & POLAR_MASK_SPARSE_ARRAY );
321 return polar_sparse_array_page_get_element(page_target, idx_element);
324 return self->value_element_empty;
327POLAR_FUNCTION_INTERNAL
void
328polar_sparse_array_set_element(
polar_sparse_array **p_array_target, intptr_t idx_logical,
void *value_new )
330 intptr_t idx_page, idx_element;
334 assert( p_array_target != NULL );
335 assert( POLAR_IS_SPARSE_ARRAY(*p_array_target) );
336 assert( idx_logical >= 0 );
338 idx_page = ( idx_logical >> POLAR_SHIFT_SPARSE_ARRAY );
339 idx_element = ( idx_logical & POLAR_MASK_SPARSE_ARRAY );
340 array_target = *p_array_target;
342 if( idx_logical <= array_target->idx_logical_max )
344 page_target = polar_sparse_array_get_page(array_target, idx_page);
346 if( page_target != &array_target->page_empty )
348 polar_sparse_array_page_set_element(page_target, idx_element, value_new);
353 if( value_new != array_target->value_element_empty )
355 page_target = polar_sparse_array_new_page(p_array_target);
358 polar_sparse_array_page_set_element(page_target, idx_element, value_new);
360 polar_sparse_array_insert_page(*p_array_target, page_target);
364POLAR_FUNCTION_INTERNAL BOOL
365polar_sparse_array_set_element_if_empty(
polar_sparse_array **p_array_target, intptr_t idx_logical,
void *value_new )
367 assert( p_array_target != NULL );
368 assert( POLAR_IS_SPARSE_ARRAY(*p_array_target) );
369 assert( idx_logical >= 0 );
371 if( polar_sparse_array_test_element_empty(*p_array_target, idx_logical) )
373 polar_sparse_array_set_element(p_array_target, idx_logical, value_new);
Definition polar-btree-node.h:25
Definition polar-btree.h:25
Definition polar-internal-type.h:34
Definition polar-runtime-object.h:36
Definition polar-runtime-object.h:31
Definition polar-sparse-array.h:33
Definition polar-sparse-array-page.h:34
Definition polar-sparse-array.h:25