add_val_int64_1D Subroutine

private pure subroutine add_val_int64_1D(this, val)

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

@param[in] val Value to be added

Type Bound



Type IntentOptional Attributes Name
class(buffer_int64_1D_t), intent(inout) :: this
integer(kind=int64), intent(in) :: val


Source Code

Source Code

    pure subroutine add_val_int64_1D (this, val)
        class(buffer_int64_1D_t), intent(inout) :: this
        integer(int64), 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, expand the buffer by another block

                integer(int64), 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

                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_int64_1D