add_val_token_1D Subroutine

private pure subroutine add_val_token_1D(this, val)

@brief Append a value to the buffer, expanding the capacity if necessary.

@param[in] val Value to be added

Type Bound

buffer_token_1D_t

Arguments

Type IntentOptional Attributes Name
class(buffer_token_1D_t), intent(inout) :: this
type(Token_t), intent(in) :: val

Contents

Source Code


Source Code

    pure subroutine add_val_token_1D (this, val)
        class(buffer_token_1D_t), intent(inout) :: this
        type(Token_t), intent(in) :: val


        ! If the buffer still has room, add the entry
        if (this%pos < size(this%buf, 1, kind=int64)) then
            this%pos = this%pos + 1_int64
            this%buf(this%pos) = val
        else
            ! else, expand the buffer by another block
            block

                type(Token_t), dimension(:), allocatable :: tmp
                integer(int64) :: new_buf_size
                ! Fortran 2003 automatic allocation/assignment
                tmp = this%buf

                ! We add a constant offset to allow growth if start_size == 0.
                ! The grow_factor then takes over for larger numbers and prevents the O(n^2) scaling.
                new_buf_size = ceiling(real(size(this%buf, 1), kind=dp) * this%grow_factor, kind=int64) + 10_int64
                deallocate(this%buf)
                allocate(this%buf(new_buf_size))

                this%buf(: size(tmp, 1)) = tmp

                this%pos = this%pos + 1_int64
                this%buf(this%pos) = val
            end block
        end if
    end subroutine add_val_token_1D