Skip to content

Commit d335111

Browse files
authored
Merge pull request #64 from sourceryinstitute/string_t-concatenation
feat(string_t): support concatenation operator(//)
2 parents 00d4fee + 46c17ef commit d335111

File tree

3 files changed

+46
-1
lines changed

3 files changed

+46
-1
lines changed

src/sourcery/sourcery_string_m.f90

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module sourcery_string_m
1414
generic :: string => as_character
1515
procedure :: is_allocated
1616
procedure :: get_json_key
17+
generic :: operator(//) => string_t_cat_string_t, string_t_cat_character, character_cat_string_t
1718
generic :: operator(/=) => string_t_ne_string_t, string_t_ne_character, character_ne_string_t
1819
generic :: operator(==) => string_t_eq_string_t, string_t_eq_character, character_eq_string_t
1920
generic :: assignment(= ) => assign_string_t_to_character, assign_character_to_string_t
@@ -22,6 +23,8 @@ module sourcery_string_m
2223
procedure, private :: string_t_ne_string_t, string_t_ne_character
2324
procedure, private :: string_t_eq_string_t, string_t_eq_character
2425
procedure, private :: assign_character_to_string_t
26+
procedure, private :: string_t_cat_string_t, string_t_cat_character
27+
procedure, private, pass(rhs) :: character_cat_string_t
2528
procedure, private, pass(rhs) :: character_ne_string_t
2629
procedure, private, pass(rhs) :: character_eq_string_t
2730
procedure, private, pass(rhs) :: assign_string_t_to_character
@@ -137,6 +140,26 @@ elemental module function character_ne_string_t(lhs, rhs) result(lhs_ne_rhs)
137140
logical lhs_ne_rhs
138141
end function
139142

143+
pure module function string_t_cat_string_t(lhs, rhs) result(lhs_cat_rhs)
144+
implicit none
145+
class(string_t), intent(in) :: lhs, rhs
146+
type(string_t) lhs_cat_rhs
147+
end function
148+
149+
pure module function string_t_cat_character(lhs, rhs) result(lhs_cat_rhs)
150+
implicit none
151+
class(string_t), intent(in) :: lhs
152+
character(len=*), intent(in) :: rhs
153+
type(string_t) lhs_cat_rhs
154+
end function
155+
156+
pure module function character_cat_string_t(lhs, rhs) result(lhs_cat_rhs)
157+
implicit none
158+
character(len=*), intent(in) :: lhs
159+
class(string_t), intent(in) :: rhs
160+
type(string_t) lhs_cat_rhs
161+
end function
162+
140163
pure module subroutine assign_character_to_string_t(lhs, rhs)
141164
implicit none
142165
class(string_t), intent(inout) :: lhs

src/sourcery/sourcery_string_s.f90

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,5 +186,17 @@
186186
module procedure assign_character_to_string_t
187187
lhs%string_ = rhs
188188
end procedure
189+
190+
module procedure string_t_cat_string_t
191+
lhs_cat_rhs = string_t(lhs%string_ // rhs%string_)
192+
end procedure
193+
194+
module procedure string_t_cat_character
195+
lhs_cat_rhs = string_t(lhs%string_ // rhs)
196+
end procedure
197+
198+
module procedure character_cat_string_t
199+
lhs_cat_rhs = string_t(lhs // rhs%string_)
200+
end procedure
189201

190202
end submodule sourcery_string_s

test/string_test.f90

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ function results() result(test_results)
3333
test_result_t('supporting operator(==) for string_t and character operands', supports_equivalence_operator()), &
3434
test_result_t('supporting operator(/=) for string_t and character operands', supports_non_equivalence_operator()), &
3535
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()) &
36+
test_result_t('assigning a character variable to a string_t object', assigns_character_to_string_t()), &
37+
test_result_t('supporting operator(//) for string_t and character operands', supports_concatenation_operator()) &
3738
]
3839
end function
3940

@@ -141,4 +142,13 @@ function assigns_character_to_string_t() result(passed)
141142
passed = lhs == rhs
142143
end function
143144

145+
function supports_concatenation_operator() result(passed)
146+
logical passed
147+
character(len=*), parameter :: prefix = "foo", postfix="bar"
148+
149+
associate(infix => string_t(" yada yada "))
150+
passed = prefix // infix // postfix == prefix // infix%string() // postfix
151+
end associate
152+
end function
153+
144154
end module string_test_m

0 commit comments

Comments
 (0)