diff options
| author | _ov4 <ov4@ov4.org> | 2026-10-21 06:14:00 +0000 |
|---|---|---|
| committer | _ov4 <ov4@ov4.org> | 2026-10-21 06:14:00 +0000 |
| commit | db8c7f14d2f74c3db205782acf8222cb7d91a047 (patch) | |
| tree | 31b6e17c0cb818ba0cc700cd1e0ca896a6b9156f /tests/i/template-classes/program.cps | |
| parent | 25ae363250e479701ed532c55c255e043c8240da (diff) | |
feat(codegen): instantiate class templates
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'tests/i/template-classes/program.cps')
| -rw-r--r-- | tests/i/template-classes/program.cps | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/tests/i/template-classes/program.cps b/tests/i/template-classes/program.cps new file mode 100644 index 0000000..90427d3 --- /dev/null +++ b/tests/i/template-classes/program.cps @@ -0,0 +1,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() |
