Skip to content

C# Source Generator for creating methods that return optimized ReadOnlySpan<T> static data from primitive values.

License

Notifications You must be signed in to change notification settings

iiweis/PrimitiveStaticDataGenerator

Repository files navigation

PrimitiveStaticDataGenerator

Nuget

Note

This library was created at a time when optimization using ReadOnlySpan for constant arrays had the limitation that it did not apply to primitive types that are not single byte.

Since this restriction has been removed by the support of dotnet/roslyn#61414, there is little point in using this library in .NET 7 and later environments.
For more information on dotnet/roslyn#61414, check out Performance Improvements in .NET 8 | Initialization.

Usage

user code

using System;
using PrimitiveStaticDataGenerator;

namespace MyCode
{
    public partial class UserClass
    {
        [return: PrimitiveStaticData(1, 2, 3, 4, 5)]
        public static partial ReadOnlySpan<int> Int();
        
        [return: PrimitiveStaticData('A', 'B', 'C')]
        public static partial ReadOnlySpan<char> Char();
    }
}

generated code(example)

MyCode.UserClass.Char.cs
using System;
using PrimitiveStaticDataGenerator;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

namespace MyCode
{
    public partial class UserClass
    {
        public static partial ReadOnlySpan<char> Char()
        {
            ReadOnlySpan<byte> span;
            if (BitConverter.IsLittleEndian)
            {
                span = new byte[]
                {
                    65,
                    0,
                    66,
                    0,
                    67,
                    0
                };
            }
            else
            {
                span = new byte[]
                {
                    0,
                    65,
                    0,
                    66,
                    0,
                    67
                };
            }

            return MemoryMarshal.CreateReadOnlySpan(ref Unsafe.As<byte, char>(ref MemoryMarshal.GetReference(span)), 3);
        }
    }
}
MyCode.UserClass.Int.cs
using System;
using PrimitiveStaticDataGenerator;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;

namespace MyCode
{
    public partial class UserClass
    {
        public static partial ReadOnlySpan<int> Int()
        {
            ReadOnlySpan<byte> span;
            if (BitConverter.IsLittleEndian)
            {
                span = new byte[]
                {
                    1,
                    0,
                    0,
                    0,
                    2,
                    0,
                    0,
                    0,
                    3,
                    0,
                    0,
                    0,
                    4,
                    0,
                    0,
                    0,
                    5,
                    0,
                    0,
                    0
                };
            }
            else
            {
                span = new byte[]
                {
                    0,
                    0,
                    0,
                    1,
                    0,
                    0,
                    0,
                    2,
                    0,
                    0,
                    0,
                    3,
                    0,
                    0,
                    0,
                    4,
                    0,
                    0,
                    0,
                    5
                };
            }

            return MemoryMarshal.CreateReadOnlySpan(ref Unsafe.As<byte, int>(ref MemoryMarshal.GetReference(span)), 5);
        }
    }
}

Supported Types

  • bool
  • char
  • sbyte
  • byte
  • short
  • ushort
  • int
  • uint
  • long
  • ulong
  • float
  • double
  • string

About

C# Source Generator for creating methods that return optimized ReadOnlySpan<T> static data from primitive values.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages