Skip to content

Commit 1926ade

Browse files
authored
Merge pull request #96 from nshaffer/dev-optval
Make optval pure or pure elemental where possible
2 parents 7a6108e + f857482 commit 1926ade

File tree

2 files changed

+147
-26
lines changed

2 files changed

+147
-26
lines changed

src/stdlib_experimental_optval.f90

+8-8
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ module stdlib_experimental_optval
3434
contains
3535

3636

37-
pure function optval_sp(x, default) result(y)
37+
pure elemental function optval_sp(x, default) result(y)
3838
real(sp), intent(in), optional :: x
3939
real(sp), intent(in) :: default
4040
real(sp) :: y
@@ -47,7 +47,7 @@ pure function optval_sp(x, default) result(y)
4747
end function optval_sp
4848

4949

50-
pure function optval_dp(x, default) result(y)
50+
pure elemental function optval_dp(x, default) result(y)
5151
real(dp), intent(in), optional :: x
5252
real(dp), intent(in) :: default
5353
real(dp) :: y
@@ -60,7 +60,7 @@ pure function optval_dp(x, default) result(y)
6060
end function optval_dp
6161

6262

63-
pure function optval_qp(x, default) result(y)
63+
pure elemental function optval_qp(x, default) result(y)
6464
real(qp), intent(in), optional :: x
6565
real(qp), intent(in) :: default
6666
real(qp) :: y
@@ -73,7 +73,7 @@ pure function optval_qp(x, default) result(y)
7373
end function optval_qp
7474

7575

76-
pure function optval_int8(x, default) result(y)
76+
pure elemental function optval_int8(x, default) result(y)
7777
integer(int8), intent(in), optional :: x
7878
integer(int8), intent(in) :: default
7979
integer(int8) :: y
@@ -86,7 +86,7 @@ pure function optval_int8(x, default) result(y)
8686
end function optval_int8
8787

8888

89-
pure function optval_int16(x, default) result(y)
89+
pure elemental function optval_int16(x, default) result(y)
9090
integer(int16), intent(in), optional :: x
9191
integer(int16), intent(in) :: default
9292
integer(int16) :: y
@@ -99,7 +99,7 @@ pure function optval_int16(x, default) result(y)
9999
end function optval_int16
100100

101101

102-
pure function optval_int32(x, default) result(y)
102+
pure elemental function optval_int32(x, default) result(y)
103103
integer(int32), intent(in), optional :: x
104104
integer(int32), intent(in) :: default
105105
integer(int32) :: y
@@ -112,7 +112,7 @@ pure function optval_int32(x, default) result(y)
112112
end function optval_int32
113113

114114

115-
pure function optval_int64(x, default) result(y)
115+
pure elemental function optval_int64(x, default) result(y)
116116
integer(int64), intent(in), optional :: x
117117
integer(int64), intent(in) :: default
118118
integer(int64) :: y
@@ -125,7 +125,7 @@ pure function optval_int64(x, default) result(y)
125125
end function optval_int64
126126

127127

128-
pure function optval_logical(x, default) result(y)
128+
pure elemental function optval_logical(x, default) result(y)
129129
logical, intent(in), optional :: x
130130
logical, intent(in) :: default
131131
logical :: y

src/tests/optval/test_optval.f90

+139-18
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,25 @@ program test_optval
2020

2121
call test_optval_character
2222

23+
24+
call test_optval_sp_arr
25+
call test_optval_dp_arr
26+
call test_optval_qp_arr
27+
28+
call test_optval_int8_arr
29+
call test_optval_int16_arr
30+
call test_optval_int32_arr
31+
call test_optval_int64_arr
32+
2333
contains
2434

25-
2635
subroutine test_optval_sp
2736
print *, "test_optval_sp"
2837
call assert(foo_sp(1.0_sp) == 1.0_sp)
2938
call assert(foo_sp() == 2.0_sp)
3039
end subroutine test_optval_sp
3140

32-
41+
3342
function foo_sp(x) result(z)
3443
real(sp), intent(in), optional :: x
3544
real(sp) :: z
@@ -43,7 +52,7 @@ subroutine test_optval_dp
4352
call assert(foo_dp() == 2.0_dp)
4453
end subroutine test_optval_dp
4554

46-
55+
4756
function foo_dp(x) result(z)
4857
real(dp), intent(in), optional :: x
4958
real(dp) :: z
@@ -57,95 +66,207 @@ subroutine test_optval_qp
5766
call assert(foo_qp() == 2.0_qp)
5867
end subroutine test_optval_qp
5968

60-
69+
6170
function foo_qp(x) result(z)
6271
real(qp), intent(in), optional :: x
6372
real(qp) :: z
6473
z = optval(x, 2.0_qp)
6574
endfunction foo_qp
66-
67-
75+
76+
6877
subroutine test_optval_int8
6978
print *, "test_optval_int8"
7079
call assert(foo_int8(1_int8) == 1_int8)
7180
call assert(foo_int8() == 2_int8)
7281
end subroutine test_optval_int8
7382

74-
83+
7584
function foo_int8(x) result(z)
7685
integer(int8), intent(in), optional :: x
7786
integer(int8) :: z
7887
z = optval(x, 2_int8)
7988
endfunction foo_int8
80-
89+
8190

8291
subroutine test_optval_int16
8392
print *, "test_optval_int16"
8493
call assert(foo_int16(1_int16) == 1_int16)
8594
call assert(foo_int16() == 2_int16)
8695
end subroutine test_optval_int16
8796

88-
97+
8998
function foo_int16(x) result(z)
9099
integer(int16), intent(in), optional :: x
91100
integer(int16) :: z
92101
z = optval(x, 2_int16)
93102
endfunction foo_int16
94103

95-
104+
96105
subroutine test_optval_int32
97106
print *, "test_optval_int32"
98107
call assert(foo_int32(1_int32) == 1_int32)
99108
call assert(foo_int32() == 2_int32)
100109
end subroutine test_optval_int32
101110

102-
111+
103112
function foo_int32(x) result(z)
104113
integer(int32), intent(in), optional :: x
105114
integer(int32) :: z
106115
z = optval(x, 2_int32)
107116
endfunction foo_int32
108117

109-
118+
110119
subroutine test_optval_int64
111120
print *, "test_optval_int64"
112121
call assert(foo_int64(1_int64) == 1_int64)
113122
call assert(foo_int64() == 2_int64)
114123
end subroutine test_optval_int64
115124

116-
125+
117126
function foo_int64(x) result(z)
118127
integer(int64), intent(in), optional :: x
119128
integer(int64) :: z
120129
z = optval(x, 2_int64)
121130
endfunction foo_int64
122-
131+
123132

124133
subroutine test_optval_logical
125134
print *, "test_optval_logical"
126135
call assert(foo_logical(.true.))
127136
call assert(.not.foo_logical())
128137
end subroutine test_optval_logical
129138

130-
139+
131140
function foo_logical(x) result(z)
132141
logical, intent(in), optional :: x
133142
logical :: z
134143
z = optval(x, .false.)
135144
endfunction foo_logical
136-
145+
137146

138147
subroutine test_optval_character
139148
print *, "test_optval_character"
140149
call assert(foo_character("x") == "x")
141150
call assert(foo_character() == "y")
142151
end subroutine test_optval_character
143152

