Skip to content

[API Proposal]: Vector.Create #94384

Closed
Closed
@EgorBo

Description

@EgorBo

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions