/alias vshCreate(string name) = vshCreate!(functionMixin!("vkCreate"~name), functionMixin!("vkDestroy"~name)); /template vshCreateImpl(alias f_unenforced, alias deconstruct) /if (isCallable!f_unenforced && isCallable!deconstruct) /{ / alias f = enforced!f_unenforced; / alias Params = Parameters!f; / // Returns through last argument as pointer. / static assert (isPointer!(Params[$-1])); / Vsh!(PointerTarget!(Params[$-1])) vshCreate(Parameters!f[0..$-1] args) { / PointerTarget!(Params[$-1]) outPtr; / f(args,&outPtr); / return foreignPtr(outPtr, vshDestroy!deconstruct(args[0..Parameters!deconstruct.length-2],args[$-1])); / } / // Second to last argument allocator. / static assert (is(Params[$-2] == const(VkAllocationCallbacks)*)); / Vsh!(PointerTarget!(Params[$-1])) vshCreate(Params[0..$-2] args) { / PointerTarget!(Params[$-1]) outPtr; / f(args,null,&outPtr); / static if (args[0..Parameters!deconstruct.length-2].length) / return foreignPtr(vshDestroy!deconstruct(args[0..Parameters!deconstruct.length-2]))(outPtr); / else / return foreignPtr!(vshDestroy!deconstruct(args[0..Parameters!deconstruct.length-2]))(outPtr); / } /}