Skip to content

Commit e132e80

Browse files
committed
add new method WithType to add types to a OneOf
- also added the README to the solution
1 parent cfe1c4d commit e132e80

File tree

68 files changed

+535
-264
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+535
-264
lines changed

Generator/Program.cs

+11-4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77
using System.Collections.Generic;
88

99
var sourceRoot = GetFullPath(Combine(GetDirectoryName(GetExecutingAssembly().Location)!, @"..\..\..\.."));
10+
const int extendedSizeLimit = 10;
1011

11-
for (var i = 1; i < 10; i++) {
12+
for (var i = 1; i < extendedSizeLimit; i++) {
1213
var output = GetContent(true, i);
1314
var outpath = Combine(sourceRoot, $"OneOf\\OneOfT{i - 1}.generated.cs");
1415
File.WriteAllText(outpath, output);
@@ -18,7 +19,7 @@
1819
File.WriteAllText(outpath2, output2);
1920
}
2021

21-
for (var i = 10; i < 33; i++) {
22+
for (var i = extendedSizeLimit; i < 33; i++) {
2223
var output3 = GetContent(true, i);
2324
var outpath3 = Combine(sourceRoot, $"OneOf.Extended\\OneOfT{i - 1}.generated.cs");
2425
File.WriteAllText(outpath3, output3);
@@ -49,13 +50,13 @@ namespace OneOf
4950
readonly int _index;
5051
5152
{IfStruct( // constructor
52-
$@"OneOf(int index, {RangeJoined(", ", j => $"T{j} value{j} = default")})
53+
$@"internal OneOf(int index, {RangeJoined(", ", j => $"T{j} value{j} = default")})
5354
{{
5455
_index = index;
5556
{RangeJoined(@"
5657
", j => $"_value{j} = value{j};")}
5758
}}",
58-
$@"protected OneOfBase(OneOf<{genericArg}> input)
59+
$@"protected internal OneOfBase(OneOf<{genericArg}> input)
5960
{{
6061
_index = input.Index;
6162
switch (_index)
@@ -77,6 +78,12 @@ namespace OneOf
7778
7879
public int Index => _index;
7980
81+
{((i < extendedSizeLimit - 1) ?
82+
// can go up to the limit before extended because OneOfT8 cannot see OneOfT9
83+
$@"public OneOf<{genericArg}, TNew> WithType<TNew>() =>
84+
new OneOf<{genericArg}, TNew>(_index, {RangeJoined(", ", j => $"_value{j}")}, default);
85+
":"")}
86+
8087
{RangeJoined(@"
8188
", j=> $"public bool IsT{j} => _index == {j};")}
8289

OneOf.Extended/OneOfBaseT10.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> : IOneOf
1818
readonly T10 _value10;
1919
readonly int _index;
2020

21-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> input)
21+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> input)
2222
{
2323
_index = input.Index;
2424
switch (_index)
@@ -57,6 +57,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> input)
5757

5858
public int Index => _index;
5959

60+
61+
6062
public bool IsT0 => _index == 0;
6163
public bool IsT1 => _index == 1;
6264
public bool IsT2 => _index == 2;
@@ -458,7 +460,7 @@ public bool TryPickT10(out T10 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
458460
_ => throw new InvalidOperationException()
459461
};
460462
return this.IsT10;
461-
}
463+
}
462464

463465
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> other) =>
464466
_index == other._index &&
@@ -531,4 +533,4 @@ public override int GetHashCode()
531533
}
532534
}
533535
}
534-
}
536+
}

OneOf.Extended/OneOfBaseT11.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> : IOneO
1919
readonly T11 _value11;
2020
readonly int _index;
2121

22-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> input)
22+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> input)
2323
{
2424
_index = input.Index;
2525
switch (_index)
@@ -60,6 +60,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> inpu
6060

6161
public int Index => _index;
6262

63+
64+
6365
public bool IsT0 => _index == 0;
6466
public bool IsT1 => _index == 1;
6567
public bool IsT2 => _index == 2;
@@ -508,7 +510,7 @@ public bool TryPickT11(out T11 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
508510
_ => throw new InvalidOperationException()
509511
};
510512
return this.IsT11;
511-
}
513+
}
512514

513515
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> other) =>
514516
_index == other._index &&
@@ -584,4 +586,4 @@ public override int GetHashCode()
584586
}
585587
}
586588
}
587-
}
589+
}

OneOf.Extended/OneOfBaseT12.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> :
2020
readonly T12 _value12;
2121
readonly int _index;
2222

23-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> input)
23+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> input)
2424
{
2525
_index = input.Index;
2626
switch (_index)
@@ -63,6 +63,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
6363

6464
public int Index => _index;
6565

66+
67+
6668
public bool IsT0 => _index == 0;
6769
public bool IsT1 => _index == 1;
6870
public bool IsT2 => _index == 2;
@@ -560,7 +562,7 @@ public bool TryPickT12(out T12 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
560562
_ => throw new InvalidOperationException()
561563
};
562564
return this.IsT12;
563-
}
565+
}
564566

565567
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> other) =>
566568
_index == other._index &&
@@ -639,4 +641,4 @@ public override int GetHashCode()
639641
}
640642
}
641643
}
642-
}
644+
}

OneOf.Extended/OneOfBaseT13.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T1
2121
readonly T13 _value13;
2222
readonly int _index;
2323

24-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> input)
24+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> input)
2525
{
2626
_index = input.Index;
2727
switch (_index)
@@ -66,6 +66,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
6666

6767
public int Index => _index;
6868

69+
70+
6971
public bool IsT0 => _index == 0;
7072
public bool IsT1 => _index == 1;
7173
public bool IsT2 => _index == 2;
@@ -614,7 +616,7 @@ public bool TryPickT13(out T13 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
614616
_ => throw new InvalidOperationException()
615617
};
616618
return this.IsT13;
617-
}
619+
}
618620

