143143
144144@inline cpp_trait_type (:: Type ) = IsNormalType
145145
146- # Enum type interface
146+ # Legacy enum type interface
147147abstract type CppEnum <: Integer end
148148(:: Type{T} )(x:: CppEnum ) where {T <: Integer } = T (reinterpret (Int32, x)):: T
149149(:: Type{T} )(x:: Integer ) where {T <: CppEnum } = reinterpret (T, Int32 (x))
@@ -153,6 +153,41 @@ import Base: +, |
153153| (a:: T , b:: T ) where {T <: CppEnum } = reinterpret (T, convert (Int32,a) | convert (Int32,b))
154154Base. promote_rule (:: Type{E} , :: Type{T} ) where {E <: CppEnum , T <: Integer } = Int32
155155
156+ Base. unsafe_string (s:: Ptr{CxxChar} ) = unsafe_string (reinterpret (Ptr{Cchar}, s))
157+
158+ function has_enum (wrapped_module, typesym, labels, values:: Vector{BaseT} ) where BaseT
159+ if ! Base. invokelatest (isdefined, wrapped_module, typesym)
160+ return false
161+ end
162+ existing_type = Base. invokelatest (getproperty, wrapped_module, typesym)
163+ if (existing_type isa DataType) && (supertype (existing_type) <: Enum{BaseT} )
164+ istces = instances (existing_type)
165+ return all (BaseT .(istces) .== values) && all (Symbol .(istces) .== labels)
166+ end
167+ return false
168+ end
169+
170+ # New enum wrapping
171+ function add_enum (wrapped_module, type_name, labels, values:: Vector{BaseT} ) where BaseT
172+ typesym = Symbol (type_name)
173+ labelsyms = Symbol .(unsafe_string .(labels))
174+ if has_enum (wrapped_module, typesym, labelsyms, values)
175+ return Base. invokelatest (getproperty, wrapped_module, typesym)
176+ end
177+ enum_block = Expr (:block )
178+ try
179+ for (label, value) in zip (labelsyms, values)
180+ push! (enum_block. args, :($ label = $ value))
181+ end
182+ @eval wrapped_module @enum $ (typesym):: $BaseT $ enum_block
183+ return Base. invokelatest (getproperty, wrapped_module, typesym)
184+ catch e
185+ @error " Error adding enum $type_name : " e
186+ display (stacktrace ())
187+ return nothing
188+ end
189+ end
190+
156191"""
157192Base class for smart pointers
158193"""
0 commit comments