Return A ∩ B Assume: 1. A and B are sorted. The result will be sorted.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| integer(kind=int64), | intent(in) | :: | A(:) | |||
| integer(kind=int64), | intent(in) | :: | B(:) |
pure function intersect_integer_int64 (A, B) result(D) integer (int64), intent(in) :: A(:), B(:) integer (int64), allocatable :: D(:) character(*), parameter :: this_routine = 'union_complement' integer (int64), allocatable :: tmp(:) integer :: i, j, l #ifdef DEBUG_ block use util_mod, only: stop_all if (.not. (is_sorted(A))) then call stop_all (this_routine, "Assert fail: is_sorted(A)") end if end block #endif #ifdef DEBUG_ block use util_mod, only: stop_all if (.not. (is_sorted(B))) then call stop_all (this_routine, "Assert fail: is_sorted(B)") end if end block #endif allocate(tmp(min(size(A), size(B)))) i = 1; j = 1; l = 1 do while (l <= size(tmp)) if (i > size(A) .or. j > size(B)) then exit else if (A(i) == B(j)) then tmp(l) = A(i) i = i + 1 j = j + 1 l = l + 1 else if (A(i) < B(j)) then i = i + 1 else if (A(i) > B(j)) then j = j + 1 end if end do associate(final_size => l - 1) D = tmp(:final_size) end associate #ifdef DEBUG_ block use util_mod, only: stop_all if (.not. (is_sorted(D))) then call stop_all (this_routine, "Assert fail: is_sorted(D)") end if end block #endif end function intersect_integer_int64