|
79 | 79 | isvoid{T}(::Type{T}) = false |
80 | 80 | isvoid(::Type{Void}) = true |
81 | 81 | isvoid{T}(::Type{Vector{T}}) = isvoid(T) |
82 | | -function (::Type{HM1}){HM1 <: HomogenousMesh}(primitive::HomogenousMesh) |
| 82 | + |
| 83 | +@generated function (::Type{HM1})(primitive::HM2) where {HM1 <: HomogenousMesh, HM2 <: HomogenousMesh} |
83 | 84 | fnames = fieldnames(HM1) |
84 | | - args = ntuple(nfields(HM1)) do i |
85 | | - field, target_type = fnames[i], fieldtype(HM1, i) |
86 | | - soure_type = fieldtype(typeof(primitive), i) |
87 | | - isleaftype(fieldtype(HM1, i)) || return getfield(primitive, field) # target is not defined |
88 | | - if !isvoid(target_type) && isvoid(soure_type) # target not there yet, maybe we can decompose though (e.g. normals) |
89 | | - return decompose(HM1.parameters[i], primitive) |
| 85 | + expr = Expr(:call, HM1) |
| 86 | + for i in 1:nfields(HM1) |
| 87 | + field = fnames[i] |
| 88 | + target_type = fieldtype(HM1, i) |
| 89 | + source_type = fieldtype(HM2, i) |
| 90 | + if !isleaftype(fieldtype(HM1, i)) # target is not defined |
| 91 | + push!(expr.args, :(getfield(primitive, $(QuoteNode(field))))) |
| 92 | + elseif !isvoid(target_type) && isvoid(source_type) # target not there yet, maybe we can decompose though (e.g. normals) |
| 93 | + push!(expr.args, :(decompose($(HM1.parameters[i]), primitive))) |
90 | 94 | elseif isvoid(target_type) |
91 | | - return target_type() |
| 95 | + push!(expr.args, :($(target_type()))) |
92 | 96 | else |
93 | | - return convert(target_type, getfield(primitive, field)) |
| 97 | + push!(expr.args, :(convert($target_type, getfield(primitive, $(QuoteNode(field)))))) |
94 | 98 | end |
95 | 99 | end |
96 | | - HM1(args...) |
| 100 | + expr |
97 | 101 | end |
98 | 102 |
|
99 | | - |
100 | 103 | #Should be: |
101 | 104 | #function call{M <: HMesh, VT <: Point, FT <: Face}(::Type{M}, vertices::Vector{VT}, faces::Vector{FT}) |
102 | 105 | # Haven't gotten around to implement the types correctly with abstract types in FixedSizeArrays |
|
0 commit comments