Skip to content

Commit c932dfd

Browse files
authored
Merge pull request #58 from sourceryinstitute/defined-assignments
feat(string_t): defined assign to/from character
2 parents d6c3536 + 13ed250 commit c932dfd

File tree

3 files changed

+50
-9
lines changed

3 files changed

+50
-9
lines changed

src/sourcery/sourcery_string_m.f90

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,17 @@ module sourcery_string_m
1414
generic :: string => as_character
1515
procedure :: is_allocated
1616
procedure :: get_json_key
17-
generic :: operator(/=) => string_t_ne_string_t, string_t_ne_character, character_ne_string_t
18-
generic :: operator(==) => string_t_eq_string_t, string_t_eq_character, character_eq_string_t
19-
generic :: get_json_value => &
20-
get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real
21-
procedure, private :: &
22-
get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real
23-
procedure, private :: string_t_ne_string_t, string_t_ne_character
17+
generic :: operator(/=) => string_t_ne_string_t, string_t_ne_character, character_ne_string_t
18+
generic :: operator(==) => string_t_eq_string_t, string_t_eq_character, character_eq_string_t
19+
generic :: assignment(= ) => assign_string_t_to_character, assign_character_to_string_t
20+
generic :: get_json_value => get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real
21+
procedure, private :: get_json_integer_array, get_json_logical, get_json_integer, get_json_string, get_json_real
22+
procedure, private :: string_t_ne_string_t, string_t_ne_character
23+
procedure, private :: string_t_eq_string_t, string_t_eq_character
24+
procedure, private :: assign_character_to_string_t
2425
procedure, private, pass(rhs) :: character_ne_string_t
25-
procedure, private :: string_t_eq_string_t, string_t_eq_character
2626
procedure, private, pass(rhs) :: character_eq_string_t
27+
procedure, private, pass(rhs) :: assign_string_t_to_character
2728
end type
2829

2930
interface string_t
@@ -136,6 +137,18 @@ elemental module function character_ne_string_t(lhs, rhs) result(lhs_ne_rhs)
136137
logical lhs_ne_rhs
137138
end function
138139

140+
pure module subroutine assign_character_to_string_t(lhs, rhs)
141+
implicit none
142+
class(string_t), intent(inout) :: lhs
143+
character(len=*), intent(in) :: rhs
144+
end subroutine
145+
146+
pure module subroutine assign_string_t_to_character(lhs, rhs)
147+
implicit none
148+
class(string_t), intent(in) :: rhs
149+
character(len=:), intent(out), allocatable :: lhs
150+
end subroutine
151+
139152
end interface
140153

141154
end module sourcery_string_m

src/sourcery/sourcery_string_s.f90

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,12 @@
179179
lhs_ne_rhs = lhs /= rhs%string()
180180
end procedure
181181

182+
module procedure assign_string_t_to_character
183+
lhs = rhs%string()
184+
end procedure
185+
186+
module procedure assign_character_to_string_t
187+
lhs%string_ = rhs
188+
end procedure
189+
182190
end submodule sourcery_string_s

test/string_test.f90

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ function results() result(test_results)
3131
test_result_t("extracting an integer array value from a colon-separated key/value pair", extracts_integer_array_value()), &
3232
test_result_t("extracting an integer value from a colon-separated key/value pair", extracts_integer_value()), &
3333
test_result_t('supporting operator(==) for string_t and character operands', supports_equivalence_operator()), &
34-
test_result_t('supporting operator(/=) for string_t and character operands', supports_non_equivalence_operator()) &
34+
test_result_t('supporting operator(/=) for string_t and character operands', supports_non_equivalence_operator()), &
35+
test_result_t('assigning a string_t object to a character variable', assigns_string_t_to_character()), &
36+
test_result_t('assigning a character variable to a string_t object', assigns_character_to_string_t()) &
3537
]
3638
end function
3739

@@ -121,4 +123,22 @@ function supports_non_equivalence_operator() result(passed)
121123
"123.456" /= string_t("456.123")
122124
end function
123125

126+
function assigns_string_t_to_character() result(passed)
127+
logical passed
128+
character(len=:), allocatable :: lhs
129+
130+
associate(rhs => string_t("ya don't say"))
131+
lhs = rhs
132+
passed = lhs == rhs
133+
end associate
134+
end function
135+
136+
function assigns_character_to_string_t() result(passed)
137+
logical passed
138+
character(len=*), parameter :: rhs = "well, alrighty then"
139+
type(string_t) lhs
140+
lhs = rhs
141+
passed = lhs == rhs
142+
end function
143+
124144
end module string_test_m

0 commit comments

Comments
 (0)