summaryrefslogtreecommitdiff
path: root/Tests/UseSWIG/runme.f90
blob: 1d985d3acd8037a25963e0e1e1457ef0a74f184b (plain)
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
! File : runme.f90
program runme
  use ISO_FORTRAN_ENV
  implicit none
  integer, parameter :: STDOUT = OUTPUT_UNIT

  call run()
contains

subroutine run()
  use example
  use iso_c_binding
  implicit none

  type(Circle)          :: c
  type(Square), target  :: s ! 'target' allows it to be pointed to
  class(Shape), pointer :: sh
  integer(C_INT) :: n_shapes

  ! ----- Object creation -----

  write(STDOUT,*) "Creating some objects"
  c = Circle(10.0d0)
  s = Square(10.0d0)

  ! ----- Access a static member -----
  write(STDOUT,'(a,i2,a)')"A total of", s%get_nshapes(), " shapes were created"

  ! ----- Member data access -----

  ! Notice how we can do this using functions specific to
  ! the 'Circle' class.
  call c%set_x(20.0d0)
  call c%set_y(30.0d0)

  ! Now use the same functions in the base class
  sh => s
  call sh%set_x(-10.0d0)
  call sh%set_y(  5.0d0)

  write(STDOUT,*)"Here is their current position:"
  write(STDOUT,'(a,f5.1,a,f5.1,a)')"  Circle = (", c%get_x(), ",", c%get_y(), " )"
  write(STDOUT,'(a,f5.1,a,f5.1,a)')"  Square = (", s%get_x(), ",", s%get_y(), " )"

  ! ----- Call some methods -----

  write(STDOUT,*)"Here are some properties of the shapes:"
  call print_shape(c)
  call print_shape(s)

  ! ----- Delete everything -----

  ! Note: this invokes the virtual destructor
  call c%release()
  call s%release()

  n_shapes = c%get_nshapes()
  write(STDOUT,*) n_shapes, "shapes remain"
  if (n_shapes /= 0) then
    write(STDOUT,*) "Shapes were not freed properly!"
    stop 1
  endif

  write(STDOUT,*) "Goodbye"
end subroutine

subroutine print_shape(s)
  use example, only : Shape
  use iso_c_binding
  implicit none
  class(Shape), intent(in) :: s

  write(STDOUT,*)"    area      = ",s%area()
  write(STDOUT,*)"    perimeter = ",s%perimeter()
end subroutine

end program