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

Type cardinality

parent 8c4ea738
Branches
Tags
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