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
|
module template_vector_m
implicit none
private
public :: vector_t
template vector_t(T)
type, deferred :: T
public :: Vector
type :: Vector
type(T), allocatable :: elements(:)
integer :: sz = 0
contains
procedure :: resize
procedure :: push_back
end type
contains
subroutine push_back(this, item)
class(Vector), intent(in) :: this
type(T), intent(in) :: item
integer :: new_size
new_size = this%sz + 1
call this%resize(new_size)
this%elements(new_size) = item
this%sz = new_size
end subroutine
subroutine resize(this, n)
class(Vector), intent(inout) :: this
integer, intent(in) :: n
type(T), allocatable :: tmp(:)
integer :: i
if (.not. allocated(this%elements)) then
allocate(this%elements(n))
return
end if
if (this%sz >= n) return
allocate(tmp(this%sz))
do i = 1, this%sz
tmp(i) = this%elements(i)
end do
allocate(this%elements(n))
this%elements(1:this%sz) = tmp
end subroutine
end template
contains
subroutine main()
instantiate vector_t(integer), only: IntVector => Vector
class(IntVector) :: v
integer :: i
v = IntVector()
! call v%push_back(v, 1)
end subroutine
end module
program template_vector
use template_vector_m
implicit none
call main()
end program
|