Skip to content

Commit d588e60

Browse files
committed
bring back fixedsizearrays
1 parent 314f114 commit d588e60

File tree

3 files changed

+46
-22
lines changed

3 files changed

+46
-22
lines changed

src/FixedSizeArrays.jl

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,12 @@ macro fixed_vector(name, parent)
9090
immutable $(name){S, T} <: $(parent){T}
9191
data::NTuple{S, T}
9292

93-
function $(name)(x::NTuple{S,T})
94-
new(x)
93+
function (::Type{$(name){S, T}}){S, T}(x::NTuple{S,T})
94+
new{S, T}(x)
9595
end
96-
function $(name)(x::NTuple{S})
97-
new(StaticArrays.convert_ntuple(T, x))
96+
97+
function (::Type{$(name){S, T}}){S, T}(x::NTuple{S,Any})
98+
new{S, T}(StaticArrays.convert_ntuple(T, x))
9899
end
99100
end
100101
# Array constructor
@@ -122,6 +123,19 @@ macro fixed_vector(name, parent)
122123
@inline function (::Type{$(name){S}}){S, T <: Tuple}(x::T)
123124
$(name){S, StaticArrays.promote_tuple_eltype(T)}(x)
124125
end
126+
(::Type{$(name){S, T}}){S, T}(x::StaticVector) = $(name){S, T}(Tuple(x))
127+
@generated function (::Type{$(name){S, T}}){S, T}(x::$(name))
128+
idx = [:(x[$i]) for i = 1:S]
129+
quote
130+
$($(name)){S, T}($(idx...))
131+
end
132+
end
133+
@generated function convert{S, T}(::Type{$(name){S, T}}, x::$(name))
134+
idx = [:(x[$i]) for i = 1:S]
135+
quote
136+
$($(name)){S, T}($(idx...))
137+
end
138+
end
125139
@generated function (::Type{SV}){SV <: $(name)}(x::StaticVector)
126140
len = size_or(SV, size(x))[1]
127141
if length(x) == len
@@ -134,37 +148,46 @@ macro fixed_vector(name, parent)
134148
end
135149
end
136150

137-
Base.@pure StaticArrays.Size{S}(::Type{$(name){S}}) = Size(S)
151+
Base.@pure StaticArrays.Size{S}(::Type{$(name){S, Any}}) = Size(S)
138152
Base.@pure StaticArrays.Size{S,T}(::Type{$(name){S, T}}) = Size(S)
139153

140-
Base.@propagate_inbounds function Base.getindex(v::$(name), i::Integer)
154+
Base.@propagate_inbounds function Base.getindex{S, T}(v::$(name){S, T}, i::Int)
141155
v.data[i]
142156
end
143157
@inline Base.Tuple(v::$(name)) = v.data
144158
@inline Base.convert{S, T}(::Type{$(name){S, T}}, x::NTuple{S, T}) = $(name){S, T}(x)
145-
@inline Base.convert{SV <: $(name)}(::Type{SV}, x::StaticVector) = SV(x)
159+
@inline Base.convert(::Type{$(name)}, x::StaticVector) = SV(x)
146160
@inline function Base.convert{S, T}(::Type{$(name){S, T}}, x::Tuple)
147161
$(name){S, T}(convert(NTuple{S, T}, x))
148162
end
149163

150-
@generated function StaticArrays.similar_type{SV <: $(name), T,S}(::Type{SV}, ::Type{T}, s::Size{S})
164+
@generated function StaticArrays.similar_type{SV <: $(name), T, S}(::Type{SV}, ::Type{T}, s::Size{S})
151165
if length(S) === 1
152166
$(name){S[1], T}
153167
else
154168
StaticArrays.default_similar_type(T,s(),Val{length(S)})
155169
end
156170
end
157-
158-
171+
size_or(::Type{$(name)}, or) = or
159172
eltype_or(::Type{$(name)}, or) = or
160-
eltype_or{T}(::Type{$(name){TypeVar(:S), T}}, or) = T
161-
eltype_or{S}(::Type{$(name){S, TypeVar(:T)}}, or) = or
162-
eltype_or{S, T}(::Type{$(name){S, T}}, or) = T
163173

