Internal routine for changing the dictionary's capacity.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dict_str_i4_type), | intent(inout) | :: | dict | |||
integer, | intent(in) | :: | new_capacity |
RECURSIVE SUBROUTINE change_capacity_str_i4 (dict, new_capacity)
!! Internal routine for changing the dictionary's capacity.
TYPE(dict_str_i4_type), intent(inout) :: dict
INTEGER, intent(in) :: new_capacity
INTEGER :: i, old_size, new_cap
TYPE(private_item_type_str_i4), POINTER :: item, prev_item
TYPE(private_item_p_type_str_i4), DIMENSION(:), POINTER :: old_buckets
new_cap = new_capacity
! pre checks
IF (new_cap > HUGE(i)) THEN
IF (size(dict%buckets) == HUGE(i)) RETURN ! reached maximum - stay there.
new_cap = HUGE(i) ! grow as far as possible
END IF
IF (new_cap < 1) &
DBCSR_ABORT("dict_str_i4_change_capacity: new_capacity < 1.")
IF (4*dict%size > 3*new_cap) &
DBCSR_ABORT("dict_str_i4_change_capacity: new_capacity too small.")
old_size = dict%size
old_buckets => dict%buckets
ALLOCATE (dict%buckets(new_capacity))
dict%size = 0
do i = 1, size(old_buckets)
item => old_buckets(i)%p
do while (ASSOCIATED(item))
call set_hashed_str_i4 (dict, item%key, item%value, item%hash)
prev_item => item
item => item%next
deallocate (prev_item)
end do
end do
deallocate (old_buckets)
IF (old_size /= dict%size) &
DBCSR_ABORT("dict_str_i4_change_capacity: assertion failed")
END SUBROUTINE change_capacity_str_i4