8000 Various improvements for SizeMeter and Default by vovapolu · Pull Request #1 · fomkin/zhukov · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
This repository has been archived by the owner. It is now read-only.

Various improvements for SizeMeter and Default #1

Merged
merged 2 commits into from
Mar 14, 2019
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
6 changes: 6 additions & 0 deletions core/src/main/scala/zhukov/Default.scala
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package zhukov

import scala.annotation.implicitNotFound
import scala.collection.generic.CanBuildFrom

import scala.languageFeature.higherKinds

@implicitNotFound("Case class parameter should have default value or instance of zhukov.Default[${T}] should be provided")
final case class Default[T](value: T)
Expand All @@ -18,5 +21,8 @@ object Default {
implicit val boolean: Default[Boolean] = Default(false)
implicit def bytes[T: Bytes]: Default[T] = Default(Bytes[T].empty)
implicit def option[T]: Default[Option[T]] = Default(None)
implicit def emptyCanBuildFrom[A, Col[_]](implicit cbf: CanBuildFrom[Nothing, A, Col[A]]): Default[Col[A]] =
Default(cbf().result())
implicit def map[K, V]: Default[Map[K, V]] = Default(Map.empty[K, V])
}
}
11 changes: 9 additions & 2 deletions core/src/main/scala/zhukov/SizeMeter.scala
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ package zhukov
import zhukov.protobuf.CodedOutputStream
import zhukov.protobuf.CodedOutputStream.{LITTLE_ENDIAN_32_SIZE, LITTLE_ENDIAN_64_SIZE}

sealed trait SizeMeter[T] {
import scala.languageFeature.higherKinds

sealed trait SizeMeter[T] { self =>

def measureValues(values: Iterable[T]): Int = {
var size = 0
Expand All @@ -14,6 +16,10 @@ sealed trait SizeMeter[T] {
}

def measure(value: T): Int

def contramap[U](f: U => T): SizeMeter[U] = new SizeMeter[U] {
def measure(value: U): Int = self.measure(f(value))
}
}

object SizeMeter {
Expand All @@ -31,5 +37,6 @@ object SizeMeter {
implicit val boolean: SizeMeter[Boolean] = SizeMeter(CodedOutputStream.computeBoolSizeNoTag _)
implicit val string: SizeMeter[String] = SizeMeter(CodedOutputStream.computeStringSizeNoTag _)
implicit def bytes[B](implicit bytes: Bytes[B]): SizeMeter[B] = SizeMeter(value => bytes.size(value).toInt)
implicit def option[T](implicit sm: SizeMeter[T]): SizeMeter[Option[T]] = SizeMeter(xs => sm.measureValues(xs))
implicit def iterable[A, Col[_] <: Iterable[A]](implicit sm: SizeMeter[A]): SizeMeter[Col[A]] =
SizeMeter(xs => sm.measureValues(xs.toIterable))
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class ZhukovDerivationMacro(val c: blackbox.Context) {
} else if (ts.isClass && ts.asClass.isTrait && ts.asClass.isSealed) {
sealedTraitUnmarshaller(T, ts.asClass)
} else {
c.abort(c.enclosingPosition, OnlyCaseClassesAndSealedTraitsSupported)
c.abort(c.enclosingPosition, onlyCaseClassesAndSealedTraitsSupported(show(T)))
}
unmarshallerCache.getOrElseUpdate(T, tree)
}
Expand All @@ -41,7 +41,7 @@ class ZhukovDerivationMacro(val c: blackbox.Context) {
caseClassMarshaller(T, companion)
} else if (ts.isClass && ts.asClass.isTrait && ts.asClass.isSealed) {
sealedTraitMarshaller(T, ts.asClass)
} else c.abort(c.enclosingPosition, OnlyCaseClassesAndSealedTraitsSupported)
} else c.abort(c.enclosingPosition, onlyCaseClassesAndSealedTraitsSupported(show(T)))
marshallerCache.getOrElseUpdate(T, tree)
}

Expand All @@ -54,7 +54,7 @@ class ZhukovDerivationMacro(val c: blackbox.Context) {
caseClassSizeMeter(T, companion)
} else if (ts.isClass && ts.asClass.isTrait && ts.asClass.isSealed) {
sealedTraitSizeMeter(T, ts.asClass)
} else c.abort(c.enclosingPosition, OnlyCaseClassesAndSealedTraitsSupported)
} else c.abort(c.enclosingPosition, onlyCaseClassesAndSealedTraitsSupported(show(T)))
sizeMeterCache.getOrElseUpdate(T, tree)
}

Expand Down Expand Up @@ -267,12 +267,8 @@ class ZhukovDerivationMacro(val c: blackbox.Context) {

private def commonUnmarshaller(T: Type, fields: List[Field]): Tree = {
val vars = fields.groupBy(_.varName).mapValues(_.head).collect {
case (name, Field(_, _, _, Some(default), repTpe, Some(tpe), None, false)) if repTpe.typeSymbol == mapSymbol =>
val t1 = tpe.typeArgs.head
val t2 = tpe.typeArgs.last
q"var $name = ${repTpe.typeSymbol.companion}.newBuilder[$t1, $t2] ++= $default"
case (name, Field(_, _, _, Some(default), repTpe, Some(tpe), None, false)) =>
q"var $name = ${repTpe.typeSymbol.companion}.newBuilder[$tpe] ++= $default"
q"var $name = ${repTpe.typeSymbol.companion}.newBuilder[..${tpe.typeArgs}] ++= $default"
case (name, Field(_, _, _, Some(default), repTpe, Some(_), None, true)) =>
q"var $name:$repTpe = $default"
case (name, Field(_, _, _, Some(default), _, None, None, _)) =>
Expand Down Expand Up @@ -417,8 +413,8 @@ class ZhukovDerivationMacro(val c: blackbox.Context) {
"""
}

private val OnlyCaseClassesAndSealedTraitsSupported =
"Zhukov derivation is supported only for case classes and sealed traits"
private def onlyCaseClassesAndSealedTraitsSupported(typeName: String) =
s"Unable to derive $typeName: Zhukov derivation supports only case classes and sealed traits"

private val applyName = TermName("apply")

Expand Down
0