Skip to content
Snippets Groups Projects
Commit 15690a12 authored by Manos Koukoutos's avatar Manos Koukoutos
Browse files

Type cardinality

parent 8c4ea738
No related branches found
No related tags found
No related merge requests found
...@@ -249,4 +249,31 @@ object TypeOps extends GenTreeOps[TypeTree] { ...@@ -249,4 +249,31 @@ object TypeOps extends GenTreeOps[TypeTree] {
transformer.transform(e)(ids) transformer.transform(e)(ids)
} }
} }
def typeCardinality(tp: TypeTree): Option[Int] = tp match {
case Untyped => Some(0)
case BooleanType => Some(2)
case UnitType => Some(1)
case SetType(base) =>
typeCardinality(base).map(b => Math.pow(2, b).toInt)
case FunctionType(from, to) =>
val t = typeCardinality(to).getOrElse(return None)
val f = from.map(typeCardinality).map(_.getOrElse(return None)).product
Some(Math.pow(t, f).toInt)
case MapType(from, to) =>
for {
t <- typeCardinality(to)
f <- typeCardinality(from)
} yield {
Math.pow(t + 1, f).toInt
}
case cct: CaseClassType =>
Some(cct.fields.map { field =>
typeCardinality(field.getType).getOrElse(return None)
}.product)
case act: AbstractClassType =>
Some(act.knownCCDescendants.map(typeCardinality).map(_.getOrElse(return None)).sum)
case _ => None
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment