From b1999ae0b83ad75f5964db83c734a9eecb0e9b0f Mon Sep 17 00:00:00 2001 From: Mark Hammons Date: Sun, 19 Feb 2023 17:48:36 +0100 Subject: [PATCH] Remove StructI Fixes #53 --- .../slinc/BindingsBenchmarkShape.scala | 1 - core/src/fr/hammons/slinc/Slinc.scala | 2 - core/src/fr/hammons/slinc/Struct.scala | 78 +++++++++---------- .../src/fr/hammons/slinc/BindingSpec.scala | 1 - .../src/fr/hammons/slinc/StdlibSpec.scala | 2 - 5 files changed, 35 insertions(+), 49 deletions(-) diff --git a/core/benchmarks/test/src/fr/hammons/slinc/BindingsBenchmarkShape.scala b/core/benchmarks/test/src/fr/hammons/slinc/BindingsBenchmarkShape.scala index 89dcacb6..65039156 100644 --- a/core/benchmarks/test/src/fr/hammons/slinc/BindingsBenchmarkShape.scala +++ b/core/benchmarks/test/src/fr/hammons/slinc/BindingsBenchmarkShape.scala @@ -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, *} diff --git a/core/src/fr/hammons/slinc/Slinc.scala b/core/src/fr/hammons/slinc/Slinc.scala index 10ff7dc6..1ce7f546 100644 --- a/core/src/fr/hammons/slinc/Slinc.scala +++ b/core/src/fr/hammons/slinc/Slinc.scala @@ -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) @@ -24,7 +23,6 @@ trait Slinc: export libraryI.* export Convertible.as export PotentiallyConvertible.maybeAs - export structI.Struct export scopeI.given export container.ContextProof.given diff --git a/core/src/fr/hammons/slinc/Struct.scala b/core/src/fr/hammons/slinc/Struct.scala index 29626697..2bed8ee1 100644 --- a/core/src/fr/hammons/slinc/Struct.scala +++ b/core/src/fr/hammons/slinc/Struct.scala @@ -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] = @@ -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) diff --git a/core/test/src/fr/hammons/slinc/BindingSpec.scala b/core/test/src/fr/hammons/slinc/BindingSpec.scala index f873fb0d..9f7e66bc 100644 --- a/core/test/src/fr/hammons/slinc/BindingSpec.scala +++ b/core/test/src/fr/hammons/slinc/BindingSpec.scala @@ -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 diff --git a/core/test/src/fr/hammons/slinc/StdlibSpec.scala b/core/test/src/fr/hammons/slinc/StdlibSpec.scala index 8fb52be5..0884a292 100644 --- a/core/test/src/fr/hammons/slinc/StdlibSpec.scala +++ b/core/test/src/fr/hammons/slinc/StdlibSpec.scala @@ -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, *}