msvc config
[prop.git] / tests / test_gc9.pcc
blob264692131a1519de4ad5fcb293eca47acd9e4ccc
1 //
2 //  Simple example to garbage collection.
3 //
5 #include <new>
6 #include <iostream.h>
7 #include <AD/gc/markswp.h>
9 MarkSweepGC marksweep_gc;
12 //  Define an algebraic datatype.
14 datatype EXP :: collectable = om
15                             | num (int)
16                             | var (char)
17                             | add (EXP, EXP)
18                             | sub (EXP, EXP)
19                             | mul (EXP, EXP)
20                             | div (EXP, EXP)
21                             ;
23 instantiate datatype EXP;
26 //  Define a method that prints an expression.  This is simple
27 //  inductive definition
29 ostream& operator << (ostream& f, EXP e)
30 {  match (e) {
31       om:       { return f << "om"; }
32    |  num i:    { return f << i; }
33    |  var v:    { return f << v; }
34    |  add(a,b): { return f << '(' << a << " + " << b << ')'; }
35    |  sub(a,b): { return f << '(' << a << " - " << b << ')'; }
36    |  mul(a,b): { return f << '(' << a << " * " << b << ')'; }
37    |  div(a,b): { return f << '(' << a << " / " << b << ')'; }
38    }
42 //  Change all occurance of var(...) to t
44 void change (EXP& e, EXP t)
45 {  match (e) {
46       om:       
47    |  num i:    { e = add(e,add(e,e)); }
48    |  var v:    { e = t; }
49    |  add(a,b): { change(a,t); change(b,t); }
50    |  sub(a,b): { change(a,t); change(b,t); }
51    |  mul(a,b): { change(a,t); change(b,t); }
52    |  div(a,b): { change(a,t); change(b,t); }
53    }
57 //  Do a bunch of stuff that cons a lot
59 void do_something()
61    //
62    // (0 + x * 2) / (1 * 5 + 1 * 3) / (0 / y);
63    //
64    EXP t1   = div(div(add(num(0), mul(var('x'),num(2))), 
65                       add(mul(num(1), num(5)),mul(num(1),num(3)))),
66                   div(num(0),var('y')));
67    EXP t2   = add(t1,t1);
68    EXP term = div(mul(t2,t2),t2);
69    t2       = om;
71    cout << "[1] " << term << '\n';
73    change(term,num(-2));
74    cout << "[2] " << term << '\n';
76    term = t1; t1 = num(-1);
77    cout << "[3] " << term << '\n';
79    term = om; t1 = om;
80    cout << "[4] " << term << '\n';
82   
83 int main()
85    GC::set_default_gc(marksweep_gc);
86    do_something();
87    // start a collection.
88    GC::garbage_collect();
89    return 0;