619621
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> other) =>
620622
_index == other._index &&
@@ -696,4 +698,4 @@ public override int GetHashCode()
696698
}
697699
}
698700
}
699-
}
701+
}

OneOf.Extended/OneOfBaseT14.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T1
2222
readonly T14 _value14;
2323
readonly int _index;
2424

25-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> input)
25+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> input)
2626
{
2727
_index = input.Index;
2828
switch (_index)
@@ -69,6 +69,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
6969

7070
public int Index => _index;
7171

72+
73+
7274
public bool IsT0 => _index == 0;
7375
public bool IsT1 => _index == 1;
7476
public bool IsT2 => _index == 2;
@@ -670,7 +672,7 @@ public bool TryPickT14(out T14 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
670672
_ => throw new InvalidOperationException()
671673
};
672674
return this.IsT14;
673-
}
675+
}
674676

675677
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> other) =>
676678
_index == other._index &&
@@ -755,4 +757,4 @@ public override int GetHashCode()
755757
}
756758
}
757759
}
758-
}
760+
}

OneOf.Extended/OneOfBaseT15.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T1
2323
readonly T15 _value15;
2424
readonly int _index;
2525

26-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> input)
26+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> input)
2727
{
2828
_index = input.Index;
2929
switch (_index)
@@ -72,6 +72,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
7272

7373
public int Index => _index;
7474

75+
76+
7577
public bool IsT0 => _index == 0;
7678
public bool IsT1 => _index == 1;
7779
public bool IsT2 => _index == 2;
@@ -728,7 +730,7 @@ public bool TryPickT15(out T15 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
728730
_ => throw new InvalidOperationException()
729731
};
730732
return this.IsT15;
731-
}
733+
}
732734

733735
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> other) =>
734736
_index == other._index &&
@@ -816,4 +818,4 @@ public override int GetHashCode()
816818
}
817819
}
818820
}
819-
}
821+
}

OneOf.Extended/OneOfBaseT16.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T1
2424
readonly T16 _value16;
2525
readonly int _index;
2626

27-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> input)
27+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> input)
2828
{
2929
_index = input.Index;
3030
switch (_index)
@@ -75,6 +75,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
7575

7676
public int Index => _index;
7777

78+
79+
7880
public bool IsT0 => _index == 0;
7981
public bool IsT1 => _index == 1;
8082
public bool IsT2 => _index == 2;
@@ -788,7 +790,7 @@ public bool TryPickT16(out T16 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
788790
_ => throw new InvalidOperationException()
789791
};
790792
return this.IsT16;
791-
}
793+
}
792794

793795
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> other) =>
794796
_index == other._index &&
@@ -879,4 +881,4 @@ public override int GetHashCode()
879881
}
880882
}
881883
}
882-
}
884+
}

OneOf.Extended/OneOfBaseT17.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T1
2525
readonly T17 _value17;
2626
readonly int _index;
2727

28-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> input)
28+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> input)
2929
{
3030
_index = input.Index;
3131
switch (_index)
@@ -78,6 +78,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
7878

7979
public int Index => _index;
8080

81+
82+
8183
public bool IsT0 => _index == 0;
8284
public bool IsT1 => _index == 1;
8385
public bool IsT2 => _index == 2;
@@ -850,7 +852,7 @@ public bool TryPickT17(out T17 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
850852
_ => throw new InvalidOperationException()
851853
};
852854
return this.IsT17;
853-
}
855+
}
854856

855857
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17> other) =>
856858
_index == other._index &&
@@ -944,4 +946,4 @@ public override int GetHashCode()
944946
}
945947
}
946948
}
947-
}
949+
}

OneOf.Extended/OneOfBaseT18.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T1
2626
readonly T18 _value18;
2727
readonly int _index;
2828

29-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> input)
29+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> input)
3030
{
3131
_index = input.Index;
3232
switch (_index)
@@ -81,6 +81,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
8181

8282
public int Index => _index;
8383

84+
85+
8486
public bool IsT0 => _index == 0;
8587
public bool IsT1 => _index == 1;
8688
public bool IsT2 => _index == 2;
@@ -914,7 +916,7 @@ public bool TryPickT18(out T18 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
914916
_ => throw new InvalidOperationException()
915917
};
916918
return this.IsT18;
917-
}
919+
}
918920

919921
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18> other) =>
920922
_index == other._index &&
@@ -1011,4 +1013,4 @@ public override int GetHashCode()
10111013
}
10121014
}
10131015
}
1014-
}
1016+
}

OneOf.Extended/OneOfBaseT19.generated.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T1
2727
readonly T19 _value19;
2828
readonly int _index;
2929

30-
protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> input)
30+
protected internal OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> input)
3131
{
3232
_index = input.Index;
3333
switch (_index)
@@ -84,6 +84,8 @@ protected OneOfBase(OneOf<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
8484

8585
public int Index => _index;
8686

87+
88+
8789
public bool IsT0 => _index == 0;
8890
public bool IsT1 => _index == 1;
8991
public bool IsT2 => _index == 2;
@@ -980,7 +982,7 @@ public bool TryPickT19(out T19 value, out OneOf<T0, T1, T2, T3, T4, T5, T6, T7,
980982
_ => throw new InvalidOperationException()
981983
};
982984
return this.IsT19;
983-
}
985+
}
984986

985987
bool Equals(OneOfBase<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> other) =>
986988
_index == other._index &&
@@ -1080,4 +1082,4 @@ public override int GetHashCode()
10801082
}
10811083
}
10821084
}
1083-
}
1085+
}

0 commit comments

Comments
 (0)