[swift-users] Swift Initializer Generics

Dmitri Gribenko gribozavr at gmail.com
Mon Jan 18 20:47:37 CST 2016


On Mon, Jan 18, 2016 at 6:34 PM, Tyler Fleming Cloutier
<cloutiertyler at aol.com> wrote:
> I suspect I’m misunderstanding your suggestion since I can’t quite work out
> how to do this. I’ve been wrangling the type checker here for a while, but I
> don’t know what the devil to do. With the different syntax for associated
> types, generic parameters, and constraints it’s a bit difficult to explore
> different without knowing exactly what to do.

Here's a sketch.

//
// Mock of the Accelerate library.
//

// For exposition only, use the Accelerate function instead.
func fastDotProductOfDoubles(
  lhs: UnsafeBufferPointer<Double>,
  _ rhs: UnsafeBufferPointer<Double>
) -> Double {
  fatalError("call vDSP_dotprD")
}

// For exposition only, use the Accelerate function instead.
func fastDotProductOfFloats(
  lhs: UnsafeBufferPointer<Float>,
  _ rhs: UnsafeBufferPointer<Float>
) -> Float {
  fatalError("call vDSP_dotpr")
}

// For exposition only, use the Accelerate function instead.
func fastSumOfDoubles(data: UnsafeBufferPointer<Double>) -> Double {
  fatalError("call Accelerate")
}

// For exposition only, use the Accelerate function instead.
func fastSumOfFloats(data: UnsafeBufferPointer<Float>) -> Float {
  fatalError("call Accelerate")
}

//
// Swift wrapper for the Accelerate library.
//

protocol AccelerateFloatingPoint {
  static func _dot(
    lhs: UnsafeBufferPointer<Self>,
    _ rhs: UnsafeBufferPointer<Self>
  ) -> Self

  static func _sum(data: UnsafeBufferPointer<Self>) -> Self
}

extension Float : AccelerateFloatingPoint {
  static func _dot(
    lhs: UnsafeBufferPointer<Float>,
    _ rhs: UnsafeBufferPointer<Float>
  ) -> Float {
    return fastDotProductOfFloats(lhs, rhs)
  }

  static func _sum(data: UnsafeBufferPointer<Float>) -> Float {
    return fastSumOfFloats(data)
  }
}

extension Double : AccelerateFloatingPoint {
  static func _dot(
    lhs: UnsafeBufferPointer<Double>,
    _ rhs: UnsafeBufferPointer<Double>
  ) -> Double {
    return fastDotProductOfDoubles(lhs, rhs)
  }

  static func _sum(data: UnsafeBufferPointer<Double>) -> Double {
    return fastSumOfDoubles(data)
  }
}

func dot<T : AccelerateFloatingPoint>(lhs: [T], _ rhs: [T]) -> T {
  return lhs.withUnsafeBufferPointer {
    (lhs) in
    return rhs.withUnsafeBufferPointer {
      (rhs) in
      return T._dot(lhs, rhs)
    }
  }
}

func sum<T : AccelerateFloatingPoint>(data: [T]) -> T {
  return data.withUnsafeBufferPointer {
    (data) in
    return T._sum(data)
  }
}

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/


More information about the swift-users mailing list