discard """ output: '''5.0 10.0 =destroy =destroy ''' """ 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) #------------------------------------------------------------- type MyObject* = object len*: int amount: UncheckedArray[float] MyObjPtr* = ptr MyObject MyObjContainer* {.byref.} = object size1: int size2: int data: ptr UncheckedArray[MyObjPtr] proc size1*(m: MyObjContainer): int {.inline.} = m.size1 proc size2*(m: MyObjContainer): int {.inline.} = m.size2 proc allocateMyObjPtr(size2: int): MyObjPtr = cast[MyObjPtr](allocShared(sizeof(MyObject) + sizeof(float) * size2.int)) proc `=destroy`*(m: var MyObjContainer) {.inline.} = if m.data != nil: for i in 0.. 0, "MyObjContainer is not initialized, use newMyObjContainer() to initialize object before use" let cf = allocateMyObjPtr(m.size2) for i in 0..