@@ -22,10 +22,6 @@ sealed trait TypeDescriptor:
2222 type Inner
2323 given DescriptorOf [Inner ] with
2424 val descriptor = self
25- def size (using dm : DescriptorModule ): Bytes = dm.sizeOf(this )
26- def alignment (using dm : DescriptorModule ): Bytes = dm.alignmentOf(this )
27- def toCarrierType (using dm : DescriptorModule ): Class [? ] =
28- dm.toCarrierType(this )
2925
3026 val reader : (ReadWriteModule , DescriptorModule ) ?=> Reader [Inner ]
3127 val writer : (ReadWriteModule , DescriptorModule ) ?=> Writer [Inner ]
@@ -44,7 +40,7 @@ sealed trait TypeDescriptor:
4440 Inner
4541 ] =
4642 val reader = this .reader
47- val size = this .size
43+ val size = this .toForeignTypeDescriptor. size
4844 (mem, offset, num) => {
4945 var i = 0
5046 val array = Array .ofDim[Inner ](num)
@@ -57,12 +53,22 @@ sealed trait TypeDescriptor:
5753 val arrayWriter
5854 : (ReadWriteModule , DescriptorModule ) ?=> Writer [Array [Inner ]] =
5955 val writer = this .writer
60- val size = this .size
56+ val size = this .toForeignTypeDescriptor. size
6157 (mem, offset, a) =>
6258 var i = 0
6359 while i < a.length do
6460 writer(mem, size * i + offset, a(i))
6561 i += 1
62+
63+ def toForeignTypeDescriptor : ForeignTypeDescriptor
64+
65+ sealed trait ForeignTypeDescriptor extends TypeDescriptor :
66+ def toForeignTypeDescriptor : ForeignTypeDescriptor = this
67+ def size (using dm : DescriptorModule ): Bytes = dm.sizeOf(this )
68+ def alignment (using dm : DescriptorModule ): Bytes = dm.alignmentOf(this )
69+ def toCarrierType (using dm : DescriptorModule ): Class [? ] =
70+ dm.toCarrierType(this )
71+
6672object TypeDescriptor :
6773 def fromTypeRepr (using q : Quotes )(
6874 typeRepr : q.reflect.TypeRepr
@@ -83,7 +89,7 @@ object TypeDescriptor:
8389
8490 inline val unusedImplicit = " msg=unused implicit parameter"
8591
86- sealed trait BasicDescriptor extends TypeDescriptor :
92+ sealed trait BasicDescriptor extends ForeignTypeDescriptor :
8793 override val argumentTransition = identity
8894
8995 override val returnTransition = _.asInstanceOf [Inner ]
@@ -118,7 +124,7 @@ case object DoubleDescriptor extends BasicDescriptor:
118124 val reader = readWriteModule.doubleReader
119125 val writer = readWriteModule.doubleWriter
120126
121- case object PtrDescriptor extends TypeDescriptor :
127+ case object PtrDescriptor extends ForeignTypeDescriptor :
122128 type Inner = Ptr [? ]
123129 override val reader = (mem, offset) =>
124130 Ptr (readWriteModule.memReader(mem, offset), Bytes (0 ))
@@ -152,7 +158,7 @@ trait StructDescriptor(
152158 val members : List [StructMemberDescriptor ],
153159 val clazz : Class [? ],
154160 val transform : Tuple => Product
155- ) extends TypeDescriptor
161+ ) extends ForeignTypeDescriptor
156162
157163case class AliasDescriptor [A ](val real : TypeDescriptor ) extends TypeDescriptor :
158164 type Inner = A
@@ -174,13 +180,11 @@ case class AliasDescriptor[A](val real: TypeDescriptor) extends TypeDescriptor:
174180 summon[TransitionModule ].methodArgument(real, _, summon[Allocator ])
175181
176182 override val returnTransition = summon[TransitionModule ].methodReturn(real, _)
177- override def size (using dm : DescriptorModule ): Bytes = dm.sizeOf(real)
178- override def alignment (using dm : DescriptorModule ): Bytes =
179- dm.alignmentOf(real)
180- override def toCarrierType (using dm : DescriptorModule ): Class [? ] =
181- dm.toCarrierType(real)
182183
183- case object VaListDescriptor extends TypeDescriptor :
184+ def toForeignTypeDescriptor : ForeignTypeDescriptor =
185+ real.toForeignTypeDescriptor
186+
187+ case object VaListDescriptor extends ForeignTypeDescriptor :
184188 type Inner = VarArgs
185189
186190 override val reader : (ReadWriteModule , DescriptorModule ) ?=> Reader [Inner ] =
@@ -200,7 +204,7 @@ case object VaListDescriptor extends TypeDescriptor:
200204 summon[TransitionModule ].addressReturn(o).asVarArgs
201205
202206case class CUnionDescriptor (possibleTypes : Set [TypeDescriptor ])
203- extends TypeDescriptor :
207+ extends ForeignTypeDescriptor :
204208 type Inner = CUnion [? <: NonEmptyTuple ]
205209
206210 override val reader : (ReadWriteModule , DescriptorModule ) ?=> Reader [Inner ] =
@@ -223,7 +227,7 @@ case class SetSizeArrayDescriptor(
223227 val contained : TypeDescriptor ,
224228 val number : Int
225229)(using ClassTag [contained.Inner ])
226- extends TypeDescriptor :
230+ extends ForeignTypeDescriptor :
227231
228232 override val reader : (ReadWriteModule , DescriptorModule ) ?=> Reader [Inner ] =
229233 (mem, offset) =>
@@ -256,3 +260,32 @@ case class SetSizeArrayDescriptor(
256260 summon[ReadWriteModule ].read(mem, Bytes (0 ), this )
257261
258262 type Inner = SetSizeArray [contained.Inner , ? ]
263+
264+ trait TransformDescriptor extends TypeDescriptor :
265+ val cRep : TypeDescriptor
266+ val transformTo : Inner => cRep.Inner
267+ val transformFrom : cRep.Inner => Inner
268+
269+ protected inline def toInner [A <: Matchable ](a : A ) =
270+ import scala .compiletime .error
271+ inline a match
272+ case b : cRep.Inner => b
273+ case _ => error(" cannot convert" )
274+
275+ override val reader : (ReadWriteModule , DescriptorModule ) ?=> Reader [Inner ] =
276+ (mem : Mem , bytes : Bytes ) => transformFrom(cRep.reader(mem, bytes))
277+
278+ override val writer : (ReadWriteModule , DescriptorModule ) ?=> Writer [Inner ] =
279+ (mem, bytes, value) => cRep.writer(mem, bytes, transformTo(value))
280+
281+ override val argumentTransition
282+ : (TransitionModule , ReadWriteModule , Allocator ) ?=> ArgumentTransition [
283+ Inner
284+ ] = cRep.argumentTransition.compose(transformTo)
285+
286+ override val returnTransition
287+ : (TransitionModule , ReadWriteModule ) ?=> ReturnTransition [Inner ] =
288+ cRep.returnTransition.andThen(transformFrom)
289+
290+ def toForeignTypeDescriptor : ForeignTypeDescriptor =
291+ cRep.toForeignTypeDescriptor
0 commit comments