Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import scala.annotation.nowarn

case class div_t(quot: Int, rem: Int)

@nowarn("msg=unused explicit parameter")
trait BindingsBenchmarkShape(val s: Slinc):
import scala.language.unsafeNulls
import s.{given, *}
Expand Down
2 changes: 0 additions & 2 deletions core/src/fr/hammons/slinc/Slinc.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@ trait Slinc:
given tm: TransitionModule
given rwm: ReadWriteModule

protected val structI = new StructI
val typesI = types.TypesI.platformTypes
protected val scopeI = ScopeI(scopePlatformSpecific)
protected val libraryI = LibraryI(libraryIPlatformSpecific)
Expand All @@ -24,7 +23,6 @@ trait Slinc:
export libraryI.*
export Convertible.as
export PotentiallyConvertible.maybeAs
export structI.Struct
export scopeI.given
export container.ContextProof.given

Expand Down
78 changes: 35 additions & 43 deletions core/src/fr/hammons/slinc/Struct.scala
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,9 @@ import modules.DescriptorModule
import fr.hammons.slinc.modules.TransitionModule
import fr.hammons.slinc.modules.ReadWriteModule

class StructI(using DescriptorModule, TransitionModule, ReadWriteModule):
/** Summons up Descriptors for the members of Product A
*
* @tparam A
* The product type to summon a list of descriptors for
* @return
* List[TypeDescriptor]
*/
trait Struct[A <: Product] extends DescriptorOf[A], MethodCompatible[A]

object Struct:
private inline def memberDescriptors[A](using
m: Mirror.ProductOf[A]
): List[TypeDescriptor] =
Expand Down Expand Up @@ -83,43 +78,40 @@ class StructI(using DescriptorModule, TransitionModule, ReadWriteModule):
inline EmptyTuple match
case a: A => a

trait Struct[A <: Product] extends DescriptorOf[A], MethodCompatible[A]

object Struct:
inline def derived[A <: Product](using
m: Mirror.ProductOf[A],
ct: ClassTag[A]
) = new Struct[A]:
val descriptor: StructDescriptor = StructDescriptor(
memberDescriptors[A].view
.zip(memberNames[A])
.map(StructMemberDescriptor.apply)
.toList,
ct.runtimeClass,
m.fromProduct(_)
)
inline def derived[A <: Product](using
m: Mirror.ProductOf[A],
ct: ClassTag[A]
)(using DescriptorModule, ReadWriteModule, TransitionModule) = new Struct[A]:
val descriptor: StructDescriptor = StructDescriptor(
memberDescriptors[A].view
.zip(memberNames[A])
.map(StructMemberDescriptor.apply)
.toList,
ct.runtimeClass,
m.fromProduct(_)
)

private val offsetsArray = descriptor.offsets
private val offsetsArray = descriptor.offsets

summon[ReadWriteModule].registerWriter[A]((m, b, a) =>
writeGen(offsetsArray.map(_ + b), a, m)
)(using this)
summon[ReadWriteModule].registerWriter[A]((m, b, a) =>
writeGen(offsetsArray.map(_ + b), a, m)
)(using this)

summon[ReadWriteModule].registerReader((m, b) =>
readGen(offsetsArray.map(_ + b), m)
)(using this)
summon[ReadWriteModule].registerReader((m, b) =>
readGen(offsetsArray.map(_ + b), m)
)(using this)

summon[TransitionModule].registerMethodArgumentTransition[A](
this.descriptor,
Allocator ?=> in(_)
)
summon[TransitionModule]
.registerMethodReturnTransition[A](this.descriptor, out)
final def in(a: A)(using alloc: Allocator): Object =
val mem = alloc.allocate(this.descriptor, 1)
summon[ReadWriteModule].write(mem, Bytes(0), a)(using this)
summon[TransitionModule].methodArgument(mem).asInstanceOf[Object]
summon[TransitionModule].registerMethodArgumentTransition[A](
this.descriptor,
Allocator ?=> in(_)
)
summon[TransitionModule]
.registerMethodReturnTransition[A](this.descriptor, out)
final def in(a: A)(using alloc: Allocator): Object =
val mem = alloc.allocate(this.descriptor, 1)
summon[ReadWriteModule].write(mem, Bytes(0), a)(using this)
summon[TransitionModule].methodArgument(mem).asInstanceOf[Object]

final def out(a: Object): A =
val mem = summon[TransitionModule].memReturn(a)
summon[ReadWriteModule].read[A](mem, Bytes(0))(using this)
final def out(a: Object): A =
val mem = summon[TransitionModule].memReturn(a)
summon[ReadWriteModule].read[A](mem, Bytes(0))(using this)
1 change: 0 additions & 1 deletion core/test/src/fr/hammons/slinc/BindingSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import scala.concurrent.duration.*
import scala.annotation.nowarn

//todo: get rid of this once https://github.com/lampepfl/dotty/issues/16876 is fixed
@nowarn("msg=unused explicit parameter")
trait BindingSpec(val slinc: Slinc) extends ScalaCheckSuite:
import slinc.{given, *}
override def munitTimeout: Duration = 5.minutes
Expand Down
2 changes: 0 additions & 2 deletions core/test/src/fr/hammons/slinc/StdlibSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@ import fr.hammons.slinc.types.OS
import scala.annotation.nowarn

//todo: remove when https://github.com/lampepfl/dotty/issues/16876 is fixed
@nowarn("msg=unused explicit parameter")
@nowarn("msg=unused implicit parameter")
trait StdlibSpec(val slinc: Slinc) extends ScalaCheckSuite:
import slinc.{given, *}

Expand Down