Skip to content

Commit b589af6

Browse files
committed
Resolve Enum values accessor as underlying type accessor
1 parent 4ef287c commit b589af6

1 file changed

Lines changed: 64 additions & 45 deletions

File tree

Orm/Xtensive.Orm/Tuples/Packed/TupleLayout.cs

Lines changed: 64 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ private ref struct Counters
3232
public int Val128Counter;
3333
}
3434

35-
private static class ValueFieldAccessorResolver
35+
private static class ValueFieldAccessorResolver
3636
{
3737
private static readonly ValueFieldAccessor BoolAccessor = new BooleanFieldAccessor();
3838
private static readonly ValueFieldAccessor ByteAccessor = new ByteFieldAccessor();
@@ -60,56 +60,75 @@ private static class ValueFieldAccessorResolver
6060
public static ValueFieldAccessor GetValue(Type probeType)
6161
{
6262
return (probeType.MetadataToken ^ NullableTypeMetadataToken) == 0
63-
? ResolveByNullableType(probeType)
64-
: ResolveByType(probeType);
65-
66-
ValueFieldAccessor ResolveByType(Type type)
67-
{
68-
return ReferenceEquals(type, WellKnownTypes.Int64) ? Int64Accessor :
69-
ReferenceEquals(type, WellKnownTypes.Guid) ? GuidAccessor :
70-
ReferenceEquals(type, WellKnownTypes.Int32) ? Int32Accessor :
71-
ReferenceEquals(type, WellKnownTypes.Bool) ? BoolAccessor :
72-
ReferenceEquals(type, WellKnownTypes.DateTime) ? DateTimeAccessor :
73-
ReferenceEquals(type, WellKnownTypes.TimeSpan) ? TimeSpanAccessor :
74-
ReferenceEquals(type, WellKnownTypes.Double) ? DoubleAccessor :
75-
ReferenceEquals(type, WellKnownTypes.Decimal) ? DecimalAccessor :
76-
ReferenceEquals(type, WellKnownTypes.Single) ? SingleAccessor :
77-
ReferenceEquals(type, WellKnownTypes.DateTimeOffset) ? DateTimeOffsetAccessor :
63+
? (ResolveByNullableType(probeType) ?? TryResolveEnum(probeType))
64+
: (ResolveByType(probeType) ?? TryResolveEnum(probeType));
65+
}
66+
67+
private static ValueFieldAccessor ResolveByType(Type type)
68+
{
69+
return ReferenceEquals(type, WellKnownTypes.Int64) ? Int64Accessor :
70+
ReferenceEquals(type, WellKnownTypes.Guid) ? GuidAccessor :
71+
ReferenceEquals(type, WellKnownTypes.Int32) ? Int32Accessor :
72+
ReferenceEquals(type, WellKnownTypes.Bool) ? BoolAccessor :
73+
ReferenceEquals(type, WellKnownTypes.DateTime) ? DateTimeAccessor :
74+
ReferenceEquals(type, WellKnownTypes.TimeSpan) ? TimeSpanAccessor :
75+
ReferenceEquals(type, WellKnownTypes.Double) ? DoubleAccessor :
76+
ReferenceEquals(type, WellKnownTypes.Decimal) ? DecimalAccessor :
77+
ReferenceEquals(type, WellKnownTypes.Single) ? SingleAccessor :
78+
ReferenceEquals(type, WellKnownTypes.DateTimeOffset) ? DateTimeOffsetAccessor :
7879
#if NET6_0_OR_GREATER
79-
ReferenceEquals(type, WellKnownTypes.DateOnly) ? DateOnlyAccessor :
80-
ReferenceEquals(type, WellKnownTypes.TimeOnly) ? TimeOnlyAccessor :
80+
ReferenceEquals(type, WellKnownTypes.DateOnly) ? DateOnlyAccessor :
81+
ReferenceEquals(type, WellKnownTypes.TimeOnly) ? TimeOnlyAccessor :
8182
#endif
82-
ReferenceEquals(type, WellKnownTypes.Int16) ? Int16Accessor :
83-
ReferenceEquals(type, WellKnownTypes.Byte) ? ByteAccessor :
84-
ReferenceEquals(type, WellKnownTypes.SByte) ? SByteAccessor :
85-
ReferenceEquals(type, WellKnownTypes.UInt16) ? UInt16Accessor :
86-
ReferenceEquals(type, WellKnownTypes.UInt32) ? UInt32Accessor :
87-
ReferenceEquals(type, WellKnownTypes.UInt64) ? UInt64Accessor : null;
88-
}
83+
ReferenceEquals(type, WellKnownTypes.Int16) ? Int16Accessor :
84+
ReferenceEquals(type, WellKnownTypes.Byte) ? ByteAccessor :
85+
ReferenceEquals(type, WellKnownTypes.SByte) ? SByteAccessor :
86+
ReferenceEquals(type, WellKnownTypes.UInt16) ? UInt16Accessor :
87+
ReferenceEquals(type, WellKnownTypes.UInt32) ? UInt32Accessor :
88+
ReferenceEquals(type, WellKnownTypes.UInt64) ? UInt64Accessor : null;
89+
}
8990

90-
ValueFieldAccessor ResolveByNullableType(Type type)
91-
{
92-
return ReferenceEquals(type, WellKnownTypes.NullableBool) ? BoolAccessor :
93-
ReferenceEquals(type, WellKnownTypes.NullableInt32) ? Int32Accessor :
94-
ReferenceEquals(type, WellKnownTypes.NullableDouble) ? DoubleAccessor :
95-
ReferenceEquals(type, WellKnownTypes.NullableDecimal) ? DecimalAccessor :
96-
ReferenceEquals(type, WellKnownTypes.NullableInt64) ? Int64Accessor :
97-
ReferenceEquals(type, WellKnownTypes.NullableDateTime) ? DateTimeAccessor :
98-
ReferenceEquals(type, WellKnownTypes.NullableTimeSpan) ? TimeSpanAccessor :
99-
ReferenceEquals(type, WellKnownTypes.NullableDateTimeOffset) ? DateTimeOffsetAccessor :
100-
ReferenceEquals(type, WellKnownTypes.NullableSingle) ? SingleAccessor :
91+
private static ValueFieldAccessor ResolveByNullableType(Type type)
92+
{
93+
return ReferenceEquals(type, WellKnownTypes.NullableBool) ? BoolAccessor :
94+
ReferenceEquals(type, WellKnownTypes.NullableInt32) ? Int32Accessor :
95+
ReferenceEquals(type, WellKnownTypes.NullableDouble) ? DoubleAccessor :
96+
ReferenceEquals(type, WellKnownTypes.NullableDecimal) ? DecimalAccessor :
97+
ReferenceEquals(type, WellKnownTypes.NullableInt64) ? Int64Accessor :
98+
ReferenceEquals(type, WellKnownTypes.NullableDateTime) ? DateTimeAccessor :
99+
ReferenceEquals(type, WellKnownTypes.NullableTimeSpan) ? TimeSpanAccessor :
100+
ReferenceEquals(type, WellKnownTypes.NullableDateTimeOffset) ? DateTimeOffsetAccessor :
101+
ReferenceEquals(type, WellKnownTypes.NullableSingle) ? SingleAccessor :
101102
#if NET6_0_OR_GREATER
102-
ReferenceEquals(type, WellKnownTypes.NullableDateOnly) ? DateOnlyAccessor :
103-
ReferenceEquals(type, WellKnownTypes.NullableTimeOnly) ? TimeOnlyAccessor :
103+
ReferenceEquals(type, WellKnownTypes.NullableDateOnly) ? DateOnlyAccessor :
104+
ReferenceEquals(type, WellKnownTypes.NullableTimeOnly) ? TimeOnlyAccessor :
104105
#endif
105-
ReferenceEquals(type, WellKnownTypes.NullableGuid) ? GuidAccessor :
106-
ReferenceEquals(type, WellKnownTypes.NullableInt16) ? Int16Accessor :
107-
ReferenceEquals(type, WellKnownTypes.NullableByte) ? ByteAccessor :
108-
ReferenceEquals(type, WellKnownTypes.NullableSByte) ? SByteAccessor :
109-
ReferenceEquals(type, WellKnownTypes.NullableUInt16) ? UInt16Accessor :
110-
ReferenceEquals(type, WellKnownTypes.NullableUInt32) ? UInt32Accessor :
111-
ReferenceEquals(type, WellKnownTypes.NullableUInt64) ? UInt64Accessor : null;
106+
ReferenceEquals(type, WellKnownTypes.NullableGuid) ? GuidAccessor :
107+
ReferenceEquals(type, WellKnownTypes.NullableInt16) ? Int16Accessor :
108+
ReferenceEquals(type, WellKnownTypes.NullableByte) ? ByteAccessor :
109+
ReferenceEquals(type, WellKnownTypes.NullableSByte) ? SByteAccessor :
110+
ReferenceEquals(type, WellKnownTypes.NullableUInt16) ? UInt16Accessor :
111+
ReferenceEquals(type, WellKnownTypes.NullableUInt32) ? UInt32Accessor :
112+
ReferenceEquals(type, WellKnownTypes.NullableUInt64) ? UInt64Accessor : null;
113+
}
114+
115+
private static ValueFieldAccessor TryResolveEnum(Type type)
116+
{
117+
if (!type.IsEnum) {
118+
return null;
119+
}
120+
type = Enum.GetUnderlyingType(type);
121+
return ResolveByType(type);
122+
}
123+
124+
private static ValueFieldAccessor TryResolveNullableEnum(Type type)
125+
{
126+
var generic = type.GetGenericArguments()[0];
127+
if (!generic.IsEnum) {
128+
return null;
112129
}
130+
type = Enum.GetUnderlyingType(generic);
131+
return ResolveByType(type);
113132
}
114133
}
115134

0 commit comments

Comments
 (0)