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_insert_head
62 private :: list_delete_element
63 private :: list_get_data
64 private :: list_put_data
65 private :: dict_get_elem
66 private :: dict_hashkey
68 integer,
parameter,
private :: hash_size = 499
69 integer,
parameter,
private :: multiplier = 1
71 include
'linkedlist.f90'
91 subroutine dict_create( dict, key, value )
92 type(DICT_STRUCT),
pointer :: dict
93 character(len=*),
intent(in) :: key
94 type(DICT_DATA),
intent(in) :: value
96 type(LIST_DATA) :: data
101 allocate( dict%table(hash_size) )
104 dict%table(i)%list => null()
110 hash = dict_hashkey( trim(key ) )
111 call list_create( dict%table(hash)%list,
data )
113 end subroutine dict_create
123 subroutine dict_destroy( dict )
124 type(DICT_STRUCT),
pointer :: dict
128 do i = 1,
size(dict%table)
129 if (
associated( dict%table(i)%list ) )
then
130 call list_destroy( dict%table(i)%list )
133 deallocate( dict%table )
136 end subroutine dict_destroy
148 subroutine dict_add_key( dict, key, value )
149 type(DICT_STRUCT),
pointer :: dict
150 character(len=*),
intent(in) :: key
151 type(DICT_DATA),
intent(in) :: value
153 type(LIST_DATA) :: data
154 type(LINKED_LIST),
pointer :: elem
157 elem => dict_get_elem( dict, key )
159 if (
associated(elem) )
then
160 elem%data%value =
value
164 hash = dict_hashkey( trim(key) )
165 if (
associated( dict%table(hash)%list ) )
then
166 call list_insert( dict%table(hash)%list,
data )
168 call list_create( dict%table(hash)%list,
data )
172 end subroutine dict_add_key
180 subroutine dict_delete_key( dict, key )
181 type(DICT_STRUCT),
pointer :: dict
182 character(len=*),
intent(in) :: key
184 type(LINKED_LIST),
pointer :: elem
187 elem => dict_get_elem( dict, key )
189 if (
associated(elem) )
then
190 hash = dict_hashkey( trim(key) )
191 call list_delete_element( dict%table(hash)%list, elem )
193 end subroutine dict_delete_key
201 function dict_get_key( dict, key )
result(value)
202 type(DICT_STRUCT),
pointer :: dict
203 character(len=*),
intent(in) :: key
204 type(DICT_DATA),
pointer :: value
206 type(LINKED_LIST),
pointer :: elem
208 elem => dict_get_elem( dict, key )
210 if (
associated(elem) )
then
211 value => elem%data%value
215 end function dict_get_key
223 function dict_has_key( dict, key )
result(has)
224 type(DICT_STRUCT),
pointer :: dict
225 character(len=*),
intent(in) :: key
228 type(LINKED_LIST),
pointer :: elem
230 elem => dict_get_elem( dict, key )
232 has =
associated(elem)
233 end function dict_has_key
241 function dict_get_elem( dict, key )
result(elem)
242 type(DICT_STRUCT),
pointer :: dict
243 character(len=*),
intent(in) :: key
245 type(LINKED_LIST),
pointer :: elem
248 hash = dict_hashkey( trim(key) )
250 elem => dict%table(hash)%list
251 do while (
associated(elem) )
252 if ( elem%data%key .eq. key )
then
255 elem => list_next( elem )
258 end function dict_get_elem
265 integer function dict_hashkey( key )
266 character(len=*),
intent(in) :: key
274 dict_hashkey = multiplier * dict_hashkey + ichar(key(i:i))
277 dict_hashkey = 1 + mod( dict_hashkey-1, hash_size )
278 end function dict_hashkey