!!
!! Examples of using INTERFACE blocks in Fortran
!!
!! INTERFACE blocks have two different uses:
!!
!!     1. Declaring the interface of an external subprogram
!!        (as an alternative to the EXTERNAL statement, which
!!        declares that the subprogram is external but says nothing
!!        about its signature)
!!
!!     2. Overloading
!!
!! J. Overbey 9/15/08
!!
module interface_example
    implicit none

    !! USAGE 1: Declaring the interface of an external subprogram
    interface
        integer function one()
        end function

        integer function two()
        end function
    end interface

    ! Note that one and two are exported and can be made private
    private :: two

    !! USAGE 2: Overloading
    interface description
        character(len=*) function description_int(value)
            integer, intent(in) :: value
        end function description_int
        module procedure description_real
    end interface

contains
    character(len=50) function description_real(value)
        real, intent(in) :: value
        write (description_real, *) "REAL:", value
    end function
end module interface_example

program program
    use interface_example
    integer :: one, two = 2  ! Note that "two" is hidden in the module
    print *, one()
    print *, description(2)
    print *, description(3.0)
end program program

!! EXTERNAL SUBPROGRAMS
integer function one(); one = 1; end function
integer function two(); two = 2; end function
character(len=50) function description_int(value)
    integer, intent(in) :: value
    write (description_real, *) "INTEGER:", value
end function
