File: template_vector.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 (74 lines) | stat: -rw-r--r-- 1,673 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
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