sortposofval_path Function

public function sortposofval_path(me, val, nextifnotfound, lower, upper) result(pos)

return the sorted position of a value in the given dynamic array

if the value was not found, - return 0 if nextifnotfound = .false. - return position at the end if nextifnotfound = .true.

binary search on sorted list

Arguments

Type IntentOptional Attributes Name
type(dyn_patharray_type), intent(in) :: me
type(tem_path_type), intent(in) :: val
logical, intent(in), optional :: nextifnotfound

flag to indicate, if the next entry in the list should be returned, if the searched one is not found.

integer, intent(in), optional :: lower
integer, intent(in), optional :: upper

Return Value integer


Called by

proc~~sortposofval_path~~CalledByGraph proc~sortposofval_path sortposofval_path interface~sortedposofval sortedposofval interface~sortedposofval->proc~sortposofval_path proc~append_da_path append_da_path proc~append_da_path->interface~sortedposofval proc~posofval_path posofval_path proc~posofval_path->interface~sortedposofval interface~append~3 append interface~append~3->proc~append_da_path interface~positionofval positionofval interface~positionofval->proc~posofval_path proc~sorttruncate_da_path sorttruncate_da_path proc~sorttruncate_da_path->interface~append~3

Source Code

  function sortposofval_path(me, val, nextifnotfound, lower, upper) result(pos)
    !------------------------------------------------------------------------
    type(dyn_patharray_type), intent(in) :: me !< dynamic array
    type(tem_path_type), intent(in) :: val !< value to look for
    !> flag to indicate, if the next entry in the list should be returned,
    !! if the searched one is not found.
    logical, intent(in), optional :: nextifnotfound
    integer, intent(in), optional :: lower !< lower search limit
    integer, intent(in), optional :: upper !< upper search limit
    integer :: pos !< position of val in the sorted list, 0 if not found
    !------------------------------------------------------------------------
    logical :: retnext
    integer :: lb, ub
    integer :: mid
    type(tem_path_type) :: lb_val, ub_val
    type(tem_path_type) :: mid_val
    !------------------------------------------------------------------------

    retnext = .false.
    if (present(nextifnotfound)) retnext = nextifnotfound

    lb = 1
    ub = me%nvals

    if( present( lower ) ) lb = lower
    if( present( upper ) ) ub = upper

    pos = 0
    if (retnext) pos = lb

    !> binary search on sorted list
    do while(ub >= lb)
      lb_val = me%val(me%sorted(lb))

      if (val < lb_val) then
        if (retnext) pos = lb
        exit
      end if

      ub_val = me%val(me%sorted(ub))

      if (val > ub_val) then
        if (retnext) pos = ub+1
        exit
      end if

      ! safe guard against integer limit overflow
      mid = lb + (ub-lb) / 2
      mid_val = me%val(me%sorted(mid))
      if (val == mid_val) then
        pos = mid
        exit
      end if
      if (val > mid_val) then
        lb = mid + 1
      else
        ub = mid - 1
      end if
    end do
  end function sortposofval_path