@@ -13,17 +13,32 @@ object MyMap {
13
13
def create [Keys ](implicit s : Size [Keys ]): MyMap [Keys ] = new MyMap [Keys ](new Array [Int ](s.size))
14
14
}
15
15
16
- trait Size [Keys ] { def size : Int }
16
+ class Size [HList ]( val size : Int ) extends AnyVal
17
17
object Size {
18
- def apply [Keys ](v : Int ): Size [Keys ] = new Size { def size = v }
19
- implicit val unit : Size [Unit ] = Size (0 )
20
- implicit def cons [H , T ](implicit s : Size [T ]): Size [(H , T )] = Size (s.size + 1 )
18
+ type HList = Cons [_, _] | Unit
19
+ type Cons [H , T <: HList ] = (H , T )
20
+
21
+ implicit inline def getSize [HL <: HList ]: Size [HL ] = ~ sizeImpl(Universe .compilationUniverse)(' [HL ])
22
+
23
+ def sizeImpl [HL <: HList ](u : Universe )(implicit keys : Type [HL ]): Expr [Size [HL ]] = {
24
+ import u ._
25
+ import u .tasty ._
26
+
27
+ def sizeOf (tp : TypeOrBounds ): Int = tp match {
28
+ case Type .AppliedType (_, h :: t :: Nil ) => 1 + sizeOf(t)
29
+ case _ => 0
30
+ }
31
+
32
+ val size = sizeOf(keys.toTasty.tpe)
33
+
34
+ '(new Size(~size.toExpr))
35
+ }
21
36
}
22
37
23
38
class Index [K , Keys ](val index : Int ) extends AnyVal
24
39
object Index {
25
40
26
- implicit def zero [K , T ]: Index [K , (K , T )] = new Index (0 )
41
+ implicit inline def zero [K , T ]: Index [K , (K , T )] = new Index (0 )
27
42
28
43
implicit inline def succ [K , H , T ](implicit prev : => Index [K , T ]): Index [K , (H , T )] = ~ succImpl(Universe .compilationUniverse)(' [K ], ' [H ], ' [T ])
29
44
0 commit comments