CGPointとSIMD

CGPointを触り出すと、いつもelementwiseな四則演算が使いたくなる。

演算子オーバーロードはお行儀が悪い気がして、SIMDプロトコルで解決した例をメモ。

 

extension CGPoint: SIMD {

    public typealias MaskStorage = SIMD2<CGFloat.NativeType>.MaskStorage

    public subscript(index: Int) -> CGFloat {

        get {

            index == 0 ? x : y

        }

        set(newValue) {

            x = index == 0 ? newValue : x

            y = index != 0 ? newValue : y

        }

    }

    public var scalarCount: Int {

        2

    }

    public typealias Scalar = CGFloat

}