Skip to content

Commit e8660b4

Browse files
authored
Merge pull request #75 from sourceryinstitute/get-json-real-array
Add string_t get_json_real_array type-bound procedure
2 parents 17890a6 + 22c6c10 commit e8660b4

File tree

4 files changed

+42
-8
lines changed

4 files changed

+42
-8
lines changed

fpm.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
name = "sourcery"
2-
version = "4.4.4"
2+
version = "4.6.1"
33
license = "BSD"
44
author = ["Damian Rouson"]
5-
maintainer = "damian@archaeologic.codes"
6-
copyright = "2020-2023 Sourcery Institute"
5+
maintainer = "damian@sourceryinstitute.org"
6+
copyright = "2020-2024 Sourcery Institute"
77

88
[dependencies]
99
assert = {git = "https://github.com/sourceryinstitute/assert", tag = "1.6.0"}

src/sourcery/sourcery_string_m.f90

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ module sourcery_string_m
2121
generic :: operator(/=) => string_t_ne_string_t, string_t_ne_character, character_ne_string_t
2222
generic :: operator(==) => string_t_eq_string_t, string_t_eq_character, character_eq_string_t
2323
generic :: assignment(= ) => assign_string_t_to_character, assign_character_to_string_t
24-
generic :: get_json_value => get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real
25-
procedure, private :: get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real
24+
generic :: get_json_value => get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real, &
25+
get_json_real_array
26+
procedure, private :: get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real, &
27+
get_json_real_array
2628
procedure, private :: string_t_ne_string_t, string_t_ne_character
2729
procedure, private :: string_t_eq_string_t, string_t_eq_character
2830
procedure, private :: assign_character_to_string_t
@@ -102,7 +104,7 @@ pure module function base_name(self) result(base)
102104
type(string_t) base
103105
end function
104106

105-
elemental module function get_json_real(self, key, mold) result(value_)
107+
pure module function get_json_real(self, key, mold) result(value_)
106108
implicit none
107109
class(string_t), intent(in) :: self, key
108110
real, intent(in) :: mold
@@ -136,6 +138,13 @@ pure module function get_json_integer_array(self, key, mold) result(value_)
136138
integer, allocatable :: value_(:)
137139
end function
138140

141+
pure module function get_json_real_array(self, key, mold) result(value_)
142+
implicit none
143+
class(string_t), intent(in) :: self, key
144+
real, intent(in) :: mold(:)
145+
real, allocatable :: value_(:)
146+
end function
147+
139148
elemental module function string_t_eq_string_t(lhs, rhs) result(lhs_eq_rhs)
140149
implicit none
141150
class(string_t), intent(in) :: lhs, rhs

src/sourcery/sourcery_string_s.f90

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,15 @@
182182
end procedure
183183

184184
module procedure get_json_integer_array
185+
value_ = int(self%get_json_real_array(key,mold=[0.]))
186+
end procedure
187+
188+
module procedure get_json_real_array
185189
character(len=:), allocatable :: raw_line
186190
real, allocatable :: real_array(:)
187191
integer i
188192

189-
call assert(key==self%get_json_key(), "string_s(get_json_integer_array): key==self%get_json_key()", key)
193+
call assert(key==self%get_json_key(), "string_s(get_json_{real,integer}_array): key==self%get_json_key()", key)
190194

191195
raw_line = self%string()
192196
associate(colon => index(raw_line, ":"))
@@ -196,7 +200,7 @@
196200
associate(num_inputs => commas + 1)
197201
allocate(real_array(num_inputs))
198202
read(raw_line(opening_bracket+1:closing_bracket-1), fmt=*) real_array
199-
value_ = int(real_array)
203+
value_ = real_array
200204
end associate
201205
end associate
202206
end associate

test/string_test.F90

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ function results() result(test_results)
3636
test_result_t("extracting a string value from a colon-separated key/value pair", extracts_string_value()), &
3737
test_result_t("extracting a logical value from a colon-separated key/value pair", extracts_logical_value()), &
3838
test_result_t("extracting an integer array value from a colon-separated key/value pair", extracts_integer_array_value()), &
39+
test_result_t("extracting an real array value from a colon-separated key/value pair", extracts_real_array_value()), &
3940
test_result_t("extracting an integer value from a colon-separated key/value pair", extracts_integer_value()), &
4041
test_result_t('extracting a file base name', extracts_file_base_name()), &
4142
test_result_t('extracting a file name extension', extracts_file_name_extension()) &
@@ -171,6 +172,26 @@ function extracts_integer_array_value() result(passed)
171172
#endif
172173
end function
173174

175+
function extracts_real_array_value() result(passed)
176+
logical passed
177+
178+
#ifndef _CRAYFTN
179+
associate(key_real_array_pair => string_t('"a key" : [1., 2., 4.],'))
180+
associate(real_array => key_real_array_pair%get_json_value(key=string_t("a key"), mold=[real::]))
181+
passed = all(real_array == [1., 2., 4.])
182+
end associate
183+
end associate
184+
#else
185+
block
186+
type(string_t) key_real_array_pair
187+
real, allocatable :: real_array(:)
188+
key_real_array_pair = string_t('"a key" : [1., 2., 4.],')
189+
real_array = key_real_array_pair%get_json_value(key=string_t("a key"), mold=[real::])
190+
passed = all(real_array == [1., 2., 4.])
191+
end block
192+
#endif
193+
end function
194+
174195
function supports_equivalence_operator() result(passed)
175196
logical passed
176197
passed = &

0 commit comments

Comments
 (0)