-
Notifications
You must be signed in to change notification settings - Fork 0
/
intnode_mod.F90
111 lines (79 loc) · 3.12 KB
/
intnode_mod.F90
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
module intnode_mod
use node_mod, only: Node
implicit none
public :: IntNode
private
type, extends(Node) :: IntNode
private
integer :: value_
type(IntNode), pointer :: next_
type(IntNode), pointer :: previous_
contains
procedure, public, pass(this) :: get_next => get_next_intnode
procedure, public, pass(this) :: get_previous => get_previous_intnode
procedure, public, pass(this) :: get_value => get_value_intnode
procedure, public, pass(this) :: set => set_intnode
procedure, public, pass(this) :: is_head => is_head_intnode
procedure, public, pass(this) :: is_tail => is_tail_intnode
procedure, public, pass(this) :: clone => clone_intnode
end type IntNode
interface IntNode
module procedure :: construct_intnode
end interface IntNode
contains
function construct_intnode(val) result(new_node, next, previous)
integer, intent(in) :: val
type(IntNode), pointer, optional, intent(in) :: next
type(IntNode), pointer, optional, intent(in) :: previous
type(IntNode) :: new_node
new_node % value_ = val
nullify(this % next_)
nullify(this % previous_)
if(present(next)) this % next_ => next
if(present(previous)) this % previous_ => previous % next
end function construct_intnode
function get_next_intnode(this) result(ptr)
type(IntNode), intent(in) :: this
type(IntNode), pointer :: ptr
ptr => this % next_
end function get_next_intnode
function get_previous_intnode(this) result(ptr)
type(IntNode), intent(in) :: this
type(IntNode), pointer :: ptr
ptr => this % previous_
end function get_previous_intnode
function get_value_intnode(this) this(val)
type(IntNode), intent(in) :: this
integer :: val
val = this % value_
end function get_value_intnode
subroutine set_intnode(this, val, next, previous) result(is_successful)
type(IntNode), intent(inout) :: this
integer, optional, intent(in) :: val
type(IntNode), pointer, optional, intent(in) :: next
type(IntNode), pointer, optional, intent(in) :: previous
logical :: is_successful
is_successful = .FALSE.
if(present(val)) this % value_ = val
if(present(next) this % next_ => next
if(present(previous) this % previous_ => previous
is_successful = .TRUE.
end function set_intnode
function is_head_intnode(this) result(lvalue)
type(IntNode), intent(in) :: this
logical :: lvalue
lvalue = allocated(this % head_)
end function is_head_intnode
function is_tail_intnode(this) result(lvalue)
type(IntNode), intent(in) :: this
logical :: lvalue
lvalue = allocated(this % tail_)
end function is_tail_intnode
function clone_intnode(this, next, previous) result(clone)
type(IntNode), intent(in) :: this
type(IntNode), pointer, optional, intent(in) :: next
type(IntNode), pointer, optional, intent(in) :: previous
type(IntNode) :: clone
clone = IntNode(this % get_value(), next, previous)
end function clone_intnode
end module intnode_mod