[swift-users] Chaining struct-mutating funcs
Dave Abrahams
dabrahams at apple.com
Mon Aug 8 12:59:23 CDT 2016
on Fri Aug 05 2016, Joe Groff <swift-users-AT-swift.org> wrote:
> Since your backing buffer is copy-on-write, you can do the in-place
> mutation optimization in your immutable implementations, something
> like this:
>
> class C {
> var value: Int
> init(value: Int) { self.value = value }
> }
>
> struct S { var c: C }
>
> func addInts(x: S, y: S) -> S {
> var tmp = x
> // Don't use x after this point so that it gets forwarded into tmp
> if isKnownUniquelyReferenced(&tmp.c) {
> tmp.c.value += y.c.value
> return tmp
> } else {
> return S(c: C(value: tmp.c.value + y.c.value))
> }
> }
>
> which should let you get similar efficiency to the mutating
> formulation while using semantically immutable values.
Yep, that works. The only other trick I know of is to create a
composition of operations that you apply at the end with an operator:
pixelXes <- multiply(perspectiveCorrections).sin
speeds <- multiply(pixelXes)
.multiply(feetToMeters)
.subtract(cameraSpeed.mean)
let sumSquaredOfResiduals = speeds.sumOfSquares
HTH,
--
-Dave
More information about the swift-users
mailing list