12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- discard """
- output: '''5.0 10.0'''
- """
- type
- MyOpt[T] = object
- case has: bool:
- of true: val: T
- of false: nil
- MyVal = object
- f: ptr float
- proc `=destroy`(x: var MyVal) =
- if x.f != nil:
- dealloc(x.f)
- proc `=sink`(x1: var MyVal, x2: Myval) =
- if x1.f != x2.f:
- `=destroy`(x1)
- x1.f = x2.f
- proc `=`(x1: var MyVal, x2: Myval) =
- if x1.f != x2.f:
- `=destroy`(x1)
- x1.f = create(float)
- x1.f[] = x2.f[]
- proc newVal(x: float): MyVal =
- result.f = create(float)
- result.f[] = x
- template getIt[T, R](self: MyOpt[T], body: untyped, default: R): R =
- if self.has:
- template it: untyped {.inject.} = self.val
- body
- else:
- default
- proc myproc(h: MyOpt[float]) =
- let (a, b) = h.getIt((newVal(it), newVal(it * 2)), (newVal(1.0), newVal(1.0)))
- echo a.f[], " ", b.f[]
- let h = MyOpt[float](has: true, val: 5.0)
- myproc(h)
|