1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import generic._
import Tree._
import List._
import java.io._
import Shapes._
import SearchResult._
object Test {
import Serialization._
private var lCount, tCount, sCount = 0
// ------- Code that will eventually be produced by macros -------------
implicit def ListSerializable[Elem](implicit es: Serializable[Elem]): Serializable[List[Elem]] = {
implicit lazy val lsElem: Serializable[List[Elem]] = {
lCount += 1 // test code to verify we create bounded number of Serializables
RecSerializable[List[Elem], List.Shape[Elem]]
}
lsElem
}
implicit def TreeSerializable[R]: Serializable[Tree[R]] = {
implicit lazy val tR: Serializable[Tree[R]] = {
tCount += 1 // test code to verify we create bounded number of Serializables
RecSerializable[Tree[R], Tree.Shape[R]]
}
tR
}
implicit lazy val tsInt: Serializable[Tree[Int]] = TreeSerializable[Int]
implicit lazy val tsBoolean: Serializable[Tree[Boolean]] = TreeSerializable[Boolean]
implicit lazy val SearchResultSerializable: Serializable[SearchResult] = {
sCount += 1
RecSerializable[SearchResult, SearchResult.Shape]
}
// ------- Test code --------------------------------------------------------
/** Serialize data, then deserialize it back and check that it is the same. */
def sds[D](data: D)(implicit ser: Serializable[D]) = {
val outBytes = new ByteArrayOutputStream
val out = new DataOutputStream(outBytes)
ser.write(data, out)
out.flush()
val inBytes = new ByteArrayInputStream(outBytes.toByteArray)
val in = new DataInputStream(inBytes)
val result = ser.read(in)
assert(data == result, s"$data != $result")
}
val data1 =
Cons(1, Cons(2, Cons(3, Nil)))
val data2 =
If(IsZero(Pred(Succ(Zero))), Succ(Succ(Zero)), Pred(Pred(Zero)))
val data3 = Cons(Color.Red, Cons(Color.Green, Cons(Color.Blue, Nil)))
val data4 = Ambiguous(Success(Color.Green), Diverging)
def main(args: Array[String]) = {
sds(data1)
assert(lCount == 1, lCount)
sds(data2)
assert(tCount == 2, tCount)
sds(data3)
assert(lCount == 2, lCount)
sds(data4)
assert(sCount == 1, sCount)
}
}
|