unique Function

private elemental function unique(self, substring) result(uniq)

Type Bound

string

Arguments

Type IntentOptional Attributes Name
class(string), intent(in) :: self
character(kind=CK, len=*), intent(in), optional :: substring

Return Value type(string)


Calls

proc~~unique~~CallsGraph proc~unique string%unique proc~replace string%replace proc~unique->proc~replace proc~replace_one_occurrence string%replace_one_occurrence proc~replace->proc~replace_one_occurrence

Called by

proc~~unique~~CalledByGraph proc~unique string%unique proc~split string%split proc~split->proc~unique program~volatile_doctest~1193 volatile_doctest program~volatile_doctest~1193->proc~unique program~volatile_doctest~252 volatile_doctest program~volatile_doctest~252->proc~unique proc~camelcase string%camelcase proc~camelcase->proc~split proc~glob_string string%glob_string proc~glob_string->proc~split proc~snakecase string%snakecase proc~snakecase->proc~split proc~split_chunked string%split_chunked proc~split_chunked->proc~split proc~startcase string%startcase proc~startcase->proc~split proc~write_lines string%write_lines proc~write_lines->proc~split proc~write_parallel_block_files_string xml_writer_abstract%write_parallel_block_files_string proc~write_parallel_block_files_string->proc~split program~stringifor_test_csv_naive_parser stringifor_test_csv_naive_parser program~stringifor_test_csv_naive_parser->proc~split program~stringifor_test_csv_naive_parser~2 stringifor_test_csv_naive_parser program~stringifor_test_csv_naive_parser~2->proc~split program~stringifor_test_parse_large_csv stringifor_test_parse_large_csv program~stringifor_test_parse_large_csv->proc~split program~stringifor_test_parse_large_csv->proc~split_chunked program~stringifor_test_parse_large_csv~2 stringifor_test_parse_large_csv program~stringifor_test_parse_large_csv~2->proc~split program~stringifor_test_parse_large_csv~2->proc~split_chunked program~volatile_doctest~1107 volatile_doctest program~volatile_doctest~1107->proc~split proc~write_file string%write_file program~volatile_doctest~1107->proc~write_file program~volatile_doctest~1125 volatile_doctest program~volatile_doctest~1125->proc~split program~volatile_doctest~1125->proc~write_file program~volatile_doctest~1163 volatile_doctest program~volatile_doctest~1163->proc~split program~volatile_doctest~26 volatile_doctest program~volatile_doctest~26->proc~split program~volatile_doctest~353 volatile_doctest program~volatile_doctest~353->proc~split program~volatile_doctest~444 volatile_doctest program~volatile_doctest~444->proc~split program~volatile_doctest~664 volatile_doctest program~volatile_doctest~664->proc~split program~volatile_doctest~683 volatile_doctest program~volatile_doctest~683->proc~split program~volatile_doctest~729 volatile_doctest program~volatile_doctest~729->proc~split program~volatile_doctest~964 volatile_doctest program~volatile_doctest~964->proc~split interface~glob glob interface~glob->proc~glob_string proc~glob_character string%glob_character interface~glob->proc~glob_character none~glob string%glob none~glob->proc~glob_string none~glob->proc~glob_character none~write_parallel_block_files xml_writer_abstract%write_parallel_block_files none~write_parallel_block_files->proc~write_parallel_block_files_string proc~write_file->proc~write_lines program~volatile_doctest~1054 volatile_doctest program~volatile_doctest~1054->proc~camelcase program~volatile_doctest~1080 volatile_doctest program~volatile_doctest~1080->proc~split_chunked program~volatile_doctest~1242 volatile_doctest program~volatile_doctest~1242->proc~startcase program~volatile_doctest~437 volatile_doctest program~volatile_doctest~437->proc~snakecase program~volatile_doctest~551 volatile_doctest program~volatile_doctest~551->proc~split_chunked program~volatile_doctest~556 volatile_doctest program~volatile_doctest~556->proc~startcase program~volatile_doctest~560 volatile_doctest program~volatile_doctest~560->proc~camelcase program~volatile_doctest~87 volatile_doctest program~volatile_doctest~87->proc~snakecase proc~glob_character->none~glob proc~parse_scratch_files vtm_file%parse_scratch_files proc~parse_scratch_files->none~write_parallel_block_files none~write_block vtm_file%write_block proc~parse_scratch_files->none~write_block proc~write_block_array vtm_file%write_block_array proc~write_block_array->none~write_parallel_block_files proc~write_block_string vtm_file%write_block_string proc~write_block_string->none~write_parallel_block_files program~volatile_doctest~1058 volatile_doctest program~volatile_doctest~1058->none~glob program~volatile_doctest~334 volatile_doctest program~volatile_doctest~334->none~glob program~volatile_doctest~426 volatile_doctest program~volatile_doctest~426->none~glob program~volatile_doctest~468 volatile_doctest program~volatile_doctest~468->interface~glob program~volatile_doctest~498 volatile_doctest program~volatile_doctest~498->interface~glob program~volatile_doctest~511 volatile_doctest program~volatile_doctest~511->none~glob none~write_block->proc~write_block_array none~write_block->proc~write_block_string proc~finalize~5 vtm_file%finalize proc~finalize~5->proc~parse_scratch_files proc~initialize~4 vtm_file%initialize proc~initialize~4->proc~finalize~5 program~vtk_fortran_write_vtm vtk_fortran_write_vtm program~vtk_fortran_write_vtm->none~write_block

Source Code

   elemental function unique(self, substring) result(uniq)
   !< Reduce to one (unique) multiple (sequential) occurrences of a substring into a string.
   !<
   !< For example the string ' ab-cre-cre-ab' is reduce to 'ab-cre-ab' if the substring is '-cre'.
   !< @note Eventual multiple trailing white space are not reduced to one occurrence.
   !<
   !<```fortran
   !< type(string) :: astring
   !< logical      :: test_passed(1)
   !< astring = '+++ab-++cre-++cre-ab+++++'
   !< test_passed(1) = astring%unique(substring='+')//''=='+ab-+cre-+cre-ab+'
   !< print '(L1)', all(test_passed)
   !<```
   !=> T <<<
   class(string),             intent(in)           :: self       !< The string.
   character(kind=CK, len=*), intent(in), optional :: substring  !< Substring which multiple occurences must be reduced to one.
   character(kind=CK, len=:), allocatable          :: substring_ !< Substring, default value.
   type(string)                                    :: uniq       !< String parsed.
#ifdef _NVF
   character(9999)                                 :: nvf_bug  !< Work around for NVFortran bug.
#endif

   if (allocated(self%raw)) then
     substring_ = SPACE ; if (present(substring)) substring_ = substring

     uniq = self
     do
#ifdef _NVF
       nvf_bug = substring_
       if (.not.uniq%index(repeat(trim(nvf_bug), 2))>0) exit
       uniq = uniq%replace(old=repeat(trim(nvf_bug), 2), new=substring_)
#else
       if (.not.uniq%index(repeat(substring_, 2))>0) exit
       uniq = uniq%replace(old=repeat(substring_, 2), new=substring_)
#endif
     enddo
   endif
   endfunction unique