Common code used internally by dict_set() and change_capacity().
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(dict_str_i4_type), | intent(inout) | :: | dict | |||
character(len=default_string_length), | intent(in) | :: | key | |||
integer(kind=int_4), | intent(in) | :: | value | |||
integer(kind=int_8), | intent(in) | :: | hash |
RECURSIVE SUBROUTINE set_hashed_str_i4 (dict, key, value, hash)
!! Common code used internally by dict_set() and change_capacity().
TYPE(dict_str_i4_type), intent(inout) :: dict
CHARACTER(LEN=default_string_length), intent(in) :: key
INTEGER(kind=int_4), intent(in) :: value
INTEGER(KIND=int_8), intent(in) :: hash
TYPE(private_item_type_str_i4), POINTER :: item, new_item
INTEGER(KIND=int_8) :: idx
idx = MOD(hash, INT(size(dict%buckets), KIND=int_8)) + 1
! if already in dict just update its value
item => dict%buckets(idx)%p
do while (ASSOCIATED(item))
IF (item%hash == hash) THEN
IF (item%key == key) THEN
item%value =value
return
END IF
END IF
item => item%next
end do
! check load-factor
IF (4*dict%size > 3*size(dict%buckets)) THEN ! load-factor > 75%
call change_capacity_str_i4 (dict, 2*size(dict%buckets)) !double capacity
idx = MOD(hash, INT(size(dict%buckets), KIND=int_8)) + 1
END IF
! create a new item
allocate (new_item)
new_item%hash = hash
new_item%key =key
new_item%value =value
new_item%next => dict%buckets(idx)%p
dict%buckets(idx)%p => new_item
dict%size = dict%size + 1
END SUBROUTINE set_hashed_str_i4