Skip to content

Commit

Permalink
Re-ordered topics to better support feature dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
cgeroux committed Apr 29, 2022
1 parent 130a203 commit f202a02
Show file tree
Hide file tree
Showing 12 changed files with 462 additions and 53 deletions.
3 changes: 2 additions & 1 deletion _config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,8 +117,9 @@ episode_order:
- introduction
- modules
- derived_types
- extending_types
- interfaces
- type_bound_procedures
- destructors
- type_extension
# - polymorphism

58 changes: 42 additions & 16 deletions _episodes/destructors.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ module m_vector
contains
procedure:: display
final:: destructor
final:: destructor_vector
end type
Expand All @@ -31,13 +31,33 @@ module m_vector
procedure:: create_sized_vector
end interface
type,extends(t_vector):: t_vector_3
contains
final:: destructor_vector_3
end type
interface t_vector_3
procedure:: create_size_3_vector
end interface
contains
subroutine destructor(self)
subroutine destructor_vector(self)
implicit none
type(t_vector):: self
print*, "t_vector destruction called"
if (allocated(self%elements)) then
deallocate(self%elements)
endif
end subroutine
subroutine destructor_vector_3(self)
implicit none
type(t_vector_3):: self
if (allocated(self%elements)) then
deallocate(self%elements)
endif
Expand All @@ -48,9 +68,14 @@ module m_vector
class(t_vector),intent(in):: vec
integer:: i
print*, "t_vector:"
print*, " num_elements=",vec%num_elements
print*, " elements="
select type (vec)
class is (t_vector)
print*, "t_vector:"
class is (t_vector_3)
print*, "t_vector_3:"
end select
print*, " num_elements=",vec%num_elements
print*, " elements="
do i=1,vec%num_elements
print*, " ",vec%elements(i)
end do
Expand All @@ -68,20 +93,19 @@ module m_vector
allocate(create_sized_vector%elements(vec_size))
end function
end module
subroutine make_vector_in_different_scope()
use m_vector
type(t_vector) test
type(t_vector_3) function create_size_3_vector()
implicit none
create_size_3_vector%num_elements=3
allocate(create_size_3_vector%elements(3))
end function
test=t_vector(4)
end subroutine
end module
program main
use m_vector
implicit none
integer:: temp
type(t_vector) numbers_none,numbers_some
type(t_vector_3) location
numbers_none=t_vector()
call numbers_none%display()
Expand All @@ -90,12 +114,14 @@ program main
numbers_some%elements(1)=2
call numbers_some%display()
call make_vector_in_different_scope()
location=t_vector_3()
location%elements(1)=1.0
call location%display()
end program
~~~
{: .fortran}
[destructors.f90](https://github.com/acenet-arc/fortran_oop_as_a_second_language/blob/gh-pages/code/destructors.f90)
[destructor.f90](https://github.com/acenet-arc/fortran_oop_as_a_second_language/blob/gh-pages/code/destructor.f90)
</div>

{% include links.md %}
Expand Down
72 changes: 72 additions & 0 deletions _episodes/extending_types.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
---
title: "Extended Types"
teaching: 10
exercises: 0
questions:
- "How do you extend a type?"
objectives:
- "Create an extend a type."
keypoints:
- "Type extension allows you to build upon an existing derived type to create a new derived type."
---

<div class="gitfile" markdown="1">
~~~
module m_vector
implicit none
type t_vector
integer:: num_elements
real,dimension(:),allocatable:: elements
end type
type,extends(t_vector):: t_vector_3
end type
contains
type(t_vector) function create_empty_vector()
implicit none
create_empty_vector%num_elements=0
end function
type(t_vector) function create_sized_vector(vec_size)
implicit none
integer,intent(in):: vec_size
create_sized_vector%num_elements=vec_size
allocate(create_sized_vector%elements(vec_size))
end function
type(t_vector_3) function create_size_3_vector()
implicit none
create_size_3_vector%num_elements=3
allocate(create_size_3_vector%elements(3))
end function
end module
program main
use m_vector
implicit none
type(t_vector) numbers_none,numbers_some
type(t_vector_3) location
numbers_none=create_empty_vector()
print*, "numbers_none%num_elements=",numbers_none%num_elements
numbers_some=create_sized_vector(4)
numbers_some%elements(1)=2
print*, "numbers_some%num_elements=",numbers_some%num_elements
print*, "numbers_some%elements(1)=",numbers_some%elements(1)
location=create_size_3_vector()
location%elements(1)=1.0
print*, "location%elements(1)=",location%elements(1)
end program
~~~
{: .fortran}
[type_extension.f90](https://github.com/acenet-arc/fortran_oop_as_a_second_language/blob/gh-pages/code/type_extension.f90)
</div>

{% include links.md %}
22 changes: 20 additions & 2 deletions _episodes/interfaces.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,13 @@ module m_vector
procedure:: create_sized_vector
end interface
type,extends(t_vector):: t_vector_3
end type
interface t_vector_3
procedure:: create_size_3_vector
end interface
contains
type(t_vector) function create_empty_vector()
Expand All @@ -40,12 +47,19 @@ module m_vector
allocate(create_sized_vector%elements(vec_size))
end function
type(t_vector_3) function create_size_3_vector()
implicit none
create_size_3_vector%num_elements=3
allocate(create_size_3_vector%elements(3))
end function
end module
program main
use m_vector
implicit none
type(t_vector) numbers_none,numbers_some
type(t_vector_3) location
numbers_none=t_vector()
print*, "numbers_none%num_elements=",numbers_none%num_elements
Expand All @@ -55,15 +69,19 @@ program main
print*, "numbers_some%num_elements=",numbers_some%num_elements
print*, "numbers_some%elements(1)=",numbers_some%elements(1)
location=t_vector_3()
location%elements(1)=1.0
print*, "location%elements(1)=",location%elements(1)
end program
~~~
{: .fortran}
[intefrace_blocks.f90](https://github.com/acenet-arc/fortran_oop_as_a_second_language/blob/gh-pages/code/intefrace_blocks.f90)
[interface_blocks.f90](https://github.com/acenet-arc/fortran_oop_as_a_second_language/blob/gh-pages/code/interface_blocks.f90)
</div>

This example uses what is called a generic interface which allows you to map a number of procedures to one name. The specific procedure is chosen based on the supplied arguments. Therefore each procedure included in the generic interface must be distinguishable by it number and type of arguments.

The way this interface has been used to create a new object of a given derived type is pattern often reffered to as a constructor in object oriented programming languages.
When the interface has been given a name that matches a type name it used to create it is commonly called a constructor, which is used to initialize the newly created object.

{% include links.md %}

2 changes: 1 addition & 1 deletion _episodes/introduction.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ objectives:
keypoints:
- "First key point. Brief Answer to questions. (FIXME)"
---
FIXME
A cool intro some more cool stuff

{% include links.md %}

Loading

0 comments on commit f202a02

Please sign in to comment.