public int Compare(IEnumerable <SelfSealed> x, IEnumerable <SelfSealed> y)
            {
                var setX = new CycleDetectionSet();
                var setY = new CycleDetectionSet();

                using var enumeratorX = x.GetEnumerator();
                using var enumeratorY = y.GetEnumerator();

                while (true)
                {
                    var xDone = !enumeratorX.MoveNext();
                    var yDone = !enumeratorY.MoveNext();

                    if (xDone)
                    {
                        return(yDone ? 0 : -1);
                    }

                    if (yDone)
                    {
                        return(1);
                    }

                    var xCurrent = enumeratorX.Current;
                    var yCurrent = enumeratorY.Current;

                    var compare = Compare(xCurrent, yCurrent, setX, setY);
                    if (compare != 0)
                    {
                        return(compare);
                    }
                }
            }
Exemple #2
0
        public static TResult InvokeCompare <TContext, TComparable, TResult>(
            this MethodInfo method,
            Type actualType,
            TContext context,
            TComparable x,
            TComparable y,
            CycleDetectionSet xSet,
            CycleDetectionSet ySet)
        {
            var isDeclaringTypeMatchedActualMemberType = typeof(TComparable) == actualType;

            if (!isDeclaringTypeMatchedActualMemberType)
            {
                // todo: 1. cache delegates and benchmark ways:
                // - direct Invoke;
                // - DynamicInvoke;
                // var genericType = typeof(Method.StaticMethodDelegate<>).MakeGenericType(type);
                // var @delegate = compareMethod.CreateDelegate(genericType);
                // return (int)@delegate.DynamicInvoke(this, x, y, hash);
                // - DynamicMethod;
                // - generate static class wrapper.

                return((TResult)method.Invoke(
                           null,
                           new object[] { context, x, y, xSet, ySet }));
            }

            var compare = method.CreateDelegate <Func <TContext, TComparable, TComparable, CycleDetectionSet, CycleDetectionSet, TResult> >();

            return(compare(context, x, y, xSet, ySet));
        }
            public int Compare(SelfSealed x, SelfSealed y)
            {
                var setX = new CycleDetectionSet();
                var setY = new CycleDetectionSet();

                return(Compare(x, y, setX, setY));
            }
            public int Compare(CycledStructObject x, CycledStructObject y)
            {
                var setX = new CycleDetectionSet();
                var setY = new CycleDetectionSet();

                return(Compare(x, y, setX, setY));
            }
Exemple #5
0
            public int Compare(CycledStruct x, CycledStruct y)
            {
                var setX = new CycleDetectionSet();
                var setY = new CycleDetectionSet();

                var compare = Compare(x, y, setX, setY);

                if (compare != 0)
                {
                    return(compare);
                }

                return(setX.Count - setY.Count);
            }
            private static int Compare(SelfSealed x, SelfSealed y, CycleDetectionSet setX, CycleDetectionSet setY)
            {
                if (ReferenceEquals(x, y))
                {
                    return(0);
                }

                if (y is null)
                {
                    return(1);
                }

                if (x is null)
                {
                    return(-1);
                }

                // & because, both methods need to be executed.
                if (!setX.TryAdd(x, 0) & !setY.TryAdd(y, 0))
                {
                    return(setX.Count - setY.Count);
                }

                var compareFirst = Compare(x.First, y.First, setX, setY);

                if (compareFirst != 0)
                {
                    return(compareFirst);
                }

                var compareSecond = Compare(x.Second, y.Second, setX, setY);

                if (compareSecond != 0)
                {
                    return(compareSecond);
                }

                var compareValue = x.Value.CompareTo(y.Value);

                if (compareValue != 0)
                {
                    return(compareValue);
                }

                setX.Remove(x, out _);
                setY.Remove(y, out _);

                return(0);
            }
Exemple #7
0
            public static int Compare(CycledStruct x, CycledStruct y, CycleDetectionSet xSet, CycleDetectionSet ySet)
            {
                var compare = Nullable.Compare(x.Property, y.Property);

                if (compare != 0)
                {
                    return(compare);
                }

                compare = CycledStructObject.RelationalComparer.Compare(x.FirstObject, y.FirstObject, xSet, ySet);
                if (compare != 0)
                {
                    return(compare);
                }

                return(CycledStructObject.RelationalComparer.Compare(x.SecondObject, y.SecondObject, xSet, ySet));
            }
            public static int Compare(
                CycledStructObject x,
                CycledStructObject y,
                CycleDetectionSet setX,
                CycleDetectionSet setY)
            {
                if (ReferenceEquals(x, y))
                {
                    return(0);
                }

                if (y is null)
                {
                    return(1);
                }

                if (x is null)
                {
                    return(-1);
                }

                // & because, both methods need to be executed.
                if (!setX.TryAdd(x, 0) & !setY.TryAdd(y, 0))
                {
                    return(setX.Count - setY.Count);
                }

                var compare = string.CompareOrdinal(x.TextField, y.TextField);

                if (compare != 0)
                {
                    return(compare);
                }

                compare = CycledStruct.RelationalComparer.Compare(x.FirstStruct, y.FirstStruct, setX, setY);
                if (compare != 0)
                {
                    return(compare);
                }

                return(CycledStruct.RelationalComparer.Compare(x.SecondStruct, y.SecondStruct, setX, setY));
            }
Exemple #9
0
            public static int Compare(
                CycledStruct?x,
                CycledStruct?y,
                CycleDetectionSet xSet,
                CycleDetectionSet ySet)
            {
                if (x.HasValue)
                {
                    if (y.HasValue)
                    {
                        return(Compare(x.Value, y.Value, xSet, ySet));
                    }

                    return(1);
                }

                if (y.HasValue)
                {
                    return(-1);
                }

                return(0);
            }