1- // Copyright (C) 2003-2012 Xtensive LLC.
1+ // Copyright (C) 2003-2012 Xtensive LLC.
22// All rights reserved.
33// For conditions of distribution and use, see license.
44// Created by: Denis Krjuchkov
@@ -163,12 +163,9 @@ public static void ConfigureLen1(Type[] fieldTypes, ref PackedFieldDescriptor de
163163 var valueAccessor = ValueFieldAccessorResolver . GetValue ( fieldTypes [ 0 ] ) ;
164164 if ( valueAccessor != null ) {
165165 descriptor . Accessor = valueAccessor ;
166- descriptor . PackingType = FieldPackingType . Value ;
167- descriptor . Rank = valueAccessor . Rank ;
168- descriptor . ValueIndex = 1 ;
166+ descriptor . SetValueBitOffset ( Val064BitCount ) ;
169167
170- var valBitCount = 1 << valueAccessor . Rank ;
171- valuesLength = 1 + ( ( valBitCount + ( Val064BitCount - 1 ) ) >> Val064Rank ) ;
168+ valuesLength = ( ( 1 << valueAccessor . Rank ) + ( ( Val064BitCount * 2 ) - 1 ) ) >> Val064Rank ;
172169 objectsLength = 0 ;
173170 fieldTypes [ 0 ] = valueAccessor . FieldType ;
174171 return ;
@@ -186,41 +183,36 @@ public static void ConfigureLen2(Type[] fieldTypes, ref PackedFieldDescriptor de
186183 ConfigureFieldPhase1 ( ref descriptor1 , ref valCounters , fieldTypes , 0 ) ;
187184 ConfigureFieldPhase1 ( ref descriptor2 , ref valCounters , fieldTypes , 1 ) ;
188185 objectsLength = valCounters . ObjectCounter ;
189- int valBitCount ;
186+ int val1BitCount , val2BitCount ;
190187 switch ( objectsLength ) {
191188 case 2 :
192189 valuesLength = 1 ;
193190 return ;
194191 case 1 : {
195- if ( descriptor2 . PackingType == FieldPackingType . Value ) {
196- descriptor2 . ValueIndex = 1 ;
197- valBitCount = 1 << descriptor2 . Rank ;
192+ if ( descriptor1 . IsObjectField ) {
193+ descriptor2 . SetValueBitOffset ( Val064BitCount ) ;
194+ val1BitCount = descriptor2 . Accessor . ValueBitCount ;
198195 }
199196 else {
200- descriptor1 . ValueIndex = 1 ;
201- valBitCount = 1 << descriptor1 . Rank ;
197+ descriptor1 . SetValueBitOffset ( Val064BitCount ) ;
198+ val1BitCount = descriptor1 . Accessor . ValueBitCount ;
202199 }
203- valuesLength = 1 + ( ( valBitCount + ( Val064BitCount - 1 ) ) >> Val064Rank ) ;
200+ valuesLength = 1 + ( ( val1BitCount + ( Val064BitCount - 1 ) ) >> Val064Rank ) ;
204201 return ;
205202 }
206203 }
207204 // Both descriptors are value descriptors
208- int rank1 = descriptor1 . Rank , rank2 = descriptor2 . Rank ;
209- if ( rank2 > rank1 ) {
210- descriptor2 . ValueIndex = 1 ;
211- valBitCount = 1 << rank2 ;
212- descriptor1 . ValueIndex = 1 + ( valBitCount >> Val064Rank ) ;
213- descriptor1 . ValueBitOffset = valBitCount & Modulo064RemainderMask ;
214- valBitCount += 1 << rank1 ;
205+ val1BitCount = descriptor1 . Accessor . ValueBitCount ;
206+ val2BitCount = descriptor2 . Accessor . ValueBitCount ;
207+ if ( val2BitCount > val1BitCount ) {
208+ descriptor2 . SetValueBitOffset ( Val064BitCount ) ;
209+ descriptor1 . SetValueBitOffset ( Val064BitCount + val2BitCount ) ;
215210 }
216211 else {
217- descriptor1 . ValueIndex = 1 ;
218- valBitCount = 1 << rank1 ;
219- descriptor2 . ValueIndex = 1 + ( valBitCount >> Val064Rank ) ;
220- descriptor2 . ValueBitOffset = valBitCount & Modulo064RemainderMask ;
221- valBitCount += 1 << rank2 ;
212+ descriptor1 . SetValueBitOffset ( Val064BitCount ) ;
213+ descriptor2 . SetValueBitOffset ( Val064BitCount + val1BitCount ) ;
222214 }
223- valuesLength = 1 + ( ( valBitCount + ( Val064BitCount - 1 ) ) >> Val064Rank ) ;
215+ valuesLength = ( val1BitCount + val2BitCount + ( ( Val064BitCount * 2 ) - 1 ) ) >> Val064Rank ;
224216 }
225217
226218 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
@@ -269,26 +261,22 @@ private static void InitValPointer(ref ValPointer pointer, ref ValPointer prevPo
269261 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
270262 private static void UpdateDescriptorPosition ( ref PackedFieldDescriptor descriptor , ref ValPointer valPointer )
271263 {
272- descriptor . ValueIndex = valPointer . Index ;
273- descriptor . ValueBitOffset = valPointer . Offset ;
274-
275- var increasedOffset = valPointer . Offset + descriptor . ValueBitCount ;
276- valPointer . Index += increasedOffset >> Val064Rank ;
277- valPointer . Offset = increasedOffset & Modulo064RemainderMask ;
264+ var totalBitCount = ( valPointer . Index << Val064Rank ) + valPointer . Offset ;
265+ descriptor . SetValueBitOffset ( totalBitCount ) ;
266+ totalBitCount += descriptor . Accessor . ValueBitCount ;
267+ valPointer . Index = totalBitCount >> Val064Rank ;
268+ valPointer . Offset = totalBitCount & Modulo064RemainderMask ;
278269 }
279270
280271 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
281272 private static void ConfigureFieldPhase1 ( ref PackedFieldDescriptor descriptor , ref ValCounters counters ,
282273 Type [ ] fieldTypes , int fieldIndex )
283274 {
284- descriptor . StateIndex = fieldIndex >> Val032Rank ; // d.FieldIndex / 32
285- descriptor . StateBitOffset = ( fieldIndex & Modulo032RemainderMask ) << 1 ;
275+ descriptor . SetStateTotalBitOffset ( fieldIndex << 1 ) ;
286276
287277 var valueAccessor = ValueFieldAccessorResolver . GetValue ( fieldTypes [ fieldIndex ] ) ;
288278 if ( valueAccessor != null ) {
289279 descriptor . Accessor = valueAccessor ;
290- descriptor . PackingType = FieldPackingType . Value ;
291- descriptor . Rank = valueAccessor . Rank ;
292280
293281 IncrementerByRank [ valueAccessor . Rank ] . Invoke ( ref counters ) ;
294282
@@ -297,18 +285,18 @@ private static void ConfigureFieldPhase1(ref PackedFieldDescriptor descriptor, r
297285 }
298286
299287 descriptor . Accessor = ObjectAccessor ;
300- descriptor . ValueIndex = counters . ObjectCounter ++ ;
288+ descriptor . ObjectIndex = counters . ObjectCounter ++ ;
301289 }
302290
303291 [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
304292 private static void ConfigureFieldPhase2 ( ref PackedFieldDescriptor descriptor , ref ValPointers valPointers )
305293 {
306- if ( descriptor . PackingType == FieldPackingType . Object ) {
294+ if ( descriptor . IsObjectField ) {
307295 return ;
308296 }
309297
310298 // d.PackingType == FieldPackingType.Value
311- PositionUpdaterByRank [ descriptor . Rank ] . Invoke ( ref descriptor , ref valPointers ) ;
299+ PositionUpdaterByRank [ descriptor . Accessor . Rank ] . Invoke ( ref descriptor , ref valPointers ) ;
312300 }
313301
314302 static TupleLayout ( )
0 commit comments