private static void CopyPackedValue(PackedTuple source, int sourceIndex, PackedTuple target, int targetIndex) { var sourceDescriptor = source.PackedDescriptor.FieldDescriptors[sourceIndex]; var targetDescriptor = target.PackedDescriptor.FieldDescriptors[targetIndex]; var fieldState = source.GetFieldState(sourceDescriptor); if (!fieldState.IsAvailable()) { return; } if (fieldState.IsAvailableAndNull()) { target.SetValue(targetIndex, null); return; } var accessor = sourceDescriptor.Accessor; if (accessor != targetDescriptor.Accessor) { throw new InvalidOperationException(string.Format( Strings.ExInvalidCast, source.PackedDescriptor[sourceIndex], target.PackedDescriptor[targetIndex])); } target.SetFieldState(targetIndex, TupleFieldState.Available); accessor.CopyValue(source, sourceDescriptor, target, targetDescriptor); }
private static void MergeTuplesPreferOriginFast(PackedTuple origin, PackedTuple difference, int startIndex, int length) { var bound = startIndex + length; for (int index = startIndex; index < bound; index++) { TupleFieldState fieldState; if (!origin.GetFieldState(index).IsAvailable()) { CopyPackedValue(difference, index, origin, index); } } }