internal static T[,] Clone2DimArrayInternal <T>(T[,] objFrom, T[,] objTo, DeepCloneState state, bool isDeep) { if (objFrom == null || objTo == null) { return(null); } int num = Math.Min(objFrom.GetLength(0), objTo.GetLength(0)); int num2 = Math.Min(objFrom.GetLength(1), objTo.GetLength(1)); state.AddKnownRef(objFrom, objTo); if ((!isDeep || DeepClonerSafeTypes.CanNotCopyType(typeof(T), null)) && objFrom.GetLength(0) == objTo.GetLength(0) && objFrom.GetLength(1) == objTo.GetLength(1)) { Array.Copy(objFrom, objTo, objFrom.Length); return(objTo); } if (!isDeep) { for (int i = 0; i < num; i++) { for (int j = 0; j < num2; j++) { int num3 = i; int num4 = j; T val = objFrom[i, j]; objTo[num3, num4] = val; } } return(objTo); } if (typeof(T).IsValueType()) { Func <T, DeepCloneState, T> clonerForValueType = DeepClonerGenerator.GetClonerForValueType <T>(); for (int k = 0; k < num; k++) { for (int l = 0; l < num2; l++) { int num5 = k; int num6 = l; T val2 = clonerForValueType(objFrom[k, l], state); objTo[num5, num6] = val2; } } } else { for (int m = 0; m < num; m++) { for (int n = 0; n < num2; n++) { int num7 = m; int num8 = n; T obj = (T)DeepClonerGenerator.CloneClassInternal(objFrom[m, n], state); objTo[num7, num8] = obj; } } } return(objTo); }
internal static T[,] Clone2DimArrayInternal <T>(T[,] objFrom, T[,] objTo, DeepCloneState state, bool isDeep) { // not null from called method, but will check it anyway if (objFrom == null || objTo == null) { return(null); } var l1 = Math.Min(objFrom.GetLength(0), objTo.GetLength(0)); var l2 = Math.Min(objFrom.GetLength(1), objTo.GetLength(1)); state.AddKnownRef(objFrom, objTo); if ((!isDeep || DeepClonerSafeTypes.CanReturnSameObject(typeof(T))) && objFrom.GetLength(0) == objTo.GetLength(0) && objFrom.GetLength(1) == objTo.GetLength(1)) { Array.Copy(objFrom, objTo, objFrom.Length); return(objTo); } if (!isDeep) { for (var i = 0; i < l1; i++) { for (var k = 0; k < l2; k++) { objTo[i, k] = objFrom[i, k]; } } return(objTo); } if (typeof(T).IsValueType()) { var cloner = DeepClonerGenerator.GetClonerForValueType <T>(); for (var i = 0; i < l1; i++) { for (var k = 0; k < l2; k++) { objTo[i, k] = cloner(objFrom[i, k], state); } } } else { for (var i = 0; i < l1; i++) { for (var k = 0; k < l2; k++) { objTo[i, k] = (T)DeepClonerGenerator.CloneClassInternal(objFrom[i, k], state); } } } return(objTo); }
internal static T[] Clone1DimArrayStructInternal <T>(T[] objFrom, T[] objTo, DeepCloneState state) { if (objFrom == null || objTo == null) { return(null); } int num = Math.Min(objFrom.Length, objTo.Length); state.AddKnownRef(objFrom, objTo); Func <T, DeepCloneState, T> clonerForValueType = DeepClonerGenerator.GetClonerForValueType <T>(); for (int i = 0; i < num; i++) { objTo[i] = clonerForValueType(objTo[i], state); } return(objTo); }
internal static T[] Clone1DimArrayStructInternal <T>(T[] objFrom, T[] objTo, DeepCloneState state) { // not null from called method, but will check it anyway if (objFrom == null || objTo == null) { return(null); } var l = Math.Min(objFrom.Length, objTo.Length); state.AddKnownRef(objFrom, objTo); var cloner = DeepClonerGenerator.GetClonerForValueType <T>(); for (var i = 0; i < l; i++) { objTo[i] = cloner(objTo[i], state); } return(objTo); }