Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Combining abstract types and parametric types? #76

Open
heyx3 opened this issue Jul 3, 2022 · 0 comments
Open

Combining abstract types and parametric types? #76

heyx3 opened this issue Jul 3, 2022 · 0 comments

Comments

@heyx3
Copy link

heyx3 commented Jul 3, 2022

Let's say I have a type hierarchy like this:

abstract type Parent end
mutable struct Child1 <: Parent
    type # Set to 'child1'
end
mutable struct Child2{N<:Integer} <: Parent
    type # Set to 'child2'
    i::N
end

StructTypes.StructType(::Type{Parent}) = StructTypes.AbstractType()
StructTypes.StructType(::Type{Child1}) = StructTypes.Mutable()
StructTypes.StructType(::Type{<:Child2}) = StructTypes.Mutable()

StructTypes.subtypekey(::Type{Parent}) = :type
StructTypes.subtypes(::Type{Parent}) = (child1=Child1, child2=Child2)

Currently, afaik, there is no mechanism for StructTypes to serialize/deserialize the value of N, like how it can write the type key for each child.

Current workarounds I can think of:

  • Pick a unique type name for each concrete version of Child2{N} you expect to be possible: (child1=Child1, child2U8=Child2{UInt8}, child2I32=Child2{Int32}, ...)
  • Use UnorderedStruct or OrderedStruct instead of Mutable, and let the type parameter be inferred by the constructor.

Would it be feasible to support deserializing type parameters in the same way as the type itself? For example:

struct Child2{N<:Integer} <: Parent
    type # Set to 'child2'
    int_type::Type # Set to string(N)
    i::N
end
StructTypes.parametrickey(::Type{<:Child2}, ::Val{1}) = :int_type
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant