program main
use, intrinsic :: iso_fortran_env, only: int8
implicit none
type :: hashmap
character(len=:), allocatable :: key(:)
integer(int8) :: val(:)
end type hashmap
type(hashmap) :: m
allocate(character(len=10) :: m%key(0))
allocate(m%val(0))
call set(m, 'k1', 7)
call set(m, 'k2', 13)
call print_map(m)
call get(m, 'k1')
call get(m, 'k3')
call remove(m, 'k2')
call print_map(m)
call clear(m)
call print_map(m)
deallocate(m%key, m%val)
end program main
contains
subroutine set(map, key, val)
type(hashmap), intent(inout) :: map
character(len=10), intent(in) :: key
integer(int8), intent(in) :: val
allocate(map%key(size(map%key)+1))
allocate(map%val(size(map%val)+1))
map%key(size(map%key)) = key
map%val(size(map%val)) = val
end subroutine set
subroutine get(map, key)
type(hashmap), intent(in) :: map
character(len=10), intent(in) :: key
integer :: i
i = index(key, map%key)
if (i > 0) then
print *, 'v:', map%val(i)
else
print *, 'v: 0'
end if
end subroutine get
subroutine remove(map, key)
type(hashmap), intent(inout) :: map
character(len=10), intent(in) :: key
integer :: i
i = index(key, map%key)
if (i > 0) then
map%key(i:) = map%key(i+1:)
map%val(i:) = map%val(i+1:)
allocate(map%key(size(map%key)-1))
allocate(map%val(size(map%val)-1))
end if
end subroutine remove
subroutine clear(map)
type(hashmap), intent(inout) :: map
deallocate(map%key, map%val)
allocate(map%key(0))
allocate(map%val(0))
end subroutine clear
subroutine print_map(map)
type(hashmap), intent(in) :: map
integer :: i
do i=1, size(map%key)
print *, 'map: ', map%key(i), map%val(i)
end do
end subroutine print_map
integer function index(key, arr)
character(len=10), intent(in) :: key(:), arr(:)
integer :: i
index = 0
do i = 1, size(arr)
if (trim(arr(i)) == trim(key)) then
index = i
return
end if
end do
end function index
end