144-
153+
145154
function foo_character(x) result(z)
146155
character(len=*), intent(in), optional :: x
147156
character(len=:), allocatable :: z
148157
z = optval(x, "y")
149158
endfunction foo_character
150-
159+
160+
161+
subroutine test_optval_sp_arr
162+
print *, "test_optval_sp_arr"
163+
call assert(all(foo_sp_arr([1.0_sp, -1.0_sp]) == [1.0_sp, -1.0_sp]))
164+
call assert(all(foo_sp_arr() == [2.0_sp, -2.0_sp]))
165+
end subroutine test_optval_sp_arr
166+
167+
168+
function foo_sp_arr(x) result(z)
169+
real(sp), dimension(2), intent(in), optional :: x
170+
real(sp), dimension(2) :: z
171+
z = optval(x, [2.0_sp, -2.0_sp])
172+
end function foo_sp_arr
173+
174+
175+
subroutine test_optval_dp_arr
176+
print *, "test_optval_dp_arr"
177+
call assert(all(foo_dp_arr([1.0_dp, -1.0_dp]) == [1.0_dp, -1.0_dp]))
178+
call assert(all(foo_dp_arr() == [2.0_dp, -2.0_dp]))
179+
end subroutine test_optval_dp_arr
180+
181+
182+
function foo_dp_arr(x) result(z)
183+
real(dp), dimension(2), intent(in), optional :: x
184+
real(dp), dimension(2) :: z
185+
z = optval(x, [2.0_dp, -2.0_dp])
186+
end function foo_dp_arr
187+
188+
189+
subroutine test_optval_qp_arr
190+
print *, "test_optval_qp_arr"
191+
call assert(all(foo_qp_arr([1.0_qp, -1.0_qp]) == [1.0_qp, -1.0_qp]))
192+
call assert(all(foo_qp_arr() == [2.0_qp, -2.0_qp]))
193+
end subroutine test_optval_qp_arr
194+
195+
196+
function foo_qp_arr(x) result(z)
197+
real(qp), dimension(2), intent(in), optional :: x
198+
real(qp), dimension(2) :: z
199+
z = optval(x, [2.0_qp, -2.0_qp])
200+
end function foo_qp_arr
201+
202+
203+
subroutine test_optval_int8_arr
204+
print *, "test_optval_int8_arr"
205+
call assert(all(foo_int8_arr([1_int8, -1_int8]) == [1_int8, -1_int8]))
206+
call assert(all(foo_int8_arr() == [2_int8, -2_int8]))
207+
end subroutine test_optval_int8_arr
208+
209+
210+
function foo_int8_arr(x) result(z)
211+
integer(int8), dimension(2), intent(in), optional :: x
212+
integer(int8), dimension(2) :: z
213+
z = optval(x, [2_int8, -2_int8])
214+
end function foo_int8_arr
215+
216+
217+
subroutine test_optval_int16_arr
218+
print *, "test_optval_int16_arr"
219+
call assert(all(foo_int16_arr([1_int16, -1_int16]) == [1_int16, -1_int16]))
220+
call assert(all(foo_int16_arr() == [2_int16, -2_int16]))
221+
end subroutine test_optval_int16_arr
222+
223+
224+
function foo_int16_arr(x) result(z)
225+
integer(int16), dimension(2), intent(in), optional :: x
226+
integer(int16), dimension(2) :: z
227+
z = optval(x, [2_int16, -2_int16])
228+
end function foo_int16_arr
229+
230+
231+
subroutine test_optval_int32_arr
232+
print *, "test_optval_int32_arr"
233+
call assert(all(foo_int32_arr([1_int32, -1_int32]) == [1_int32, -1_int32]))
234+
call assert(all(foo_int32_arr() == [2_int32, -2_int32]))
235+
end subroutine test_optval_int32_arr
236+
237+
238+
function foo_int32_arr(x) result(z)
239+
integer(int32), dimension(2), intent(in), optional :: x
240+
integer(int32), dimension(2) :: z
241+
z = optval(x, [2_int32, -2_int32])
242+
end function foo_int32_arr
243+
244+
245+
subroutine test_optval_int64_arr
246+
print *, "test_optval_int64_arr"
247+
call assert(all(foo_int64_arr([1_int64, -1_int64]) == [1_int64, -1_int64]))
248+
call assert(all(foo_int64_arr() == [2_int64, -2_int64]))
249+
end subroutine test_optval_int64_arr
250+
251+
252+
function foo_int64_arr(x) result(z)
253+
integer(int64), dimension(2), intent(in), optional :: x
254+
integer(int64), dimension(2) :: z
255+
z = optval(x, [2_int64, -2_int64])
256+
end function foo_int64_arr
257+
258+
259+
subroutine test_optval_logical_arr
260+
print *, "test_optval_logical_arr"
261+
call assert(all(foo_logical_arr()))
262+
call assert(all(.not.foo_logical_arr()))
263+
end subroutine test_optval_logical_arr
264+
265+
266+
function foo_logical_arr(x) result(z)
267+
logical, dimension(2), intent(in), optional :: x
268+
logical, dimension(2) :: z
269+
z = optval(x, [.false., .false.])
270+
end function foo_logical_arr
271+
151272
end program test_optval

0 commit comments

Comments
 (0)