Skip to content

Commit 08bb2a0

Browse files
committed
feat(sring_t): add get_json_real_array function
1 parent 04fed91 commit 08bb2a0

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

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: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,30 @@
205205

206206
end procedure
207207

208+
module procedure get_json_real_array
209+
character(len=:), allocatable :: raw_line
210+
real, allocatable :: real_array(:)
211+
integer i
212+
213+
call assert(key==self%get_json_key(), "string_s(get_json_real_array): key==self%get_json_key()", key)
214+
215+
raw_line = self%string()
216+
associate(colon => index(raw_line, ":"))
217+
associate(opening_bracket => colon + index(raw_line(colon+1:), "["))
218+
associate(closing_bracket => opening_bracket + index(raw_line(opening_bracket+1:), "]"))
219+
associate(commas => count("," == [(raw_line(i:i), i=opening_bracket+1,closing_bracket-1)]))
220+
associate(num_inputs => commas + 1)
221+
allocate(real_array(num_inputs))
222+
read(raw_line(opening_bracket+1:closing_bracket-1), fmt=*) real_array
223+
value_ = real_array
224+
end associate
225+
end associate
226+
end associate
227+
end associate
228+
end associate
229+
230+
end procedure
231+
208232
module procedure string_t_eq_string_t
209233
lhs_eq_rhs = lhs%string() == rhs%string()
210234
end procedure

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)