Release notes
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Version v1.5.0 - Unreleased
Added
- Static dimensions:
FixedSizeArray{T,N,Mem}is now an alias forFixedSizeArrayDims{T,N,NTuple{N,Int},Mem}, where the new public (but not exported) typeFixedSizeArrays.FixedSizeArrayDims{T,N,D,Mem}is anN-dimensional array over a memory backendMem<:DenseVector{T}whose dimensions are a tuple of typeDofInts,Vals andStaticInts from Static.jl (e.g.(Val(5), Val(4), n)or(static(5), static(4), n)), so that any dimension can be a compile-time constant while the others are set at runtime. Linear indices, strides and sizes are computed at compile time as far as the dimensions are static. An array with static dimensions can be constructed withFixedSizeArrays.wrap(FixedSizeArrayDims, parent, dims), withcollect_as, or with the constructors ofFixedSizeArrayDims(undefor converting from another array); the dimensions given to aFixedSizeArrayconstructor are converted toInts. It supports the strided arrays interface,similar,copy,fill!,copyto!, broadcasting (returningFixedSizeArrays), and the package extensions with MPI.jl, Adapt.jl (adapting the memory backend for any memory backend), and the new package extension with StaticArrayInterface.jl, which provides static sizes and strides to e.g. StrideArraysCore.jl, LoopVectorization.jl and Polyester.jl.Valdimensions need no other package, whileStaticIntdimensions are available with the new package extension with Static.jl, which is a weak dependency. FixedSizeArrays.wrapnow accepts at most one dimension given as:, which is computed from the length of the parent.- With StaticArrayInterface.jl,
StaticArrayInterface.deviceof aFixedSizeArrayis now the one of its memory backend, e.g. a GPU memory backend is not treated as a CPU pointer by LoopVectorization.jl.
Changed
FixedSizeArray{T,N,Mem}is an alias forFixedSizeArrayDims{T,N,NTuple{N,Int},Mem}(see above). It is still a concrete type, with the same layout and methods as before, butFixedSizeArrayitself is no longer the name of astruct:Base.typename(FixedSizeArray)isFixedSizeArrayDims, andFixedSizeArray{T,N}with an invalidN(e.g.FixedSizeArray{Int,-1}) now throws an error when the type is formed.
Fixed
- Improved performance of
fill!on Julia v1.13 and later:fill!(::FixedSizeArray, x)now loops directly over the memory backend, which elides the bounds checks and vectorizes. (#200)
Version v1.4.2 - 2026-10-13
Added
- No public-facing changes in this version, only new FileCheck-based tests added (#204).
Version v1.4.1 - 2026-10-13
Fixed
- Improved performance on Julia v1.13 and later of loops after a check of the size of a
FixedSizeArrayargument, such asaxes(a) == axes(b) || throw(...):sizenow loads all dimensions at once, so that LLVM can use the checked dimensions in the loop instead of reloading them. (#201, #202)
Version v1.4.0 - 2026-10-13
Added
- New public function
FixedSizeArrays.wrapto construct aFixedSizeArrayaround an existing parentDenseVector(e.g. aMemoryor aVector) without copying it. (#196) - Package extension with
MPI.jl:FixedSizeArrays (andSubArrays of them) can now be used directly as communication buffers in MPI operations, e.g.MPI.Send,MPI.Recv!,MPI.Bcast!,MPI.Allreduce!andMPI.Gatherv!, by definingMPI.Buffer(::FixedSizeArray)and the conversion toMPI.MPIPtr. Requires MPI.jl v0.20.28 or later. (#198)
Changed
BoundsErrorLightis now an alias forLightBoundsErrorfrom theLightBoundsErrors.jlpackage, instead of being a type defined in this package. As a consequence, the properties of the exception object and the error message have changed. (#176)- All out-of-bounds accesses to a
FixedSizeArraygoing throughcheckboundsnow throwLightBoundsError, not only those indexing with a single integer; the other cases used to throwBoundsError. (#175, #176) - The validation of the dimensions when constructing a
FixedSizeArrayis now implemented with theCheckedSizeProduct.jlpackage. Invalid dimensions still throw anArgumentError, but with a single error message which includes the offending shape. (#89, #90)
Fixed
isassigned(::FixedSizeArray, ::Int)now checks the bounds on theFixedSizeArrayitself, instead of relying on the parent to do it, giving correct results also with underlying storage types which do not check bounds. (#188)copy!(::FixedSizeVector, ::AbstractVector)now throws a descriptiveArgumentErrorwhen the axes of the two arrays do not match, instead of aMethodErrorcaused by trying to callresize!on the destination. (#194, #195)
Version v1.3.0 - 2026-02-14
Changed
- The package extensions were renamed from
RandomExtandAdaptExttoFixedSizeArraysRandomExtandFixedSizeArraysAdaptExt, respectively, to avoid clashes with similarly named extensions in other packages. (#162) - Improved performance of iterating over a
FixedSizeArray: constant propagation throughiteratenow allows the compiler to unroll loops over arrays with statically known size. (#158) - Improved performance of destructuring a
FixedSizeArraywith a slurping pattern (e.g.a, rest... = array), by adding a method toBase.rest. (#166)
Fixed
- Indexing a multidimensional
FixedSizeArraywith a singleColon(A[:]) now always returns a vector, instead of an array with the same shape asA. (#161) - Fixed type inference of
collect_asin Julia v1.12 and later. (#160, #172)
Version v1.2.0 - 2025-08-07
Added
Version v1.1.0 - 2025-08-05
Added
Version v1.0.1 - 2025-06-08
Fixed
Version v1.0.0 - 2025-06-04
Initial release.