Skip to content

Commit aae4645

Browse files
committed
Add DateTimeOffsetFieldAccessor
1 parent 1af6a7d commit aae4645

File tree

2 files changed

+77
-40
lines changed

2 files changed

+77
-40
lines changed

Orm/Xtensive.Orm/Tuples/Packed/PackedFieldAccessor.cs

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2012 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2013-2021 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Denis Krjuchkov
55
// Created: 2013.01.22
66

@@ -557,4 +557,32 @@ public DecimalFieldAccessor()
557557
{
558558
}
559559
}
560+
561+
internal sealed class DateTimeOffsetFieldAccessor : ValueFieldAccessor<DateTimeOffset>
562+
{
563+
protected override DateTimeOffset Decode(long[] values, int offset)
564+
{
565+
unsafe {
566+
fixed (long* valuePtr = &values[offset])
567+
return *(DateTimeOffset*) valuePtr;
568+
}
569+
}
570+
571+
protected override void Encode(DateTimeOffset value, long[] values, int offset)
572+
{
573+
unsafe {
574+
fixed (long* valuePtr = &values[offset])
575+
*(DateTimeOffset*) valuePtr = value;
576+
}
577+
}
578+
579+
private static unsafe int GetSize()
580+
{
581+
return sizeof(DateTimeOffset);
582+
}
583+
584+
public DateTimeOffsetFieldAccessor()
585+
: base(GetSize() * 8)
586+
{ }
587+
}
560588
}

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

Lines changed: 46 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
// Copyright (C) 2003-2012 Xtensive LLC.
2-
// All rights reserved.
3-
// For conditions of distribution and use, see license.
1+
// Copyright (C) 2012-2021 Xtensive LLC.
2+
// This code is distributed under MIT license terms.
3+
// See the License.txt file in the project root for more information.
44
// Created by: Denis Krjuchkov
55
// Created: 2012.12.29
66

@@ -63,6 +63,8 @@ private static class ValueFieldAccessorResolver
6363
private static readonly Type NullableDecimalType = typeof(decimal?);
6464
private static readonly Type GuidType = typeof(Guid);
6565
private static readonly Type NullableGuidType = typeof(Guid?);
66+
private static readonly Type DateTimeOffsetType = typeof(DateTimeOffset);
67+
private static readonly Type NullableDateTimeOffsetType = typeof(DateTimeOffset?);
6668

6769
private static readonly ValueFieldAccessor BoolAccessor = new BooleanFieldAccessor();
6870
private static readonly ValueFieldAccessor ByteAccessor = new ByteFieldAccessor();
@@ -79,48 +81,55 @@ private static class ValueFieldAccessorResolver
7981
private static readonly ValueFieldAccessor TimeSpanAccessor = new TimeSpanFieldAccessor();
8082
private static readonly ValueFieldAccessor DecimalAccessor = new DecimalFieldAccessor();
8183
private static readonly ValueFieldAccessor GuidAccessor = new GuidFieldAccessor();
84+
private static readonly ValueFieldAccessor DateTimeOffsetAccessor = new DateTimeOffsetFieldAccessor();
8285

8386
private static readonly int NullableTypeMetadataToken = typeof(Nullable<>).MetadataToken;
8487

