File: template_vector.f90

package info (click to toggle)
lfortran 0.59.0-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 56,736 kB
  • sloc: cpp: 168,052; f90: 74,272; python: 17,537; ansic: 7,705; yacc: 2,345; sh: 1,334; fortran: 895; makefile: 37; javascript: 15
file content (73 lines) | stat: -rw-r--r-- 1,674 bytes parent folder | download | duplicates (3)
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
module template_vector_m
    implicit none
    private
    public :: vector_t, main

    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
        type(IntVector) :: v
        call v%push_back(10)
        if (v%elements(1) /= 10) error stop
    end subroutine

end module

program template_vector
    use template_vector_m
    implicit none
    call main()
end program