Maps in Co-array Fortran To create and manipulate maps in co-array Fortran, you can utilize derived types and procedures. Here’s an example of how this can be done:
module map_module
implicit none
type :: map_item
character ( len = :), allocatable :: key
integer :: value
end type map_item
type :: map
type ( map_item ), allocatable :: items (:)
contains
procedure :: add => add_to_map
procedure :: get => get_from_map
procedure :: remove => remove_from_map
procedure :: size => map_size
procedure :: clear => clear_map
end type map
contains
subroutine add_to_map ( this , key , value )
class ( map ), intent ( inout ) :: this
character ( len =* ), intent ( in ) :: key
integer , intent ( in ) :: value
type ( map_item ) :: new_item
new_item % key = key
new_item % value = value
if (. not . allocated ( this % items )) then
allocate ( this % items ( 1 ))
this % items ( 1 ) = new_item
else
this % items = [ this % items , new_item ]
endif
end subroutine add_to_map
integer function get_from_map ( this , key , found )
class ( map ), intent ( in ) :: this
character ( len =* ), intent ( in ) :: key
logical , intent ( out ) :: found
integer :: i
found = . false .
get_from_map = 0
do i = 1 , size ( this % items )
if ( this % items ( i )% key == key ) then
get_from_map = this % items ( i )% value
found = . true .
return
endif
end do
end function get_from_map
subroutine remove_from_map ( this , key )
class ( map ), intent ( inout ) :: this
character ( len =* ), intent ( in ) :: key
integer :: i
do i = 1 , size ( this % items )
if ( this % items ( i )% key == key ) then
this % items ( i :) = this % items ( i + 1 :)
allocate ( this % items ( size ( this % items ) - 1 ))
return
endif
end do
end subroutine remove_from_map
integer function map_size ( this )
class ( map ), intent ( in ) :: this
if ( allocated ( this % items )) then
map_size = size ( this % items )
else
map_size = 0
endif
end function map_size
subroutine clear_map ( this )
class ( map ), intent ( inout ) :: this
if ( allocated ( this % items )) deallocate ( this % items )
end subroutine clear_map
end module map_module
To use the map
type, you can write a program as follows:
program main
use map_module
implicit none
type ( map ) :: m
integer :: val
logical :: found
! Add elements to the map
call m % add ( "k1" , 7 )
call m % add ( "k2" , 13 )
! Print the map size
print * , "len:" , m % size ()
! Get a value
val = m % get ( "k1" , found )
if ( found ) then
print * , "v1:" , val
else
print * , "v1: not found"
endif
! Attempt to get a value for a non-existent key
val = m % get ( "k3" , found )
if ( found ) then
print * , "v3:" , val
else
print * , "v3:" , val , "(default zero value)"
endif
! Remove an element from the map
call m % remove ( "k2" )
print * , "len after remove:" , m % size ()
! Clear the map
call m % clear ()
print * , "len after clear:" , m % size ()
end program main
This example defines a map
type with add, get, remove, size, and clear methods, similar to the ones in the original example. Note that Fortran does not directly support maps, so an array of derived types is used to simulate map behavior.