8588
public static ValueFieldAccessor GetValue(Type probeType)
8689
{
87-
ValueFieldAccessor ResolveByType(Type type) =>
88-
ReferenceEquals(type, BoolType) ? BoolAccessor :
89-
ReferenceEquals(type, ByteType) ? ByteAccessor :
90-
ReferenceEquals(type, SByteType) ? SByteAccessor :
91-
ReferenceEquals(type, Int16Type) ? Int16Accessor :
92-
ReferenceEquals(type, UInt16Type) ? UInt16Accessor :
93-
ReferenceEquals(type, Int32Type) ? Int32Accessor :
94-
ReferenceEquals(type, UInt32Type) ? UInt32Accessor :
95-
ReferenceEquals(type, Int64Type) ? Int64Accessor :
96-
ReferenceEquals(type, UInt64Type) ? UInt64Accessor :
97-
ReferenceEquals(type, SingleType) ? SingleAccessor :
98-
ReferenceEquals(type, DoubleType) ? DoubleAccessor :
99-
ReferenceEquals(type, DateTimeType) ? DateTimeAccessor :
100-
ReferenceEquals(type, TimeSpanType) ? TimeSpanAccessor :
101-
ReferenceEquals(type, DecimalType) ? DecimalAccessor :
102-
ReferenceEquals(type, GuidType) ? GuidAccessor : null;
103-
104-
ValueFieldAccessor ResolveByNullableType(Type type) =>
105-
ReferenceEquals(type, NullableBoolType) ? BoolAccessor :
106-
ReferenceEquals(type, NullableByteType) ? ByteAccessor :
107-
ReferenceEquals(type, NullableSByteType) ? SByteAccessor :
108-
ReferenceEquals(type, NullableInt16Type) ? Int16Accessor :
109-
ReferenceEquals(type, NullableUInt16Type) ? UInt16Accessor :
110-
ReferenceEquals(type, NullableInt32Type) ? Int32Accessor :
111-
ReferenceEquals(type, NullableUInt32Type) ? UInt32Accessor :
112-
ReferenceEquals(type, NullableInt64Type) ? Int64Accessor :
113-
ReferenceEquals(type, NullableUInt64Type) ? UInt64Accessor :
114-
ReferenceEquals(type, NullableSingleType) ? SingleAccessor :
115-
ReferenceEquals(type, NullableDoubleType) ? DoubleAccessor :
116-
ReferenceEquals(type, NullableDateTimeType) ? DateTimeAccessor :
117-
ReferenceEquals(type, NullableTimeSpanType) ? TimeSpanAccessor :
118-
ReferenceEquals(type, NullableDecimalType) ? DecimalAccessor :
119-
ReferenceEquals(type, NullableGuidType) ? GuidAccessor : null;
120-
12190
return (probeType.MetadataToken ^ NullableTypeMetadataToken) == 0
12291
? ResolveByNullableType(probeType)
12392
: ResolveByType(probeType);
93+
94+
ValueFieldAccessor ResolveByType(Type type)
95+
{
96+
return ReferenceEquals(type, BoolType) ? BoolAccessor :
97+
ReferenceEquals(type, ByteType) ? ByteAccessor :
98+
ReferenceEquals(type, SByteType) ? SByteAccessor :
99+
ReferenceEquals(type, Int16Type) ? Int16Accessor :
100+
ReferenceEquals(type, UInt16Type) ? UInt16Accessor :
101+
ReferenceEquals(type, Int32Type) ? Int32Accessor :
102+
ReferenceEquals(type, UInt32Type) ? UInt32Accessor :
103+
ReferenceEquals(type, Int64Type) ? Int64Accessor :
104+
ReferenceEquals(type, UInt64Type) ? UInt64Accessor :
105+
ReferenceEquals(type, SingleType) ? SingleAccessor :
106+
ReferenceEquals(type, DoubleType) ? DoubleAccessor :
107+
ReferenceEquals(type, DateTimeType) ? DateTimeAccessor :
108+
ReferenceEquals(type, TimeSpanType) ? TimeSpanAccessor :
109+
ReferenceEquals(type, DecimalType) ? DecimalAccessor :
110+
ReferenceEquals(type, GuidType) ? GuidAccessor :
111+
ReferenceEquals(type, DateTimeOffsetType) ? DateTimeOffsetAccessor : null;
112+
}
113+
114+
ValueFieldAccessor ResolveByNullableType(Type type)
115+
{
116+
return ReferenceEquals(type, NullableBoolType) ? BoolAccessor :
117+
ReferenceEquals(type, NullableByteType) ? ByteAccessor :
118+
ReferenceEquals(type, NullableSByteType) ? SByteAccessor :
119+
ReferenceEquals(type, NullableInt16Type) ? Int16Accessor :
120+
ReferenceEquals(type, NullableUInt16Type) ? UInt16Accessor :
121+
ReferenceEquals(type, NullableInt32Type) ? Int32Accessor :
122+
ReferenceEquals(type, NullableUInt32Type) ? UInt32Accessor :
123+
ReferenceEquals(type, NullableInt64Type) ? Int64Accessor :
124+
ReferenceEquals(type, NullableUInt64Type) ? UInt64Accessor :
125+
ReferenceEquals(type, NullableSingleType) ? SingleAccessor :
126+
ReferenceEquals(type, NullableDoubleType) ? DoubleAccessor :
127+
ReferenceEquals(type, NullableDateTimeType) ? DateTimeAccessor :
128+
ReferenceEquals(type, NullableTimeSpanType) ? TimeSpanAccessor :
129+
ReferenceEquals(type, NullableDecimalType) ? DecimalAccessor :
130+
ReferenceEquals(type, NullableGuidType) ? GuidAccessor :
131+
ReferenceEquals(type, NullableDateTimeOffsetType) ? DateTimeOffsetAccessor : null;
132+
}
124133
}
125134
}
126135

0 commit comments

Comments
 (0)