Skip to content

Commit

Permalink
Added copy support for Scala serializers
Browse files Browse the repository at this point in the history
  • Loading branch information
Anubhab2003 committed Jan 21, 2025
1 parent c31c402 commit 8bdfa1a
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -185,3 +185,56 @@ class ScalaSeqSerializer[A, T <: scala.collection.Seq[A]](fury: Fury, cls: Class
new ListAdapter[Any](value)
}
}
abstract class AbstractScalaCollectionSerializer[A, T <: Iterable[A]](fury: Fury, cls: Class[T])
extends AbstractCollectionSerializer[T](fury, cls) {

// Existing methods

// Add copy method
def copy(value: T): T = {
val builder = value.iterableFactory.newBuilder[A]
builder ++= value
builder.result()
}
}

class ScalaCollectionSerializer[A, T <: Iterable[A]] (fury: Fury, cls: Class[T])
extends AbstractScalaCollectionSerializer[A, T](fury, cls) {
override def onCollectionWrite(buffer: MemoryBuffer, value: T): util.Collection[_] = {
val factory: Factory[A, Any] = value.iterableFactory.iterableFactory
val adapter = new CollectionAdapter[A, T](value)
buffer.writeVarUint32Small7(adapter.size)
fury.writeRef(buffer, factory)
adapter
}

// Implement copy method
override def copy(value: T): T = super.copy(value)
}

class ScalaSortedSetSerializer[A, T <: scala.collection.SortedSet[A]](fury: Fury, cls: Class[T])
extends AbstractScalaCollectionSerializer[A, T](fury, cls) {
override def onCollectionWrite(buffer: MemoryBuffer, value: T): util.Collection[_] = {
buffer.writeVarUint32Small7(value.size)
val factory = value.sortedIterableFactory.evidenceIterableFactory[Any](
value.ordering.asInstanceOf[Ordering[Any]])
fury.writeRef(buffer, factory)
new CollectionAdapter[A, T](value)
}

// Implement copy method
override def copy(value: T): T = super.copy(value)
}

class ScalaSeqSerializer[A, T <: scala.collection.Seq[A]](fury: Fury, cls: Class[T])
extends AbstractScalaCollectionSerializer[A, T](fury, cls) {
override def onCollectionWrite(buffer: MemoryBuffer, value: T): util.Collection[_] = {
buffer.writeVarUint32Small7(value.size)
val factory: Factory[A, Any] = value.iterableFactory.iterableFactory
fury.writeRef(buffer, factory)
new ListAdapter[Any](value)
}

// Implement copy method
override def copy(value: T): T = super.copy(value)
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,3 +142,44 @@ class ScalaSortedMapSerializer[K, V, T <: scala.collection.SortedMap[K, V]](fury
new MapAdapter[K, V](value)
}
}

abstract class AbstractScalaMapSerializer[K, V, T](fury: Fury, cls: Class[T])
extends AbstractMapSerializer[T](fury, cls) {

// Existing methods

// Add copy method
def copy(value: T): T = {
val builder = value.mapFactory.newBuilder[K, V]
builder ++= value
builder.result()
}
}

class ScalaMapSerializer[K, V, T <: scala.collection.Map[K, V]](fury: Fury, cls: Class[T])
extends AbstractScalaMapSerializer[K, V, T](fury, cls) {

override def onMapWrite(buffer: MemoryBuffer, value: T): util.Map[_, _] = {
buffer.writeVarUint32Small7(value.size)
val factory = value.mapFactory.mapFactory[Any, Any].asInstanceOf[Factory[Any, Any]]
fury.writeRef(buffer, factory)
new MapAdapter[K, V](value)
}

// Implement copy method
override def copy(value: T): T = super.copy(value)
}

class ScalaSortedMapSerializer[K, V, T <: scala.collection.SortedMap[K, V]](fury: Fury, cls: Class[T])
extends AbstractScalaMapSerializer[K, V, T](fury, cls) {
override def onMapWrite(buffer: MemoryBuffer, value: T): util.Map[_, _] = {
buffer.writeVarUint32Small7(value.size)
val factory = value.sortedMapFactory.sortedMapFactory[Any, Any](
value.ordering.asInstanceOf[Ordering[Any]]).asInstanceOf[Factory[Any, Any]]
fury.writeRef(buffer, factory)
new MapAdapter[K, V](value)
}

// Implement copy method
override def copy(value: T): T = super.copy(value)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers

class SerializerTest extends AnyFlatSpec with Matchers {
"ScalaCollectionSerializer" should "copy collections correctly" in {
val fury = new Fury()
val original = Seq(1, 2, 3)
val serializer = new ScalaCollectionSerializer[Int, Seq[Int]](fury, classOf[Seq[Int]])

val copy = serializer.copy(original)
copy shouldEqual original
copy should not be theSameInstanceAs (original)
}

"ScalaMapSerializer" should "copy maps correctly" in {
val fury = new Fury()
val original = Map("a" -> 1, "b" -> 2)
val serializer = new ScalaMapSerializer[String, Int, Map[String, Int]](fury, classOf[Map[String, Int]])

val copy = serializer.copy(original)
copy shouldEqual original
copy should not be theSameInstanceAs (original)
}
}

0 comments on commit 8bdfa1a

Please sign in to comment.