File: operator_overloading_06.f90

package info (click to toggle)
lfortran 0.45.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 46,332 kB
  • sloc: cpp: 137,068; f90: 51,260; python: 6,444; ansic: 4,277; yacc: 2,285; fortran: 806; sh: 524; makefile: 30; javascript: 15
file content (49 lines) | stat: -rw-r--r-- 1,131 bytes parent folder | download
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