private static bool EvaluateMaskConvertibility <TOrigin, TNew>(TOrigin *mask) where TOrigin : unmanaged where TNew : unmanaged { if (sizeof(TOrigin) == sizeof(TNew)) { return(true); } if (sizeof(TOrigin) % sizeof(TNew) != 0) { return(false); } // Consider the mask as an array of TNew, and evaluate all its elements var reinterpretedMask = (TNew *)mask; uint length = (uint)sizeof(TOrigin) / (uint)sizeof(TNew); for (uint i = 1; i < length; i++) { if (!reinterpretedMask[i].Equals(reinterpretedMask[0])) { return(false); } } return(true); }
protected override unsafe object GetExpectedResult <TOrigin, TTarget>(TOrigin *origin, int index) { // That escalated quickly if (typeof(TOrigin) == typeof(TTarget)) { return(*(TTarget *)&origin[index]); } if (typeof(TOrigin) == typeof(double)) { long result = (long)*(double *)&origin[index]; return(GetExpectedResult <long, TTarget>(&result, 0)); } if (typeof(TOrigin) == typeof(float)) { long result = (long)*(float *)&origin[index]; return(GetExpectedResult <long, TTarget>(&result, 0)); } if (sizeof(TOrigin) > sizeof(TTarget)) { var result = *(TTarget *)&origin[index]; return(result); } return(base.GetExpectedResult <TOrigin, TTarget>(origin, index)); }
private static bool PerformBitwiseOperationAs <TOrigin, TNew>(TOrigin *origin, TOrigin *target, TOrigin *mask, uint length, BitwiseOperation operation, ArrayBitwiseOperationDelegateReturner <TNew> delegateReturner) where TOrigin : unmanaged where TNew : unmanaged { uint newLength = length * (uint)sizeof(TOrigin) / (uint)sizeof(TNew); return(delegateReturner(operation)?.Invoke((TNew *)origin, (TNew *)target, *(TNew *)mask, newLength) == true); }
protected override unsafe object GetExpectedResult <TOrigin, TTarget>(TOrigin *origin, int index) => ValueManipulation.XNORRescaleMask(*(TTarget *)(origin + index), Mask);
protected override unsafe object GetExpectedResult <TOrigin, TTarget>(TOrigin *origin, int index) => ValueManipulation.NOT((TTarget)base.GetExpectedResult <TOrigin, TTarget>(origin, index));
protected virtual unsafe object GetExpectedResult <TOrigin, TTarget>(TOrigin *origin, int index) where TOrigin : unmanaged where TTarget : unmanaged { return(origin[index]); }
private static bool PerformBitwiseOperationVector256As <TOrigin, TNew>(TOrigin *origin, TOrigin *target, TOrigin *mask, uint length, BitwiseOperation operation) where TOrigin : unmanaged where TNew : unmanaged { return(PerformBitwiseOperationAs(origin, target, mask, length, operation, GetBitwiseOperationDelegateVector256 <TNew>)); }