#if USE_SIMD
import simd
#endif


#if USE_SIMD
public typealias Vector4 = SIMD4
#else

public struct Vector4<T: FloatingPoint>: Equatable
{
	public typealias Scalar = T

	public var x, y, z, w: T

	public init() { self.x = 0; self.y = 0; self.z = 0; self.w = 0 }
	public init(_ x: T, _ y: T, _ z: T, _ w: T) { self.x = x; self.y = y; self.z = z; self.w = w }
}

public extension Vector4
{
	// constants
	@inline(__always) static var zero: Self { Self(0, 0, 0, 0) }
	@inline(__always) static var one: Self { Self(1, 1, 1, 1) }

	subscript(index: Int) -> T
	{
		get
		{
			switch index
			{
			case 0: x
			case 1: y
			case 2: z
			case 3: w
			default: fatalError()
			}
		}
	}

	init(_ xyz: Vector3<T>, _ w: T) { self.x = xyz.x; self.y =  xyz.y; self.z = xyz.z; self.w = w }
}

#endif

public extension Vector4 where Scalar: FloatingPoint
{
	@inline(__always) static var X: Self { Self(1, 0, 0, 0) }
	@inline(__always) static var Y: Self { Self(0, 1, 0, 0) }
	@inline(__always) static var Z: Self { Self(0, 0, 1, 0) }
	@inline(__always) static var W: Self { Self(0, 0, 0, 1) }
}


public typealias Vec4f = Vector4<Float>
public typealias Vec4d = Vector4<Double>
