@@ -63,46 +63,52 @@ macro meta_type(name, mainfield, supertype, params...)
63
63
MetaName = Symbol (" $(name) Meta" )
64
64
field = QuoteNode (mainfield)
65
65
NoParams = Symbol (" $(MetaName) NoParams" )
66
+
67
+ params_sym = map (params) do param
68
+ param isa Symbol && return param
69
+ param isa Expr && param. head == :(< :) && return param. args[1 ]
70
+ error (" Unsupported type parameter: $(param) " )
71
+ end
72
+
66
73
expr = quote
67
- struct $ MetaName{$ (params... ), Typ <: $supertype{$(params ...)} , Names, Types} <: $supertype{$(params ...)}
74
+ struct $ MetaName{$ (params... ), Typ <: $supertype{$(params_sym ...)} , Names, Types} <: $supertype{$(params_sym ...)}
68
75
main:: Typ
69
76
meta:: NamedTuple{Names, Types}
70
77
end
71
78
72
- const $ NoParams{Typ, Names, Types} = $ MetaName{$ (params ... ), Typ, Names, Types} where {$ (params ... )}
79
+ const $ NoParams{Typ, Names, Types} = $ MetaName{$ (params_sym ... ), Typ, Names, Types} where {$ (params_sym ... )}
73
80
74
- function Base. getproperty (x:: $MetaName{$(params...), Typ, Names, Types} , field:: Symbol ) where {$ (params... ), Typ, Names, Types}
81
+ function Base. getproperty (x:: $MetaName{$(params_sym...), Typ, Names, Types} ,
82
+ field:: Symbol ) where {$ (params... ), Typ, Names, Types}
75
83
field === $ field && return getfield (x, :main )
76
84
field === :main && return getfield (x, :main )
77
85
Base. sym_in (field, Names) && return getfield (getfield (x, :meta ), field)
78
86
error (" Field $field not part of Element" )
79
87
end
80
88
81
- GeometryBasics. MetaType (T:: Type{<: $supertype} ) = $ MetaName{T}
89
+ function GeometryBasics. MetaType (XX:: Type{<: $supertype{$(params_sym...)} where {$(params...)}} )
90
+ return $ MetaName
91
+ end
92
+
82
93
function GeometryBasics. MetaType (
83
- ST:: Type{<: $supertype{$(params ...)}} ,
94
+ ST:: Type{<: $supertype{$(params_sym ...)}} ,
84
95
:: Type{NamedTuple{Names, Types}} ) where {$ (params... ), Names, Types}
85
- return $ MetaName{$ (params ... ), ST, Names, Types}
96
+ return $ MetaName{$ (params_sym ... ), ST, Names, Types}
86
97
end
87
98
88
-
89
99
GeometryBasics. MetaFree (:: Type{<: $MetaName{Typ}} ) where Typ = Typ
90
100
GeometryBasics. MetaFree (:: Type{<: $MetaName} ) = $ name
91
101
GeometryBasics. metafree (x:: $MetaName ) = getfield (x, :main )
92
- GeometryBasics. metafree (x:: AbstractVector{<: $MetaName} ) = getcolumns (x, $ field)[ 1 ]
102
+ GeometryBasics. metafree (x:: AbstractVector{<: $MetaName} ) = getproperty (x, $ field)
93
103
GeometryBasics. meta (x:: $MetaName ) = getfield (x, :meta )
94
- GeometryBasics. meta (x:: AbstractVector{<: $MetaName} ) = getcolumns (x, :meta )[ 1 ]
104
+ GeometryBasics. meta (x:: AbstractVector{<: $MetaName} ) = getproperty (x, :meta )
95
105
96
- function GeometryBasics. meta (main:: $supertype ; meta... )
106
+ function GeometryBasics. meta (main:: $supertype{$(params_sym...)} ; meta... ) where { $ (params ... )}
97
107
isempty (meta) && return elements # no meta to add!
98
108
return $ MetaName (main; meta... )
99
109
end
100
110
101
- function GeometryBasics. attributes (hasmeta:: $MetaName )
102
- return Dict {Symbol, Any} ((name => getproperty (hasmeta, name) for name in propertynames (hasmeta)))
103
- end
104
-
105
- function GeometryBasics. meta (elements:: AbstractVector{T} ; meta... ) where T <: $supertype
111
+ function GeometryBasics. meta (elements:: AbstractVector{XX} ; meta... ) where XX <: $supertype{$(params_sym...)} where {$ (params... )}
106
112
isempty (meta) && return elements # no meta to add!
107
113
n = length (elements)
108
114
for (k, v) in meta
@@ -118,7 +124,11 @@ macro meta_type(name, mainfield, supertype, params...)
118
124
# get the first element to get the per element named tuple type
119
125
ElementNT = typeof (map (first, nt))
120
126
121
- return StructArray {MetaType(T, ElementNT)} (($ (mainfield) = elements, nt... ))
127
+ return StructArray {MetaType(XX, ElementNT)} (($ (mainfield) = elements, nt... ))
128
+ end
129
+
130
+ function GeometryBasics. attributes (hasmeta:: $MetaName )
131
+ return Dict {Symbol, Any} ((name => getproperty (hasmeta, name) for name in propertynames (hasmeta)))
122
132
end
123
133
124
134
function (MT:: Type{<: $MetaName} )(args... ; meta... )
@@ -132,22 +142,20 @@ macro meta_type(name, mainfield, supertype, params...)
132
142
return MT (main, nt)
133
143
end
134
144
135
- function Base. propertynames (:: $MetaName{$(params ...), Typ, Names, Types} ) where {$ (params... ), Typ, Names, Types}
145
+ function Base. propertynames (:: $MetaName{$(params_sym ...), Typ, Names, Types} ) where {$ (params... ), Typ, Names, Types}
136
146
return ($ field, Names... )
137
147
end
138
148
139
- function StructArrays. staticschema (:: Type{$MetaName{$(params ...), Typ, Names, Types}} ) where {$ (params... ), Typ, Names, Types}
149
+ function StructArrays. staticschema (:: Type{$MetaName{$(params_sym ...), Typ, Names, Types}} ) where {$ (params... ), Typ, Names, Types}
140
150
NamedTuple{($ field, Names... ), Base. tuple_type_cons (Typ, Types)}
141
151
end
142
152
143
153
function StructArrays. createinstance (
144
- :: Type{$MetaName{$(params ...), Typ, Names, Types}} ,
154
+ :: Type{$MetaName{$(params_sym ...), Typ, Names, Types}} ,
145
155
metafree, args...
146
156
) where {$ (params... ), Typ, Names, Types}
147
157
$ MetaName (metafree, NamedTuple {Names, Types} (args))
148
158
end
149
-
150
-
151
159
end
152
160
return esc (expr)
153
161
end
@@ -163,6 +171,14 @@ Base.getindex(x::SimplexFaceMeta, idx::Int) = getindex(metafree(x), idx)
163
171
164
172
@meta_type (Polygon, polygon, AbstractPolygon, N, T)
165
173
166
- @meta_type (MultiPoint, points, AbstractVector, P)
174
+ @meta_type (MultiPoint, points, AbstractVector, P <: AbstractPoint )
167
175
Base. getindex (x:: MultiPointMeta , idx:: Int ) = getindex (metafree (x), idx)
168
176
Base. size (x:: MultiPointMeta ) = size (metafree (x))
177
+
178
+ @meta_type (MultiLineString, linestrings, AbstractVector, P <: LineString )
179
+ Base. getindex (x:: MultiLineStringMeta , idx:: Int ) = getindex (metafree (x), idx)
180
+ Base. size (x:: MultiLineStringMeta ) = size (metafree (x))
181
+
182
+ @meta_type (Mesh, mesh, AbstractMesh, Element <: Polytope )
183
+ Base. getindex (x:: MeshMeta , idx:: Int ) = getindex (metafree (x), idx)
184
+ Base. size (x:: MeshMeta ) = size (metafree (x))
0 commit comments