37 character(len=DICT_KEY_LENGTH) :: key
38 type(DICT_DATA) :: value
42 type(LINKED_LIST),
pointer :: list
47 type(HASH_LIST),
pointer,
dimension(:) :: table
55 private :: linked_list
56 private :: list_create
57 private :: list_destroy
60 private :: list_insert
61 private :: list_delete_element
62 private :: dict_get_elem
63 private :: dict_hashkey
65 integer,
parameter,
private :: hash_size = 499
66 integer,
parameter,
private :: multiplier = 1
68 include
'linkedlist.f90'
88 subroutine dict_create( dict, key, value )
89 type(DICT_STRUCT),
pointer :: dict
90 character(len=*),
intent(in) :: key
91 type(DICT_DATA),
intent(in) :: value
93 type(LIST_DATA) :: data
98 allocate( dict%table(hash_size) )
101 dict%table(i)%list => null()
107 hash = dict_hashkey( trim(key ) )
108 call list_create( dict%table(hash)%list,
data )
110 end subroutine dict_create
120 subroutine dict_destroy( dict )
121 type(DICT_STRUCT),
pointer :: dict
125 do i = 1,
size(dict%table)
126 if (
associated( dict%table(i)%list ) )
then
127 call list_destroy( dict%table(i)%list )
130 deallocate( dict%table )
133 end subroutine dict_destroy
145 subroutine dict_add_key( dict, key, value )
146 type(DICT_STRUCT),
pointer :: dict
147 character(len=*),
intent(in) :: key
148 type(DICT_DATA),
intent(in) :: value
150 type(LIST_DATA) :: data
151 type(LINKED_LIST),
pointer :: elem
154 elem => dict_get_elem( dict, key )
156 if (
associated(elem) )
then
157 elem%data%value =
value
161 hash = dict_hashkey( trim(key) )
162 if (
associated( dict%table(hash)%list ) )
then
163 call list_insert( dict%table(hash)%list,
data )
165 call list_create( dict%table(hash)%list,
data )
169 end subroutine dict_add_key
177 subroutine dict_delete_key( dict, key )
178 type(DICT_STRUCT),
pointer :: dict
179 character(len=*),
intent(in) :: key
181 type(LINKED_LIST),
pointer :: elem
184 elem => dict_get_elem( dict, key )
186 if (
associated(elem) )
then
187 hash = dict_hashkey( trim(key) )
188 call list_delete_element( dict%table(hash)%list, elem )
190 end subroutine dict_delete_key
198 function dict_get_key( dict, key )
result(value)
199 type(DICT_STRUCT),
pointer :: dict
200 character(len=*),
intent(in) :: key
201 type(DICT_DATA),
pointer :: value
203 type(LINKED_LIST),
pointer :: elem
205 elem => dict_get_elem( dict, key )
207 if (
associated(elem) )
then
208 value => elem%data%value
212 end function dict_get_key
220 function dict_has_key( dict, key )
result(has)
221 type(DICT_STRUCT),
pointer :: dict
222 character(len=*),
intent(in) :: key
225 type(LINKED_LIST),
pointer :: elem
227 elem => dict_get_elem( dict, key )
229 has =
associated(elem)
230 end function dict_has_key
238 function dict_get_elem( dict, key )
result(elem)
239 type(DICT_STRUCT),
pointer :: dict
240 character(len=*),
intent(in) :: key
242 type(LINKED_LIST),
pointer :: elem
245 hash = dict_hashkey( trim(key) )
247 elem => dict%table(hash)%list
248 do while (
associated(elem) )
249 if ( elem%data%key .eq. key )
then
252 elem => list_next( elem )
255 end function dict_get_elem
262 integer function dict_hashkey( key )
263 character(len=*),
intent(in) :: key
271 dict_hashkey = multiplier * dict_hashkey + ichar(key(i:i))
274 dict_hashkey = 1 + mod( dict_hashkey-1, hash_size )
275 end function dict_hashkey