go Function

recursive function go(ipattern, ints) result(ival)

Arguments

Type IntentOptional Attributes Name
integer(kind=ip), intent(in), dimension(:) :: ipattern
integer(kind=ip), intent(in), dimension(:) :: ints

Return Value integer(kind=ip)


Calls

proc~~go~4~~CallsGraph proc~go~4 problem_12b::go proc~get_from_cache~2 aoc_cache_module::function_cache%get_from_cache proc~go~4->proc~get_from_cache~2 proc~ipoint problem_12b::ipoint proc~go~4->proc~ipoint proc~ipound problem_12b::ipound proc~go~4->proc~ipound proc~put_in_cache~2 aoc_cache_module::function_cache%put_in_cache proc~go~4->proc~put_in_cache~2 proc~vector_djb_hash~2 aoc_cache_module::vector_djb_hash proc~get_from_cache~2->proc~vector_djb_hash~2 proc~ipoint->proc~go~4 proc~ipound->proc~go~4 ints_tmp ints_tmp proc~ipound->ints_tmp ipattern_tmp ipattern_tmp proc~ipound->ipattern_tmp

Called by

proc~~go~4~~CalledByGraph proc~go~4 problem_12b::go proc~ipoint problem_12b::ipoint proc~go~4->proc~ipoint proc~ipound problem_12b::ipound proc~go~4->proc~ipound proc~ipoint->proc~go~4 proc~ipound->proc~go~4 program~problem_12b problem_12b program~problem_12b->proc~go~4

Source Code

    recursive function go(ipattern, ints) result(ival)
        integer(ip),dimension(:),intent(in) :: ipattern
        integer(ip),dimension(:),intent(in) :: ints
        integer(ip) :: ival
        integer(ip),dimension(:),allocatable :: ival_vec

        integer(ip) :: idx
        logical :: found

        ! first check the cache:
        call cache%get([ipattern,ints],idx,ival_vec,found)
        if (found) then
            ival = ival_vec(1)
        else
            if (size(ints)==0) then ! no more ints
                ival = merge(0, 1, any(ipattern==NUMBER)) ! if any more numbers, invalid
            else if (size(ipattern)==0) then
                ival = 0  ! too many ints
            else
                ! process next element in pattern
                select case (ipattern(1))
                case(NUMBER);    ival = ipound(ipattern, ints)
                case (POINT);    ival = ipoint(ipattern, ints)
                case (QUESTION); ival = ipoint(ipattern, ints) + ipound(ipattern, ints)
                end select
            end if
            ! cache this function call:
            ival_vec = [ival]
            call cache%put(idx,[ipattern,ints],ival_vec)

        end if

    end function go