A bracket table can scan thresholds and keep the last matching row.

Program

Play the program to change an amount and see which bracket is selected.

amount
threshold_bracket_table.f90
Replay: real traced execution (multi-file project)
program threshold_bracket_table_demo
    implicit none
    integer :: minimums(3)
    integer :: factors(3)
    integer :: amount
    integer :: i
    integer :: selected_factor
    integer :: adjusted

    minimums = [0, 10, 20]
    factors = [1, 2, 3]
    amount = 18
    selected_factor = factors(1)
    do i = 1, 3
        if (amount >= minimums(i)) selected_factor = factors(i)
    end do
    adjusted = amount * selected_factor
    print '(I0, 1X, I0)', selected_factor, adjusted
end program threshold_bracket_table_demo
program threshold_bracket_table_demo
    implicit none
    integer :: minimums(3)
    integer :: factors(3)
    integer :: amount
    integer :: i
    integer :: selected_factor
    integer :: adjusted

    minimums = [0, 10, 20]
    factors = [1, 2, 3]
    amount = 8
    selected_factor = factors(1)
    do i = 1, 3
        if (amount >= minimums(i)) selected_factor = factors(i)
    end do
    adjusted = amount * selected_factor
    print '(I0, 1X, I0)', selected_factor, adjusted
end program threshold_bracket_table_demo
program threshold_bracket_table_demo
    implicit none
    integer :: minimums(3)
    integer :: factors(3)
    integer :: amount
    integer :: i
    integer :: selected_factor
    integer :: adjusted

    minimums = [0, 10, 20]
    factors = [1, 2, 3]
    amount = 25
    selected_factor = factors(1)
    do i = 1, 3
        if (amount >= minimums(i)) selected_factor = factors(i)
    end do
    adjusted = amount * selected_factor
    print '(I0, 1X, I0)', selected_factor, adjusted
end program threshold_bracket_table_demo
  1. minimums ← [0, 10, 20]

    10minimums = [0, 10, 20]11factors = [1, 2, 3]
    values this step[0, 10, 20]minimums
  2. factors ← [1, 2, 3]

    10minimums = [0, 10, 20]11factors = [1, 2, 3]12amount = 18
    values this step[1, 2, 3]factors
  3. amount ← 18

    11factors = [1, 2, 3]12amount = 1813selected_factor = factors(1)
    values this step18amount
  4. selected_factor ← 1

    12amount = 1813selected_factor = factors(1)14do i = 1, 3
    values this step1selected_factor
  5. i ← 1

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step1i
  6. selected_factor ← 1

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step1selected_factor.true.amount >= minimums(1)
  7. i ← 2

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step2i
  8. selected_factor ← 2

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step2selected_factor.true.amount >= minimums(2)
  9. i ← 3

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step3i
  10. if (amount >= minimums(i)) selected_factor = factors(i)

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step.false.amount >= minimums(3)
  11. adjusted ← 36

    16end do17adjusted = amount * selected_factor18print '(I0, 1X, I0)', selected_factor, adjusted
    values this step36adjusted18amount2selected_factor
  12. print '(I0, 1X, I0)', selected_factor, adjusted

    17    adjusted = amount * selected_factor18    print '(I0, 1X, I0)', selected_factor, adjusted19end program threshold_bracket_table_demo
    output2 36
    values this step2selected_factor36adjusted
  1. minimums ← [0, 10, 20]

    10minimums = [0, 10, 20]11factors = [1, 2, 3]
    values this step[0, 10, 20]minimums
  2. factors ← [1, 2, 3]

    10minimums = [0, 10, 20]11factors = [1, 2, 3]12amount = 8
    values this step[1, 2, 3]factors
  3. amount ← 8

    11factors = [1, 2, 3]12amount = 813selected_factor = factors(1)
    values this step8amount
  4. selected_factor ← 1

    12amount = 813selected_factor = factors(1)14do i = 1, 3
    values this step1selected_factor
  5. i ← 1

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step1i
  6. selected_factor ← 1

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step1selected_factor.true.amount >= minimums(1)
  7. i ← 2

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step2i
  8. if (amount >= minimums(i)) selected_factor = factors(i)

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step.false.amount >= minimums(2)
  9. i ← 3

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step3i
  10. if (amount >= minimums(i)) selected_factor = factors(i)

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step.false.amount >= minimums(3)
  11. adjusted ← 8

    16end do17adjusted = amount * selected_factor18print '(I0, 1X, I0)', selected_factor, adjusted
    values this step8adjusted8amount1selected_factor
  12. print '(I0, 1X, I0)', selected_factor, adjusted

    17    adjusted = amount * selected_factor18    print '(I0, 1X, I0)', selected_factor, adjusted19end program threshold_bracket_table_demo
    output1 8
    values this step1selected_factor8adjusted
  1. minimums ← [0, 10, 20]

    10minimums = [0, 10, 20]11factors = [1, 2, 3]
    values this step[0, 10, 20]minimums
  2. factors ← [1, 2, 3]

    10minimums = [0, 10, 20]11factors = [1, 2, 3]12amount = 25
    values this step[1, 2, 3]factors
  3. amount ← 25

    11factors = [1, 2, 3]12amount = 2513selected_factor = factors(1)
    values this step25amount
  4. selected_factor ← 1

    12amount = 2513selected_factor = factors(1)14do i = 1, 3
    values this step1selected_factor
  5. i ← 1

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step1i
  6. selected_factor ← 1

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step1selected_factor.true.amount >= minimums(1)
  7. i ← 2

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step2i
  8. selected_factor ← 2

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step2selected_factor.true.amount >= minimums(2)
  9. i ← 3

    13selected_factor = factors(1)14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)
    values this step3i
  10. selected_factor ← 3

    14do i = 1, 315    if (amount >= minimums(i)) selected_factor = factors(i)16end do
    values this step3selected_factor.true.amount >= minimums(3)
  11. adjusted ← 75

    16end do17adjusted = amount * selected_factor18print '(I0, 1X, I0)', selected_factor, adjusted
    values this step75adjusted25amount3selected_factor
  12. print '(I0, 1X, I0)', selected_factor, adjusted

    17    adjusted = amount * selected_factor18    print '(I0, 1X, I0)', selected_factor, adjusted19end program threshold_bracket_table_demo
    output3 75
    values this step3selected_factor75adjusted
threshold table Threshold rows describe which factor applies for each amount range.
last match Scanning in order keeps the factor from the last satisfied threshold.
table-driven branch Changing the table data can change the decision without changing the loop shape.