Example: Custom key types

Example: Custom Key Types

Custom key types can be defined simply by extension of the abstract fhash_key_t type defined in fhash_key_base. Extensions of this type must implement the equals, hash and to_string procedures. Optionally, you may also override the fhash_key interface with a helper function to generate a key from your custom type.

To perform the hashing, the included fhash_fnv module provides the fnv_1a interface which supports default scalar characters and 32bit/64bit scalar/1D integers. You can use this interface to generate a hash from the components of your derived type.

In this example, a key_string_t key container type is defined as an extension of fhash_key_T which allows the string_t derived type to be used as a key.

!> Example program demonstrating how a custom key-type 
!>  can be used.
!> See the `my_key_type` module for the definition of the
!>  custom key type.
!>
!> See README.md for an explanation
!>
program fhash_demo
  use fhash, only: fhash_tbl_t
  use my_key_type, only: string_t, key_string_t, key=>fhash_key
  implicit none

  type(fhash_tbl_t) :: tbl
  type(string_t) :: str1, str2
  integer :: val

  print *, '# fhash demo program: custom-key-demo'

  str1%s = 'Hello world'
  str2%s = 'Hello fhash'

  print *, 'Storing value 10 with key: "',str1%s,'"'
  call tbl%set(key([str1]), value=10)

  print *, 'Storing value 20 with key: "',str2%s,'"'
  call tbl%set(key([str2]), value=20)

  print *, 'Storing value 30 with key: ["',str1%s,'", "',str2%s,'"]'
  call tbl%set(key([str1,str2]), value=30)

  print *, 'Retrieving value with key: "',str1%s,'"'
  call tbl%get(key([str1]),val)
  print *, '   value = ',val

  print *, 'Retrieving value with key: "',str2%s,'"'
  call tbl%get(key([str2]),val)
  print *, '   value = ',val

  print *, 'Retrieving value with key: ["',str1%s,'", "',str2%s,'"]'
  call tbl%get(key([str1,str2]),val)
  print *, '   value = ',val

  print *

end program fhash_demo