Git Product home page Git Product logo

valuevariant's Introduction

ValueVariant

GitHub Nuget Nuget

C# source generator to generate efficient and type-safe variant types for unmanaged types.

Usage

using ValueVariant;

[ValueVariant]
public readonly partial struct SampleVariant: IValueVariant<SampleVariant, int, long, float> { }

will generates

readonly partial struct SampleVariant: IEquatable<SampleVariant>
{
    [StructLayout(LayoutKind.Explicit)]
    private struct Union
    {
        [FieldOffset(0)] int Item1;
        [FieldOffset(0)] long Item2;
        [FieldOffset(0)] float Item3;
    }

    public enum TypeIndex : byte { None, Type1, Type2, Type3 }

    private readonly Union Value;

    public readonly TypeIndex Index;

    public int Item1 => Index == TypeIndex.Type1 ? Value.Item1 : throw new InvalidCastException();
    public long Item2 => Index == TypeIndex.Type2 ? Value.Item2 : throw new InvalidCastException();
    public float Item3 => Index == TypeIndex.Type3 ? Value.Item3 : throw new InvalidCastException();

    public SampleVariant(int value) { ... }
    public SampleVariant(long value) { ... }
    public SampleVariant(float value) { ... }

    public static implicit operator SampleVariant(int value) => new SampleVariant(value);
    public static implicit operator SampleVariant(long value) => new SampleVariant(value);
    public static implicit operator SampleVariant(float value) => new SampleVariant(value);

    public static explicit operator int(SampleVariant value) => value.Item1;
    public static explicit operator long(SampleVariant value) => value.Item2;
    public static explicit operator float(SampleVariant value) => value.Item3;

    public bool Equals(SampleVariant other) { ... }
    public override bool Equals(object obj) { ... }
    public override int GetHashCode() { ... }
    public override string ToString() { ... }

    public static bool operator ==(SampleVariant lhs, SampleVariant rhs) { ... }
    public static bool operator !=(SampleVariant lhs, SampleVariant rhs) { ... }

    ...
}

Type conversion between variant types

[ValueVariant]
public readonly partial struct SampleVariant1 : IValueVariant<SampleVariant1, int, Guid, DateTime>
{
    public static explicit operator SampleVariant1(SampleVariant2 value)
        => value.Accept(SampleVariant2Converter.Instance);

    private sealed class SampleVariant2Converter : DefaultConverter<SampleVariant2Converter>, SampleVariant2.IFuncVisitor<SampleVariant1>
    {
        public SampleVariant1 Visit(in long value) => throw new InvalidCastException();
        public SampleVariant1 Visit(in bool value) => throw new InvalidCastException();
    }
}

[ValueVariant]
public readonly partial struct SampleVariant2 : IValueVariant<SampleVariant2, Guid, DateTime, int, long, bool>
{
    // implicit because SampleVariant1 โŠ‚ SampleVariant2
    public static implicit operator SampleVariant2(SampleVariant1 value)
        => value.Accept(SampleVariant1Converter.Instance);

    private sealed class SampleVariant1Converter : DefaultConverter<SampleVariant1Converter>, SampleVariant1.IFuncVisitor<SampleVariant2> { }
}

valuevariant's People

Contributors

hikarin522 avatar nigarashi avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

nigarashi bargoss

valuevariant's Issues

the DoesNotReturnAttribute should be enabled for NETCOREAPP3_0_OR_GREATER

Currently, the generated code has the following method.

#if NETSTANDARD2_1_OR_GREATER
        [DoesNotReturn]
#endif
        private static TV ThrowInvalidCastException<TV>() => throw new InvalidCastException();

When targeting f.e. .NET7 the attribute is disabled. It'd be nice to have it enabled when NETCOREAPP3_0_OR_GREATER is set.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.