@@ -63,46 +63,52 @@ macro meta_type(name, mainfield, supertype, params...)
6363 MetaName = Symbol (" $(name) Meta" )
6464 field = QuoteNode (mainfield)
6565 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+
6673 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 ...)}
6875 main:: Typ
6976 meta:: NamedTuple{Names, Types}
7077 end
7178
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 ... )}
7380
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}
7583 field === $ field && return getfield (x, :main )
7684 field === :main && return getfield (x, :main )
7785 Base. sym_in (field, Names) && return getfield (getfield (x, :meta ), field)
7886 error (" Field $field not part of Element" )
7987 end
8088
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+
8293 function GeometryBasics. MetaType (
83- ST:: Type{<: $supertype{$(params ...)}} ,
94+ ST:: Type{<: $supertype{$(params_sym ...)}} ,
8495 :: Type{NamedTuple{Names, Types}} ) where {$ (params... ), Names, Types}
85- return $ MetaName{$ (params ... ), ST, Names, Types}
96+ return $ MetaName{$ (params_sym ... ), ST, Names, Types}
8697 end
8798
88-
8999 GeometryBasics. MetaFree (:: Type{<: $MetaName{Typ}} ) where Typ = Typ
90100 GeometryBasics. MetaFree (:: Type{<: $MetaName} ) = $ name
91101 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)
93103 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 )
95105
96- function GeometryBasics. meta (main:: $supertype ; meta... )
106+ function GeometryBasics. meta (main:: $supertype{$(params_sym...)} ; meta... ) where { $ (params ... )}
97107 isempty (meta) && return elements # no meta to add!
98108 return $ MetaName (main; meta... )
99109 end
100110
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... )}
106112 isempty (meta) && return elements # no meta to add!
107113 n = length (elements)
108114 for (k, v) in meta
@@ -118,7 +124,11 @@ macro meta_type(name, mainfield, supertype, params...)
118124 # get the first element to get the per element named tuple type
119125 ElementNT = typeof (map (first, nt))
120126
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)))
122132 end
123133
124134 function (MT:: Type{<: $MetaName} )(args... ; meta... )
@@ -132,22 +142,20 @@ macro meta_type(name, mainfield, supertype, params...)
132142 return MT (main, nt)
133143 end
134144
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}
136146 return ($ field, Names... )
137147 end
138148
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}
140150 NamedTuple{($ field, Names... ), Base. tuple_type_cons (Typ, Types)}
141151 end
142152
143153 function StructArrays. createinstance (
144- :: Type{$MetaName{$(params ...), Typ, Names, Types}} ,
154+ :: Type{$MetaName{$(params_sym ...), Typ, Names, Types}} ,
145155 metafree, args...
146156 ) where {$ (params... ), Typ, Names, Types}
147157 $ MetaName (metafree, NamedTuple {Names, Types} (args))
148158 end
149-
150-
151159 end
152160 return esc (expr)
153161end
@@ -163,6 +171,14 @@ Base.getindex(x::SimplexFaceMeta, idx::Int) = getindex(metafree(x), idx)
163171
164172@meta_type (Polygon, polygon, AbstractPolygon, N, T)
165173
166- @meta_type (MultiPoint, points, AbstractVector, P)
174+ @meta_type (MultiPoint, points, AbstractVector, P <: AbstractPoint )
167175Base. getindex (x:: MultiPointMeta , idx:: Int ) = getindex (metafree (x), idx)
168176Base. 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