Happy labor day!
Anyone around that could help with the following issue? Consider this simple snippet:
# DOMAIN
abstract type AbstractDomain{T<:Real,N} end
struct RegularGrid{T<:Real,N} <: AbstractDomain{T,N}
  dims::Dims{N}
  origin::NTuple{N,T}
  spacing::NTuple{N,T}
  function RegularGrid{T,N}(dims, origin, spacing) where {N,T<:Real}
    @assert all(dims .> 0) "dimensions must be positive"
    @assert all(spacing .> 0) "spacing must be positive"
    new(dims, origin, spacing)
  end
end
RegularGrid{T}(dims::Dims{N}) where {N,T<:Real} =
  RegularGrid{T,N}(dims, (zeros(T,length(dims))...), (ones(T,length(dims))...))
RegularGrid{T}(dims::Vararg{<:Integer,N}) where {N,T<:Real} = RegularGrid{T}(dims)
npoints(grid::RegularGrid) = prod(grid.dims)
# PATH
abstract type AbstractPath{D<:AbstractDomain} end
struct RandomPath{D<:AbstractDomain} <: AbstractPath{D}
  domain::D
  permut::Vector{Int}
  function RandomPath{D}(domain, permut) where {D<:AbstractDomain}
    @assert length(permut) == npoints(domain) "incorrect dimension"
    new(domain, permut)
  end
end
RandomPath(domain) = RandomPath{typeof(domain)}(domain, randperm(npoints(domain)))
Base.start(p::RandomPath)       = Base.start(p.permut)
Base.next(p::RandomPath, state) = Base.next(p.permut, state)
Base.done(p::RandomPath, state) = Base.done(p.permut, state)
Base.length(p::RandomPath)      = npoints(p.domain)
# MAIN SCRIPT
grid = RegularGrid{Float64}(100,100)
path = RandomPath(grid)
for location in path
  location
end
Profile.clear_malloc_data()
for location in path
  location
end
All it does is loop over a grid in random order. However, I am wondering why the done method of the iterator is allocating memory:
        - struct RandomPath{D<:AbstractDomain} <: AbstractPath{D}
        -   domain::D
        -   permut::Vector{Int}
        - 
        -   function RandomPath{D}(domain, permut) where {D<:AbstractDomain}
        0     @assert length(permut) == npoints(domain) "incorrect dimension"
        0     new(domain, permut)
        -   end
        - end
        0 RandomPath(domain) = RandomPath{typeof(domain)}(domain, randperm(npoints(domain)))
        - Base.start(p::RandomPath)       = Base.start(p.permut)
        0 Base.next(p::RandomPath, state) = Base.next(p.permut, state)
   654016 Base.done(p::RandomPath, state) = Base.done(p.permut, state)
        - Base.length(p::RandomPath)      = npoints(p.domain)