private AdvancedComparer(IAdvancedComparer <T> a, IComparer <T> c, IEqualityComparer <T> e) : base(a) { ComparerImplementation = c; EqualityComparerImplementation = e; // Below code is the same between both primary constructors if (Implementation != null) { Provider = Implementation.Provider; ComparisonRules = Implementation.ComparisonRules; ValueTypeComparerBase <T> vtc = Implementation as ValueTypeComparerBase <T>; SystemComparer <T> sc = Implementation as SystemComparer <T>; // Trying to get faster delegates if (sc != null) { if (ComparisonRules.Value.Direction == Direction.Positive) { Compare = SystemComparerStruct <T> .Instance.Compare; } Equals = SystemComparerStruct <T> .Instance.Equals; GetHashCode = SystemComparerStruct <T> .Instance.GetHashCode; } else if (vtc != null) { if (ComparisonRules.Value.Direction == Direction.Positive && vtc.UsesDefaultCompare) { Compare = SystemComparerStruct <T> .Instance.Compare; } if (vtc.UsesDefaultEquals) { Equals = SystemComparerStruct <T> .Instance.Equals; } if (vtc.UsesDefaultGetHashCode) { GetHashCode = SystemComparerStruct <T> .Instance.GetHashCode; } } // Setting interface comparers, if unassigned if (Compare == null) { Compare = ComparerImplementation.Compare; } if (Equals == null) { Equals = EqualityComparerImplementation.Equals; } if (GetHashCode == null) { GetHashCode = EqualityComparerImplementation.GetHashCode; } GetNearestValue = Implementation.GetNearestValue; ApplyRules = Implementation.ApplyRules; ValueRangeInfo = Implementation.ValueRangeInfo; } else { ComparisonRules = ComparisonRules.Positive; if (ComparerImplementation != null) { Compare = ComparerImplementation.Compare; } if (EqualityComparerImplementation != null) { Equals = EqualityComparerImplementation.Equals; GetHashCode = EqualityComparerImplementation.GetHashCode; } } }
// Constructors /// <summary> /// Initializes a new instance of this type. /// </summary> /// <param name="implementation">Implementation to provide the delegates for.</param> public AdvancedComparer(IAdvancedComparer <T> implementation) : this(implementation, implementation, implementation) { ArgumentValidator.EnsureArgumentNotNull(implementation, "implementation"); }