v2 / vlib / v / tests / generics / generic_static_call_test.v
63 lines · 50 sloc · 865 bytes · 6488041a749df9762348d019c4223908c476f2e2
Raw
1module main
2
3type Tag = int
4type Octet = string
5
6fn (o Octet) tag() Tag {
7 return Tag(1)
8}
9
10fn (o Octet) pack() ![]u8 {
11 return o.bytes()
12}
13
14fn (o Octet) bytes() []u8 {
15 s := string(o)
16 return s.bytes()
17}
18
19// static method on concrete type
20fn Octet.unpack(b []u8) Octet {
21 return Octet(b.bytestr())
22}
23
24// This is generic type
25struct Elm[T] {
26mut:
27 val T
28}
29
30fn Elm.new[T](val T) Elm[T] {
31 return Elm[T]{
32 val: val
33 }
34}
35
36fn (el Elm[T]) the_t() T {
37 return el.val
38}
39
40fn Elm.unpack[T](src []u8) !Elm[T] {
41 t := T.unpack(src)
42 return Elm[T]{t}
43}
44
45fn (el Elm[T]) tag() Tag {
46 return el.val.tag()
47}
48
49fn (el Elm[T]) pack() ![]u8 {
50 return el.val.pack()!
51}
52
53fn test_main() {
54 b := Octet('xx')
55 mut el := Elm.new[Octet](b)
56 bytes := el.pack()!
57 assert bytes == [u8(120), 120]
58
59 // unpack
60 ab := Elm.unpack[Octet](bytes)!
61 assert el == ab
62 assert el.the_t() == Octet('xx')
63}
64