1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 using System
.Collections
;
6 using System
.Collections
.Generic
;
7 using System
.Diagnostics
;
8 using System
.Runtime
.CompilerServices
;
12 // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it.
18 /// Helper so we can call some tuple methods recursively without knowing the underlying types.
20 internal interface ITupleInternal
: ITuple
22 string ToString(StringBuilder sb
);
23 int GetHashCode(IEqualityComparer comparer
);
26 public static class Tuple
28 public static Tuple
<T1
> Create
<T1
>(T1 item1
)
30 return new Tuple
<T1
>(item1
);
33 public static Tuple
<T1
, T2
> Create
<T1
, T2
>(T1 item1
, T2 item2
)
35 return new Tuple
<T1
, T2
>(item1
, item2
);
38 public static Tuple
<T1
, T2
, T3
> Create
<T1
, T2
, T3
>(T1 item1
, T2 item2
, T3 item3
)
40 return new Tuple
<T1
, T2
, T3
>(item1
, item2
, item3
);
43 public static Tuple
<T1
, T2
, T3
, T4
> Create
<T1
, T2
, T3
, T4
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
)
45 return new Tuple
<T1
, T2
, T3
, T4
>(item1
, item2
, item3
, item4
);
48 public static Tuple
<T1
, T2
, T3
, T4
, T5
> Create
<T1
, T2
, T3
, T4
, T5
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
)
50 return new Tuple
<T1
, T2
, T3
, T4
, T5
>(item1
, item2
, item3
, item4
, item5
);
53 public static Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> Create
<T1
, T2
, T3
, T4
, T5
, T6
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
)
55 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
>(item1
, item2
, item3
, item4
, item5
, item6
);
58 public static Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> Create
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
)
60 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(item1
, item2
, item3
, item4
, item5
, item6
, item7
);
63 public static Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, Tuple
<T8
>> Create
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
, T8 item8
)
65 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, Tuple
<T8
>>(item1
, item2
, item3
, item4
, item5
, item6
, item7
, new Tuple
<T8
>(item8
));
68 // From System.Web.Util.HashCodeCombiner
69 internal static int CombineHashCodes(int h1
, int h2
)
71 return (((h1
<< 5) + h1
) ^ h2
);
74 internal static int CombineHashCodes(int h1
, int h2
, int h3
)
76 return CombineHashCodes(CombineHashCodes(h1
, h2
), h3
);
79 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
)
81 return CombineHashCodes(CombineHashCodes(h1
, h2
), CombineHashCodes(h3
, h4
));
84 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
)
86 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), h5
);
89 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
)
91 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
));
94 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
)
96 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
));
99 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
, int h8
)
101 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
, h8
));
106 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
107 public class Tuple
<T1
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
109 private readonly T1 m_Item1
; // Do not rename (binary serialization)
111 public T1 Item1 { get { return m_Item1; }
}
113 public Tuple(T1 item1
)
118 public override bool Equals(object? obj
)
120 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
123 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
125 if (other
== null) return false;
127 if (!(other
is Tuple
<T1
> objTuple
))
132 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
);
135 int IComparable
.CompareTo(object? obj
)
137 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
140 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
142 if (other
== null) return 1;
144 if (!(other
is Tuple
<T1
> objTuple
))
146 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
149 return comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
152 public override int GetHashCode()
154 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
157 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
159 return comparer
.GetHashCode(m_Item1
!);
162 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
164 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
166 public override string ToString()
168 StringBuilder sb
= new StringBuilder();
170 return ((ITupleInternal
)this).ToString(sb
);
173 string ITupleInternal
.ToString(StringBuilder sb
)
177 return sb
.ToString();
181 /// The number of positions in this data structure.
183 int ITuple
.Length
=> 1;
186 /// Get the element at position <param name="index"/>.
188 object? ITuple
.this[int index
]
194 throw new IndexOutOfRangeException();
202 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
203 public class Tuple
<T1
, T2
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
205 private readonly T1 m_Item1
; // Do not rename (binary serialization)
206 private readonly T2 m_Item2
; // Do not rename (binary serialization)
208 public T1 Item1 { get { return m_Item1; }
}
209 public T2 Item2 { get { return m_Item2; }
}
211 public Tuple(T1 item1
, T2 item2
)
217 public override bool Equals(object? obj
)
219 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
222 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
224 if (other
== null) return false;
226 if (!(other
is Tuple
<T1
, T2
> objTuple
))
231 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
);
234 int IComparable
.CompareTo(object? obj
)
236 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
239 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
241 if (other
== null) return 1;
243 if (!(other
is Tuple
<T1
, T2
> objTuple
))
245 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
250 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
252 if (c
!= 0) return c
;
254 return comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
257 public override int GetHashCode()
259 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
262 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
264 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!));
267 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
269 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
271 public override string ToString()
273 StringBuilder sb
= new StringBuilder();
275 return ((ITupleInternal
)this).ToString(sb
);
278 string ITupleInternal
.ToString(StringBuilder sb
)
284 return sb
.ToString();
288 /// The number of positions in this data structure.
290 int ITuple
.Length
=> 2;
293 /// Get the element at position <param name="index"/>.
295 object? ITuple
.this[int index
]
306 throw new IndexOutOfRangeException();
313 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
314 public class Tuple
<T1
, T2
, T3
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
316 private readonly T1 m_Item1
; // Do not rename (binary serialization)
317 private readonly T2 m_Item2
; // Do not rename (binary serialization)
318 private readonly T3 m_Item3
; // Do not rename (binary serialization)
320 public T1 Item1 { get { return m_Item1; }
}
321 public T2 Item2 { get { return m_Item2; }
}
322 public T3 Item3 { get { return m_Item3; }
}
324 public Tuple(T1 item1
, T2 item2
, T3 item3
)
331 public override bool Equals(object? obj
)
333 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
336 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
338 if (other
== null) return false;
340 if (!(other
is Tuple
<T1
, T2
, T3
> objTuple
))
345 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
);
348 int IComparable
.CompareTo(object? obj
)
350 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
353 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
355 if (other
== null) return 1;
357 if (!(other
is Tuple
<T1
, T2
, T3
> objTuple
))
359 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
364 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
366 if (c
!= 0) return c
;
368 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
370 if (c
!= 0) return c
;
372 return comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
375 public override int GetHashCode()
377 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
380 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
382 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!));
385 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
387 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
389 public override string ToString()
391 StringBuilder sb
= new StringBuilder();
393 return ((ITupleInternal
)this).ToString(sb
);
396 string ITupleInternal
.ToString(StringBuilder sb
)
404 return sb
.ToString();
408 /// The number of positions in this data structure.
410 int ITuple
.Length
=> 3;
413 /// Get the element at position <param name="index"/>.
415 object? ITuple
.this[int index
]
428 throw new IndexOutOfRangeException();
435 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
436 public class Tuple
<T1
, T2
, T3
, T4
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
438 private readonly T1 m_Item1
; // Do not rename (binary serialization)
439 private readonly T2 m_Item2
; // Do not rename (binary serialization)
440 private readonly T3 m_Item3
; // Do not rename (binary serialization)
441 private readonly T4 m_Item4
; // Do not rename (binary serialization)
443 public T1 Item1 { get { return m_Item1; }
}
444 public T2 Item2 { get { return m_Item2; }
}
445 public T3 Item3 { get { return m_Item3; }
}
446 public T4 Item4 { get { return m_Item4; }
}
448 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
)
456 public override bool Equals(object? obj
)
458 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
461 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
463 if (other
== null) return false;
465 if (!(other
is Tuple
<T1
, T2
, T3
, T4
> objTuple
))
470 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
) && comparer
.Equals(m_Item4
, objTuple
.m_Item4
);
473 int IComparable
.CompareTo(object? obj
)
475 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
478 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
480 if (other
== null) return 1;
482 if (!(other
is Tuple
<T1
, T2
, T3
, T4
> objTuple
))
484 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
489 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
491 if (c
!= 0) return c
;
493 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
495 if (c
!= 0) return c
;
497 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
499 if (c
!= 0) return c
;
501 return comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
504 public override int GetHashCode()
506 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
509 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
511 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!));
514 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
516 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
518 public override string ToString()
520 StringBuilder sb
= new StringBuilder();
522 return ((ITupleInternal
)this).ToString(sb
);
525 string ITupleInternal
.ToString(StringBuilder sb
)
535 return sb
.ToString();
539 /// The number of positions in this data structure.
541 int ITuple
.Length
=> 4;
544 /// Get the element at position <param name="index"/>.
546 object? ITuple
.this[int index
]
561 throw new IndexOutOfRangeException();
568 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
569 public class Tuple
<T1
, T2
, T3
, T4
, T5
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
571 private readonly T1 m_Item1
; // Do not rename (binary serialization)
572 private readonly T2 m_Item2
; // Do not rename (binary serialization)
573 private readonly T3 m_Item3
; // Do not rename (binary serialization)
574 private readonly T4 m_Item4
; // Do not rename (binary serialization)
575 private readonly T5 m_Item5
; // Do not rename (binary serialization)
577 public T1 Item1 { get { return m_Item1; }
}
578 public T2 Item2 { get { return m_Item2; }
}
579 public T3 Item3 { get { return m_Item3; }
}
580 public T4 Item4 { get { return m_Item4; }
}
581 public T5 Item5 { get { return m_Item5; }
}
583 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
)
592 public override bool Equals(object? obj
)
594 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
597 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
599 if (other
== null) return false;
601 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
> objTuple
))
606 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
) && comparer
.Equals(m_Item4
, objTuple
.m_Item4
) && comparer
.Equals(m_Item5
, objTuple
.m_Item5
);
609 int IComparable
.CompareTo(object? obj
)
611 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
614 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
616 if (other
== null) return 1;
618 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
> objTuple
))
620 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
625 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
627 if (c
!= 0) return c
;
629 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
631 if (c
!= 0) return c
;
633 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
635 if (c
!= 0) return c
;
637 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
639 if (c
!= 0) return c
;
641 return comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
644 public override int GetHashCode()
646 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
649 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
651 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!));
654 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
656 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
658 public override string ToString()
660 StringBuilder sb
= new StringBuilder();
662 return ((ITupleInternal
)this).ToString(sb
);
665 string ITupleInternal
.ToString(StringBuilder sb
)
677 return sb
.ToString();
681 /// The number of positions in this data structure.
683 int ITuple
.Length
=> 5;
686 /// Get the element at position <param name="index"/>.
688 object? ITuple
.this[int index
]
705 throw new IndexOutOfRangeException();
712 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
713 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
715 private readonly T1 m_Item1
; // Do not rename (binary serialization)
716 private readonly T2 m_Item2
; // Do not rename (binary serialization)
717 private readonly T3 m_Item3
; // Do not rename (binary serialization)
718 private readonly T4 m_Item4
; // Do not rename (binary serialization)
719 private readonly T5 m_Item5
; // Do not rename (binary serialization)
720 private readonly T6 m_Item6
; // Do not rename (binary serialization)
722 public T1 Item1 { get { return m_Item1; }
}
723 public T2 Item2 { get { return m_Item2; }
}
724 public T3 Item3 { get { return m_Item3; }
}
725 public T4 Item4 { get { return m_Item4; }
}
726 public T5 Item5 { get { return m_Item5; }
}
727 public T6 Item6 { get { return m_Item6; }
}
729 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
)
739 public override bool Equals(object? obj
)
741 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
744 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
746 if (other
== null) return false;
748 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> objTuple
))
753 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
) && comparer
.Equals(m_Item4
, objTuple
.m_Item4
) && comparer
.Equals(m_Item5
, objTuple
.m_Item5
) && comparer
.Equals(m_Item6
, objTuple
.m_Item6
);
756 int IComparable
.CompareTo(object? obj
)
758 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
761 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
763 if (other
== null) return 1;
765 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> objTuple
))
767 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
772 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
774 if (c
!= 0) return c
;
776 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
778 if (c
!= 0) return c
;
780 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
782 if (c
!= 0) return c
;
784 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
786 if (c
!= 0) return c
;
788 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
790 if (c
!= 0) return c
;
792 return comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
795 public override int GetHashCode()
797 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
800 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
802 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!));
805 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
807 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
809 public override string ToString()
811 StringBuilder sb
= new StringBuilder();
813 return ((ITupleInternal
)this).ToString(sb
);
816 string ITupleInternal
.ToString(StringBuilder sb
)
830 return sb
.ToString();
834 /// The number of positions in this data structure.
836 int ITuple
.Length
=> 6;
839 /// Get the element at position <param name="index"/>.
841 object? ITuple
.this[int index
]
860 throw new IndexOutOfRangeException();
867 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
868 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
870 private readonly T1 m_Item1
; // Do not rename (binary serialization)
871 private readonly T2 m_Item2
; // Do not rename (binary serialization)
872 private readonly T3 m_Item3
; // Do not rename (binary serialization)
873 private readonly T4 m_Item4
; // Do not rename (binary serialization)
874 private readonly T5 m_Item5
; // Do not rename (binary serialization)
875 private readonly T6 m_Item6
; // Do not rename (binary serialization)
876 private readonly T7 m_Item7
; // Do not rename (binary serialization)
878 public T1 Item1 { get { return m_Item1; }
}
879 public T2 Item2 { get { return m_Item2; }
}
880 public T3 Item3 { get { return m_Item3; }
}
881 public T4 Item4 { get { return m_Item4; }
}
882 public T5 Item5 { get { return m_Item5; }
}
883 public T6 Item6 { get { return m_Item6; }
}
884 public T7 Item7 { get { return m_Item7; }
}
886 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
)
897 public override bool Equals(object? obj
)
899 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
902 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
904 if (other
== null) return false;
906 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> objTuple
))
911 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
) && comparer
.Equals(m_Item4
, objTuple
.m_Item4
) && comparer
.Equals(m_Item5
, objTuple
.m_Item5
) && comparer
.Equals(m_Item6
, objTuple
.m_Item6
) && comparer
.Equals(m_Item7
, objTuple
.m_Item7
);
914 int IComparable
.CompareTo(object? obj
)
916 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
919 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
921 if (other
== null) return 1;
923 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> objTuple
))
925 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
930 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
932 if (c
!= 0) return c
;
934 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
936 if (c
!= 0) return c
;
938 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
940 if (c
!= 0) return c
;
942 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
944 if (c
!= 0) return c
;
946 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
948 if (c
!= 0) return c
;
950 c
= comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
952 if (c
!= 0) return c
;
954 return comparer
.Compare(m_Item7
, objTuple
.m_Item7
);
957 public override int GetHashCode()
959 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
962 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
964 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!));
967 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
969 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
971 public override string ToString()
973 StringBuilder sb
= new StringBuilder();
975 return ((ITupleInternal
)this).ToString(sb
);
978 string ITupleInternal
.ToString(StringBuilder sb
)
994 return sb
.ToString();
998 /// The number of positions in this data structure.
1000 int ITuple
.Length
=> 7;
1003 /// Get the element at position <param name="index"/>.
1005 object? ITuple
.this[int index
]
1026 throw new IndexOutOfRangeException();
1033 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
1034 public class Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple where TRest
: object
1036 private readonly T1 m_Item1
; // Do not rename (binary serialization)
1037 private readonly T2 m_Item2
; // Do not rename (binary serialization)
1038 private readonly T3 m_Item3
; // Do not rename (binary serialization)
1039 private readonly T4 m_Item4
; // Do not rename (binary serialization)
1040 private readonly T5 m_Item5
; // Do not rename (binary serialization)
1041 private readonly T6 m_Item6
; // Do not rename (binary serialization)
1042 private readonly T7 m_Item7
; // Do not rename (binary serialization)
1043 private readonly TRest m_Rest
; // Do not rename (binary serialization)
1045 public T1 Item1 { get { return m_Item1; }
}
1046 public T2 Item2 { get { return m_Item2; }
}
1047 public T3 Item3 { get { return m_Item3; }
}
1048 public T4 Item4 { get { return m_Item4; }
}
1049 public T5 Item5 { get { return m_Item5; }
}
1050 public T6 Item6 { get { return m_Item6; }
}
1051 public T7 Item7 { get { return m_Item7; }
}
1052 public TRest Rest { get { return m_Rest; }
}
1054 public Tuple(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
, TRest rest
)
1056 if (!(rest
is ITupleInternal
))
1058 throw new ArgumentException(SR
.ArgumentException_TupleLastArgumentNotATuple
);
1071 public override bool Equals(object? obj
)
1073 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
1076 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
1078 if (other
== null) return false;
1080 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> objTuple
))
1085 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
) && comparer
.Equals(m_Item3
, objTuple
.m_Item3
) && comparer
.Equals(m_Item4
, objTuple
.m_Item4
) && comparer
.Equals(m_Item5
, objTuple
.m_Item5
) && comparer
.Equals(m_Item6
, objTuple
.m_Item6
) && comparer
.Equals(m_Item7
, objTuple
.m_Item7
) && comparer
.Equals(m_Rest
, objTuple
.m_Rest
);
1088 int IComparable
.CompareTo(object? obj
)
1090 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
1093 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
1095 if (other
== null) return 1;
1097 if (!(other
is Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, TRest
> objTuple
))
1099 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
1104 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
1106 if (c
!= 0) return c
;
1108 c
= comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
1110 if (c
!= 0) return c
;
1112 c
= comparer
.Compare(m_Item3
, objTuple
.m_Item3
);
1114 if (c
!= 0) return c
;
1116 c
= comparer
.Compare(m_Item4
, objTuple
.m_Item4
);
1118 if (c
!= 0) return c
;
1120 c
= comparer
.Compare(m_Item5
, objTuple
.m_Item5
);
1122 if (c
!= 0) return c
;
1124 c
= comparer
.Compare(m_Item6
, objTuple
.m_Item6
);
1126 if (c
!= 0) return c
;
1128 c
= comparer
.Compare(m_Item7
, objTuple
.m_Item7
);
1130 if (c
!= 0) return c
;
1132 return comparer
.Compare(m_Rest
, objTuple
.m_Rest
);
1135 public override int GetHashCode()
1137 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
1140 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
1142 // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
1143 ITupleInternal t
= (ITupleInternal
)m_Rest
;
1144 if (t
.Length
>= 8) { return t.GetHashCode(comparer); }
1146 // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
1147 int k
= 8 - t
.Length
;
1151 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1153 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1155 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1157 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1159 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1161 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1163 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!), comparer
.GetHashCode(m_Item3
!), comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1165 Debug
.Fail("Missed all cases for computing Tuple hash code");
1169 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
1171 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
1173 public override string ToString()
1175 StringBuilder sb
= new StringBuilder();
1177 return ((ITupleInternal
)this).ToString(sb
);
1180 string ITupleInternal
.ToString(StringBuilder sb
)
1196 return ((ITupleInternal
)m_Rest
).ToString(sb
);
1200 /// The number of positions in this data structure.
1206 return 7 + ((ITupleInternal
)Rest
).Length
;
1211 /// Get the element at position <param name="index"/>.
1213 object? ITuple
.this[int index
]
1235 return ((ITupleInternal
)Rest
)[index
- 7];