55 lines
915 B
V
55 lines
915 B
V
import math
|
|
|
|
struct Any {
|
|
mut:
|
|
data voidptr
|
|
typ int
|
|
}
|
|
|
|
fn make_any<T>(obj T) Any {
|
|
tsize := int(sizeof(T))
|
|
mut a := Any{
|
|
typ: T.typ
|
|
data: unsafe { malloc(tsize) }
|
|
}
|
|
unsafe {
|
|
vmemcpy(a.data, &obj, tsize)
|
|
}
|
|
return a
|
|
}
|
|
|
|
fn cast<T>(obj Any) ?T {
|
|
if T.typ == obj.typ {
|
|
return *&T(obj.data)
|
|
}
|
|
return none
|
|
}
|
|
|
|
fn test_any_values() {
|
|
arr := [make_any(true), make_any(false), make_any(7), make_any('cat'),
|
|
make_any([3.1415926535])]
|
|
for elm in arr {
|
|
if b := cast<bool>(elm) {
|
|
println(!b)
|
|
} else if i := cast<int>(elm) {
|
|
println(i + 1)
|
|
} else if s := cast<string>(elm) {
|
|
println(s + '!')
|
|
} else if f := cast<[]f64>(elm) {
|
|
println(f[0])
|
|
}
|
|
}
|
|
if b := cast<bool>(arr[0]) {
|
|
assert b == true
|
|
}
|
|
if b := cast<bool>(arr[1]) {
|
|
assert b == false
|
|
}
|
|
if s := cast<string>(arr[3]) {
|
|
assert s == 'cat'
|
|
}
|
|
if f := cast<[]f64>(arr[4]) {
|
|
assert math.veryclose(f[0], 3.1415926535)
|
|
}
|
|
}
|