164-
size_or(::Type{$(name)}, or) = or
165-
size_or{T}(::Type{$(name){TypeVar(:S), T}}, or) = or
166-
size_or{S}(::Type{$(name){S, TypeVar(:T)}}, or) = (S,)
167-
size_or{S, T}(::Type{$(name){S, T}}, or) = (S,)
174+
if VERSION < v"0.6.0-dev"
175+
eltype_or{T}(::Type{$(name){TypeVar(:S), T}}, or) = T
176+
eltype_or{S}(::Type{$(name){S, TypeVar(:T)}}, or) = or
177+
eltype_or{S, T}(::Type{$(name){S, T}}, or) = T
178+
179+
size_or{T}(::Type{$(name){S where S, T}}, or) = or
180+
size_or{S}(::Type{$(name){S, T where T}}, or) = Size{(S,)}()
181+
size_or{S, T}(::Type{$(name){S, T}}, or) = (S,)
182+
else
183+
eltype_or{T}(::Type{$(name){S, T} where S}, or) = T
184+
eltype_or{S}(::Type{$(name){S, T} where T}, or) = or
185+
eltype_or{S, T}(::Type{$(name){S, T}}, or) = T
186+
187+
size_or{T}(::Type{$(name){S, T} where S}, or) = or
188+
size_or{S}(::Type{$(name){S, T} where T}, or) = Size{(S,)}()
189+
size_or{S, T}(::Type{$(name){S, T}}, or) = (S,)
190+
end
168191
end)
169192
end
170193

src/StaticArrays.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ include("eigen.jl")
9393
include("cholesky.jl")
9494
include("deque.jl")
9595

96-
#include("FixedSizeArrays.jl") # Currently defunct
96+
include("FixedSizeArrays.jl") # Currently defunct
9797
include("ImmutableArrays.jl")
9898

9999
end # module

test/fixed_size_arrays.jl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Compat
12
using StaticArrays
23
using StaticArrays.FixedSizeArrays
34
using Base.Test
@@ -124,8 +125,8 @@ rand(Mat{4,2, Int})
124125
@test typeof(rand(Mat{4,2, Int})) == Mat{4,2, Int, 8}
125126
@test typeof(rand(Vec{7, Int})) == Vec{7, Int}
126127

127-
@test typeof(rand(-20f0:0.192f0:230f0, Mat4d)) == Mat4d
128-
@test typeof(rand(-20f0:0.192f0:230f0, Mat{4,21,Float32})) == Mat{4,21,Float32, 4*21}
128+
# @test typeof(rand(-20f0:0.192f0:230f0, Mat4d)) == Mat4d
129+
# @test typeof(rand(-20f0:0.192f0:230f0, Mat{4,21,Float32})) == Mat{4,21,Float32, 4*21}
129130

130131
@test typeof(rand(Vec4d, 5,5)) == Matrix{Vec4d}
131132
#end
@@ -206,13 +207,13 @@ map(-, Vec(1,2,3))
206207
map(+, Vec(1,2,3), Vec(1,1, 1))
207208
(+).(Vec(1,2,3), 1.0)
208209
v1 = Vec3d(1,2,3)
209-
@test v1[(2,1)] == Vec2d(2,1)
210+
@test v1[Vec(2,1)] == Vec2d(2,1)
210211

211212
@test @inferred(-v1) == Vec(-1.0,-2.0,-3.0)
212213
@test isa(-v1, Vec3d) == true
213214
@test @inferred(v1 ./ v1) == Vec3d(1.0,1.0,1.0)
214215
@test (<).(Vec(1,3), Vec(2,2)) === Vec{2,Bool}(true, false)
215-
216+
#
216217
v1 = Vec(1.0,2.0,3.0)
217218
v2 = Vec(6.0,5.0,4.0)
218219
vi = Vec(1,2,3)

0 commit comments

Comments
 (0)