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
|
module operator_overloading_06_mo_vec
type :: typ1
real :: x, y
contains
procedure :: diff, neg
generic :: operator(-) => diff, neg
end type typ1
! extended type
type, extends(typ1) :: typ2
real :: z
end type typ2
contains
pure type(typ1) function diff(this, that)
class(typ1), intent(in) :: this, that
diff = typ1(this%x - that%x, this%y - that%y)
end function diff
pure type(typ1) function neg(this)
class(typ1), intent(in) :: this
neg = typ1(-this%x, -this%y)
end function neg
end module operator_overloading_06_mo_vec
program vec_test
use operator_overloading_06_mo_vec, only: typ2, typ1
type(typ2) :: var1 = typ2(1., 3., 5.), var2 = typ2(2., 4., 6.)
type(typ1) :: result
print *, var1, var2
print *, -var2
result = -var2
if( abs(result%x + 2.0) > 1e-8 ) error stop
if( abs(result%y + 4.0) > 1e-8 ) error stop
print *, var1 - var2
result = var1 - var2
if( abs(result%x + 1.0) > 1e-8 ) error stop
if( abs(result%y + 1.0) > 1e-8 ) error stop
end program vec_test
|