@brief Append a value to the buffer, expanding the capacity if necessary.
@param[in] val Value to be added
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(buffer_int64_1D_t), | intent(inout) | :: | this | |||
integer(kind=int64), | intent(in) | :: | val |
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
! else, expand the buffer by another block
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
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_int64_1D