Closed
Description
Background and motivation
Currently, when we need to create a vector from a scalar or array, we do:
_ = Vector64.Create(42);
_ = Vector128.Create(42);
_ = Vector256.Create(42);
_ = Vector512.Create(42);
_ = new Vector2(42);
_ = new Vector3(42);
_ = new Vector4(42);
_ = new Vector<int>(42);
I propose we add Create
methods to Vector2/3/4
and Vector<>
too for slightly better consistency.
API Proposal
namespace System.Numerics
{
public static class Vector
{
public static Vector<T> Create<T>(T value);
public static Vector<T> Create<T>(ReadOnlySpan<T> values);
public static Quaternion AsQuaternion(this Vector4 value);
public static Plane AsPlane(this Vector4 value);
public static Vector2 AsVector2(this Vector4 value);
public static Vector3 AsVector3(this Vector4 value);
public static Vector4 AsVector4(this Quaternion value);
public static Vector4 AsVector4(this Plane value);
public static Vector4 AsVector4(this Vector2 value);
public static Vector4 AsVector4(this Vector3 value);
public static Vector4 AsVector4Unsafe(this Vector2 value);
public static Vector4 AsVector4Unsafe(this Vector3 value);
}
public struct Vector2
{
public static Vector2 Create(float value);
public static Vector2 Create(float x, float y);
public static Vector2 Create(ReadOnlySpan<float> values);
}
public struct Vector3
{
public static Vector3 Create(float value);
public static Vector3 Create(float x, float y, float z);
public static Vector3 Create(Vector2 vector, float z);
public static Vector3 Create(ReadOnlySpan<float> values);
}
public struct Vector4
{
public static Vector4 Create(float value);
public static Vector4 Create(float x, float y, float z, float w);
public static Vector4 Create(Vector2 vector, float z, float w);
public static Vector4 Create(Vector3 vector, float w);
public static Vector4 Create(ReadOnlySpan<float> values);
}
}
namespace System.Runtime.Intrinsics
{
public static class Vector128
{
public static Vector128<float> AsVector128Unsafe(this Vector2 value);
public static Vector128<float> AsVector128Unsafe(this Vector3 value);
public static Vector128<float> AsVector128Unsafe(this Vector4 value);
}
}
We might also add T[] values, int offset
and Span<T>
overloads.
API Usage
Vector<int> v = Vector.Create(42);
Alternative Designs
No response
Risks
No response