1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
module Math_integer_m
implicit none
private
public :: add_integer
contains
pure function add_integer(x, y) result(result)
integer, intent(in) :: x, y
integer :: result
result = x + y
end function
pure function minus_integer(x, y) result(result)
integer, intent(in) :: x, y
integer :: result
result = x - y
end function
pure function max_integer(x, y) result(result)
integer, intent(in) :: x, y
integer :: result
result = max(x, y)
end function
pure function min_integer(x, y) result(result)
integer, intent(in) :: x, y
integer :: result
result = min(x, y)
end function
pure function zero_integer() result(result)
integer :: result
result = 0
end function
pure function one_integer() result(result)
integer :: result
result = 1
end function
end module
module Math_real_m
implicit none
private
public :: add_real
contains
pure function add_real(x, y) result(result)
real, intent(in) :: x, y
real :: result
result = x + y
end function
pure function minus_real(x, y) result(result)
real, intent(in) :: x, y
real :: result
result = x - y
end function
pure function slash_real(x, y) result(result)
real, intent(in) :: x, y
real :: result
result = x / y
end function
pure function max_real(x, y) result(result)
real, intent(in) :: x, y
real :: result
result = max(x, y)
end function
pure function min_real(x, y) result(result)
real, intent(in) :: x, y
real :: result
result = min(x, y)
end function
pure function zero_real() result(result)
real :: result
result = 0.0
end function
pure function one_real() result(result)
real :: result
result = 1.0
end function
end module
module triple_m
implicit none
private
public :: triple_tmpl
requirement magma_r(T, plus_T)
type, deferred :: T
pure function plus_T(l, r) result(total)
type(T), intent(in) :: l, r
type(T) :: total
end function
end requirement
template triple_tmpl(T, plus_T)
require :: magma_r(T, plus_T)
private
public :: triple_l, triple_r
contains
pure function triple_l(t) result(result)
type(T), intent(in) :: t
type(T) :: result
result = plus_T(plus_T(t, t), t)
end function
pure function triple_r(t) result(result)
type(T), intent(in) :: t
type(T) :: result
result = plus_T(t, plus_T(t, t))
end function
end template
end module
module use_triple_m
use Math_integer_m
use Math_real_m
use triple_m
contains
subroutine test_add_triples()
instantiate triple_tmpl(integer, add_integer), &
only: triple_add_l => triple_l, &
triple_add_r => triple_r
integer :: tal, tar
tal = triple_add_l(7)
tar = triple_add_r(7)
print *, "tal = ", tal, " tar = ", tar
end subroutine
subroutine test_minus_triples()
instantiate triple_tmpl(real, minus_real), &
only: triple_minus_l => triple_l, &
triple_minus_r => triple_r
real :: tml, tmr
tml = triple_minus_l(7.0)
tmr = triple_minus_r(7.0)
print *, "tml = ", tml, " tmr = ", tmr
end subroutine
subroutine test_max_triples()
instantiate triple_tmpl(real, max_real), &
only: triple_max_l => triple_l, &
triple_max_r => triple_r
real :: tmaxl, tmaxr
tmaxl = triple_max_l(7.0)
tmaxr = triple_max_r(7.0)
print *, "tmaxl =", tmaxl, " tmaxr =", tmaxr
end subroutine
end module
program template_triple
use use_triple_m
call test_add_triples()
call test_minus_triples()
call test_max_triples()
end program template_triple
|