elemental function scount(self, substring, ignore_isolated) result(No)
!< Count the number of occurences of a substring into a string.
!<
!< @note If `ignore_isolated` is set to true the eventual "isolated" occurences are ignored: an isolated occurrences are those
!< occurrences happening at the start of string (thus not having a left companion) or at the end of the string (thus not having a
!< right companion).
!<
!<```fortran
!< type(string) :: astring
!< logical :: test_passed(4)
!< astring = ' Hello World ! '
!< test_passed(1) = astring%count(substring=' ')==10
!< astring = 'Hello World ! '
!< test_passed(2) = astring%count(substring=' ', ignore_isolated=.true.)==6
!< astring = ' Hello World !'
!< test_passed(3) = astring%count(substring=' ', ignore_isolated=.true.)==6
!< astring = ' Hello World ! '
!< test_passed(4) = astring%count(substring=' ', ignore_isolated=.true.)==8
!< print '(L1)', all(test_passed)
!<```
!=> T <<<
class(string), intent(in) :: self !< The string.
character(*), intent(in) :: substring !< Substring.
logical, intent(in), optional :: ignore_isolated !< Ignore "isolated" occurrences.
integer :: No !< Number of occurrences.
logical :: ignore_isolated_ !< Ignore "isolated" occurrences, local variable.
integer :: c1 !< Counter.
integer :: c2 !< Counter.
No = 0
if (allocated(self%raw)) then
if (len(substring)>len(self%raw)) return
ignore_isolated_ = .false. ; if (present(ignore_isolated)) ignore_isolated_ = ignore_isolated
c1 = 1
do
c2 = index(string=self%raw(c1:), substring=substring)
if (c2==0) return
if (.not.ignore_isolated_) then
No = No + 1
else
if (.not.((c1==1.and.c2==1) .or. (c1==len(self%raw)-len(substring)+1))) then
No = No + 1
endif
endif
c1 = c1 + c2 - 1 + len(substring)
enddo
endif
endfunction scount