aboutsummaryrefslogtreecommitdiff
path: root/tests/i/template-classes/program.cps
blob: 90427d3ad1b2abd9c5ed4f6dca1d7761db01ad63 (plain)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

TEMPLATE <T>
CLASS Box
    PRIVATE Value : T
    PUBLIC OVERLOAD PROCEDURE NEW()
    ENDPROCEDURE
    PUBLIC OVERLOAD PROCEDURE NEW(V : T)
        Value <- V
    ENDPROCEDURE
    PUBLIC FUNCTION Get() RETURNS T
        RETURN Value
    ENDFUNCTION
    PUBLIC PROCEDURE Set(V : T)
        Value <- V
    ENDPROCEDURE
ENDCLASS

TEMPLATE <T>
FUNCTION Make() RETURNS T
    DECLARE Value : T
    RETURN Value
ENDFUNCTION

TEMPLATE <A, B>
CLASS Pair
    First : A
    Second : B
    PROCEDURE NEW(Left : A, Right : B)
        First <- Left
        Second <- Right
    ENDPROCEDURE
ENDCLASS

TEMPLATE <T>
CLASS Stack3
    PRIVATE First : T
    PRIVATE Second : T
    PRIVATE Third : T
    PRIVATE Count : INTEGER
    PROCEDURE Push(Value : T)
        Count <- Count + 1
        CASE OF Count
            1 : First <- Value
            2 : Second <- Value
            3 : Third <- Value
        ENDCASE
    ENDPROCEDURE
    FUNCTION Pop() RETURNS T
        Count <- Count - 1
        CASE OF Count
            2 : RETURN Third
            1 : RETURN Second
            OTHERWISE : RETURN First
        ENDCASE
    ENDFUNCTION
ENDCLASS

OVERLOAD PROCEDURE PrintAll()
ENDPROCEDURE
TEMPLATE <T, Rest...>
OVERLOAD PROCEDURE PrintAll(First : T, Others : Rest...)
    OUTPUT First
    CALL PrintAll(Others...)
ENDPROCEDURE

TEMPLATE <Types...>
CLASS Group
    PROCEDURE Show(Values : Types...)
        CALL PrintAll(Values...)
    ENDPROCEDURE
ENDCLASS
TEMPLATE <Types...>
PROCEDURE ShowGroup(Values : Types...)
    DECLARE Items : Group<Types...>
    CALL Items.Show(Values...)
ENDPROCEDURE

// Instantiation during the type pre-pass defers the Box method prototypes.
TYPE Holder
    DECLARE Item : Box<INTEGER>
ENDTYPE
OUTPUT Make<Box<BOOLEAN>>().Get()
DECLARE H : Holder
OUTPUT H.Item.Get()
DECLARE B : Box<INTEGER>(7)
OUTPUT B.Get()
DECLARE P : Pair<INTEGER, REAL>(3, 2.5)
OUTPUT P.First
OUTPUT P.Second
DECLARE S : Stack3<INTEGER>
CALL S.Push(10)
CALL S.Push(20)
CALL S.Push(30)
OUTPUT S.Pop()
OUTPUT S.Pop()
OUTPUT S.Pop()
B <- NEW Box<INTEGER>(5)
OUTPUT B.Get()
DELETE B
DECLARE Inner : Box<INTEGER>(9)
DECLARE Outer : Box<Box<INTEGER>>(Inner)
OUTPUT Outer.Get().Get()
DECLARE Text : Box<STRING>("alpha")
DECLARE Copy : Box<STRING>
Copy <- Text
CALL Text.Set("beta")
OUTPUT Copy.Get()
OUTPUT Text.Get()
DECLARE Values : Group<INTEGER, REAL, CHAR>
CALL Values.Show(1, 2.5, 'c')
CALL ShowGroup()