Fix IDE0025 (use expression body for properties)
[mono-project.git] / netcore / System.Private.CoreLib / shared / System / Tuple.cs
blob4915777b23df34bf643126f418407c5ecdf3d552
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;
9 using System.Text;
12 // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it.
15 namespace System
17 /// <summary>
18 /// Helper so we can call some tuple methods recursively without knowing the underlying types.
19 /// </summary>
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));
105 [Serializable]
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 => m_Item1;
113 public Tuple(T1 item1)
115 m_Item1 = 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))
129 return false;
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();
169 sb.Append('(');
170 return ((ITupleInternal)this).ToString(sb);
173 string ITupleInternal.ToString(StringBuilder sb)
175 sb.Append(m_Item1);
176 sb.Append(')');
177 return sb.ToString();
180 /// <summary>
181 /// The number of positions in this data structure.
182 /// </summary>
183 int ITuple.Length => 1;
185 /// <summary>
186 /// Get the element at position <param name="index"/>.
187 /// </summary>
188 object? ITuple.this[int index]
192 if (index != 0)
194 throw new IndexOutOfRangeException();
196 return Item1;
201 [Serializable]
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 => m_Item1;
209 public T2 Item2 => m_Item2;
211 public Tuple(T1 item1, T2 item2)
213 m_Item1 = item1;
214 m_Item2 = 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))
228 return false;
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));
248 int c = 0;
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();
274 sb.Append('(');
275 return ((ITupleInternal)this).ToString(sb);
278 string ITupleInternal.ToString(StringBuilder sb)
280 sb.Append(m_Item1);
281 sb.Append(", ");
282 sb.Append(m_Item2);
283 sb.Append(')');
284 return sb.ToString();
287 /// <summary>
288 /// The number of positions in this data structure.
289 /// </summary>
290 int ITuple.Length => 2;
292 /// <summary>
293 /// Get the element at position <param name="index"/>.
294 /// </summary>
295 object? ITuple.this[int index]
299 return index switch
301 0 => Item1,
302 1 => Item2,
303 _ => throw new IndexOutOfRangeException(),
309 [Serializable]
310 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
311 public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
313 private readonly T1 m_Item1; // Do not rename (binary serialization)
314 private readonly T2 m_Item2; // Do not rename (binary serialization)
315 private readonly T3 m_Item3; // Do not rename (binary serialization)
317 public T1 Item1 => m_Item1;
318 public T2 Item2 => m_Item2;
319 public T3 Item3 => m_Item3;
321 public Tuple(T1 item1, T2 item2, T3 item3)
323 m_Item1 = item1;
324 m_Item2 = item2;
325 m_Item3 = item3;
328 public override bool Equals(object? obj)
330 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
333 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
335 if (other == null) return false;
337 if (!(other is Tuple<T1, T2, T3> objTuple))
339 return false;
342 return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3);
345 int IComparable.CompareTo(object? obj)
347 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
350 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
352 if (other == null) return 1;
354 if (!(other is Tuple<T1, T2, T3> objTuple))
356 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
359 int c = 0;
361 c = comparer.Compare(m_Item1, objTuple.m_Item1);
363 if (c != 0) return c;
365 c = comparer.Compare(m_Item2, objTuple.m_Item2);
367 if (c != 0) return c;
369 return comparer.Compare(m_Item3, objTuple.m_Item3);
372 public override int GetHashCode()
374 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
377 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
379 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!));
382 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
384 return ((IStructuralEquatable)this).GetHashCode(comparer);
386 public override string ToString()
388 StringBuilder sb = new StringBuilder();
389 sb.Append('(');
390 return ((ITupleInternal)this).ToString(sb);
393 string ITupleInternal.ToString(StringBuilder sb)
395 sb.Append(m_Item1);
396 sb.Append(", ");
397 sb.Append(m_Item2);
398 sb.Append(", ");
399 sb.Append(m_Item3);
400 sb.Append(')');
401 return sb.ToString();
404 /// <summary>
405 /// The number of positions in this data structure.
406 /// </summary>
407 int ITuple.Length => 3;
409 /// <summary>
410 /// Get the element at position <param name="index"/>.
411 /// </summary>
412 object? ITuple.this[int index]
416 return index switch
418 0 => Item1,
419 1 => Item2,
420 2 => Item3,
421 _ => throw new IndexOutOfRangeException(),
427 [Serializable]
428 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
429 public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
431 private readonly T1 m_Item1; // Do not rename (binary serialization)
432 private readonly T2 m_Item2; // Do not rename (binary serialization)
433 private readonly T3 m_Item3; // Do not rename (binary serialization)
434 private readonly T4 m_Item4; // Do not rename (binary serialization)
436 public T1 Item1 => m_Item1;
437 public T2 Item2 => m_Item2;
438 public T3 Item3 => m_Item3;
439 public T4 Item4 => m_Item4;
441 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4)
443 m_Item1 = item1;
444 m_Item2 = item2;
445 m_Item3 = item3;
446 m_Item4 = item4;
449 public override bool Equals(object? obj)
451 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
454 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
456 if (other == null) return false;
458 if (!(other is Tuple<T1, T2, T3, T4> objTuple))
460 return false;
463 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);
466 int IComparable.CompareTo(object? obj)
468 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
471 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
473 if (other == null) return 1;
475 if (!(other is Tuple<T1, T2, T3, T4> objTuple))
477 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
480 int c = 0;
482 c = comparer.Compare(m_Item1, objTuple.m_Item1);
484 if (c != 0) return c;
486 c = comparer.Compare(m_Item2, objTuple.m_Item2);
488 if (c != 0) return c;
490 c = comparer.Compare(m_Item3, objTuple.m_Item3);
492 if (c != 0) return c;
494 return comparer.Compare(m_Item4, objTuple.m_Item4);
497 public override int GetHashCode()
499 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
502 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
504 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!));
507 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
509 return ((IStructuralEquatable)this).GetHashCode(comparer);
511 public override string ToString()
513 StringBuilder sb = new StringBuilder();
514 sb.Append('(');
515 return ((ITupleInternal)this).ToString(sb);
518 string ITupleInternal.ToString(StringBuilder sb)
520 sb.Append(m_Item1);
521 sb.Append(", ");
522 sb.Append(m_Item2);
523 sb.Append(", ");
524 sb.Append(m_Item3);
525 sb.Append(", ");
526 sb.Append(m_Item4);
527 sb.Append(')');
528 return sb.ToString();
531 /// <summary>
532 /// The number of positions in this data structure.
533 /// </summary>
534 int ITuple.Length => 4;
536 /// <summary>
537 /// Get the element at position <param name="index"/>.
538 /// </summary>
539 object? ITuple.this[int index]
543 return index switch
545 0 => Item1,
546 1 => Item2,
547 2 => Item3,
548 3 => Item4,
549 _ => throw new IndexOutOfRangeException(),
555 [Serializable]
556 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
557 public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
559 private readonly T1 m_Item1; // Do not rename (binary serialization)
560 private readonly T2 m_Item2; // Do not rename (binary serialization)
561 private readonly T3 m_Item3; // Do not rename (binary serialization)
562 private readonly T4 m_Item4; // Do not rename (binary serialization)
563 private readonly T5 m_Item5; // Do not rename (binary serialization)
565 public T1 Item1 => m_Item1;
566 public T2 Item2 => m_Item2;
567 public T3 Item3 => m_Item3;
568 public T4 Item4 => m_Item4;
569 public T5 Item5 => m_Item5;
571 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
573 m_Item1 = item1;
574 m_Item2 = item2;
575 m_Item3 = item3;
576 m_Item4 = item4;
577 m_Item5 = item5;
580 public override bool Equals(object? obj)
582 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
585 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
587 if (other == null) return false;
589 if (!(other is Tuple<T1, T2, T3, T4, T5> objTuple))
591 return false;
594 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);
597 int IComparable.CompareTo(object? obj)
599 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
602 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
604 if (other == null) return 1;
606 if (!(other is Tuple<T1, T2, T3, T4, T5> objTuple))
608 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
611 int c = 0;
613 c = comparer.Compare(m_Item1, objTuple.m_Item1);
615 if (c != 0) return c;
617 c = comparer.Compare(m_Item2, objTuple.m_Item2);
619 if (c != 0) return c;
621 c = comparer.Compare(m_Item3, objTuple.m_Item3);
623 if (c != 0) return c;
625 c = comparer.Compare(m_Item4, objTuple.m_Item4);
627 if (c != 0) return c;
629 return comparer.Compare(m_Item5, objTuple.m_Item5);
632 public override int GetHashCode()
634 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
637 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
639 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!));
642 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
644 return ((IStructuralEquatable)this).GetHashCode(comparer);
646 public override string ToString()
648 StringBuilder sb = new StringBuilder();
649 sb.Append('(');
650 return ((ITupleInternal)this).ToString(sb);
653 string ITupleInternal.ToString(StringBuilder sb)
655 sb.Append(m_Item1);
656 sb.Append(", ");
657 sb.Append(m_Item2);
658 sb.Append(", ");
659 sb.Append(m_Item3);
660 sb.Append(", ");
661 sb.Append(m_Item4);
662 sb.Append(", ");
663 sb.Append(m_Item5);
664 sb.Append(')');
665 return sb.ToString();
668 /// <summary>
669 /// The number of positions in this data structure.
670 /// </summary>
671 int ITuple.Length => 5;
673 /// <summary>
674 /// Get the element at position <param name="index"/>.
675 /// </summary>
676 object? ITuple.this[int index]
680 return index switch
682 0 => Item1,
683 1 => Item2,
684 2 => Item3,
685 3 => Item4,
686 4 => Item5,
687 _ => throw new IndexOutOfRangeException(),
693 [Serializable]
694 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
695 public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
697 private readonly T1 m_Item1; // Do not rename (binary serialization)
698 private readonly T2 m_Item2; // Do not rename (binary serialization)
699 private readonly T3 m_Item3; // Do not rename (binary serialization)
700 private readonly T4 m_Item4; // Do not rename (binary serialization)
701 private readonly T5 m_Item5; // Do not rename (binary serialization)
702 private readonly T6 m_Item6; // Do not rename (binary serialization)
704 public T1 Item1 => m_Item1;
705 public T2 Item2 => m_Item2;
706 public T3 Item3 => m_Item3;
707 public T4 Item4 => m_Item4;
708 public T5 Item5 => m_Item5;
709 public T6 Item6 => m_Item6;
711 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
713 m_Item1 = item1;
714 m_Item2 = item2;
715 m_Item3 = item3;
716 m_Item4 = item4;
717 m_Item5 = item5;
718 m_Item6 = item6;
721 public override bool Equals(object? obj)
723 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
726 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
728 if (other == null) return false;
730 if (!(other is Tuple<T1, T2, T3, T4, T5, T6> objTuple))
732 return false;
735 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);
738 int IComparable.CompareTo(object? obj)
740 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
743 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
745 if (other == null) return 1;
747 if (!(other is Tuple<T1, T2, T3, T4, T5, T6> objTuple))
749 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
752 int c = 0;
754 c = comparer.Compare(m_Item1, objTuple.m_Item1);
756 if (c != 0) return c;
758 c = comparer.Compare(m_Item2, objTuple.m_Item2);
760 if (c != 0) return c;
762 c = comparer.Compare(m_Item3, objTuple.m_Item3);
764 if (c != 0) return c;
766 c = comparer.Compare(m_Item4, objTuple.m_Item4);
768 if (c != 0) return c;
770 c = comparer.Compare(m_Item5, objTuple.m_Item5);
772 if (c != 0) return c;
774 return comparer.Compare(m_Item6, objTuple.m_Item6);
777 public override int GetHashCode()
779 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
782 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
784 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!));
787 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
789 return ((IStructuralEquatable)this).GetHashCode(comparer);
791 public override string ToString()
793 StringBuilder sb = new StringBuilder();
794 sb.Append('(');
795 return ((ITupleInternal)this).ToString(sb);
798 string ITupleInternal.ToString(StringBuilder sb)
800 sb.Append(m_Item1);
801 sb.Append(", ");
802 sb.Append(m_Item2);
803 sb.Append(", ");
804 sb.Append(m_Item3);
805 sb.Append(", ");
806 sb.Append(m_Item4);
807 sb.Append(", ");
808 sb.Append(m_Item5);
809 sb.Append(", ");
810 sb.Append(m_Item6);
811 sb.Append(')');
812 return sb.ToString();
815 /// <summary>
816 /// The number of positions in this data structure.
817 /// </summary>
818 int ITuple.Length => 6;
820 /// <summary>
821 /// Get the element at position <param name="index"/>.
822 /// </summary>
823 object? ITuple.this[int index]
827 return index switch
829 0 => Item1,
830 1 => Item2,
831 2 => Item3,
832 3 => Item4,
833 4 => Item5,
834 5 => Item6,
835 _ => throw new IndexOutOfRangeException(),
841 [Serializable]
842 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
843 public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
845 private readonly T1 m_Item1; // Do not rename (binary serialization)
846 private readonly T2 m_Item2; // Do not rename (binary serialization)
847 private readonly T3 m_Item3; // Do not rename (binary serialization)
848 private readonly T4 m_Item4; // Do not rename (binary serialization)
849 private readonly T5 m_Item5; // Do not rename (binary serialization)
850 private readonly T6 m_Item6; // Do not rename (binary serialization)
851 private readonly T7 m_Item7; // Do not rename (binary serialization)
853 public T1 Item1 => m_Item1;
854 public T2 Item2 => m_Item2;
855 public T3 Item3 => m_Item3;
856 public T4 Item4 => m_Item4;
857 public T5 Item5 => m_Item5;
858 public T6 Item6 => m_Item6;
859 public T7 Item7 => m_Item7;
861 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
863 m_Item1 = item1;
864 m_Item2 = item2;
865 m_Item3 = item3;
866 m_Item4 = item4;
867 m_Item5 = item5;
868 m_Item6 = item6;
869 m_Item7 = item7;
872 public override bool Equals(object? obj)
874 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
877 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
879 if (other == null) return false;
881 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple))
883 return false;
886 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);
889 int IComparable.CompareTo(object? obj)
891 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
894 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
896 if (other == null) return 1;
898 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple))
900 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
903 int c = 0;
905 c = comparer.Compare(m_Item1, objTuple.m_Item1);
907 if (c != 0) return c;
909 c = comparer.Compare(m_Item2, objTuple.m_Item2);
911 if (c != 0) return c;
913 c = comparer.Compare(m_Item3, objTuple.m_Item3);
915 if (c != 0) return c;
917 c = comparer.Compare(m_Item4, objTuple.m_Item4);
919 if (c != 0) return c;
921 c = comparer.Compare(m_Item5, objTuple.m_Item5);
923 if (c != 0) return c;
925 c = comparer.Compare(m_Item6, objTuple.m_Item6);
927 if (c != 0) return c;
929 return comparer.Compare(m_Item7, objTuple.m_Item7);
932 public override int GetHashCode()
934 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
937 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
939 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!));
942 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
944 return ((IStructuralEquatable)this).GetHashCode(comparer);
946 public override string ToString()
948 StringBuilder sb = new StringBuilder();
949 sb.Append('(');
950 return ((ITupleInternal)this).ToString(sb);
953 string ITupleInternal.ToString(StringBuilder sb)
955 sb.Append(m_Item1);
956 sb.Append(", ");
957 sb.Append(m_Item2);
958 sb.Append(", ");
959 sb.Append(m_Item3);
960 sb.Append(", ");
961 sb.Append(m_Item4);
962 sb.Append(", ");
963 sb.Append(m_Item5);
964 sb.Append(", ");
965 sb.Append(m_Item6);
966 sb.Append(", ");
967 sb.Append(m_Item7);
968 sb.Append(')');
969 return sb.ToString();
972 /// <summary>
973 /// The number of positions in this data structure.
974 /// </summary>
975 int ITuple.Length => 7;
977 /// <summary>
978 /// Get the element at position <param name="index"/>.
979 /// </summary>
980 object? ITuple.this[int index]
984 return index switch
986 0 => Item1,
987 1 => Item2,
988 2 => Item3,
989 3 => Item4,
990 4 => Item5,
991 5 => Item6,
992 6 => Item7,
993 _ => throw new IndexOutOfRangeException(),
999 [Serializable]
1000 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
1001 public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple where TRest : notnull
1003 private readonly T1 m_Item1; // Do not rename (binary serialization)
1004 private readonly T2 m_Item2; // Do not rename (binary serialization)
1005 private readonly T3 m_Item3; // Do not rename (binary serialization)
1006 private readonly T4 m_Item4; // Do not rename (binary serialization)
1007 private readonly T5 m_Item5; // Do not rename (binary serialization)
1008 private readonly T6 m_Item6; // Do not rename (binary serialization)
1009 private readonly T7 m_Item7; // Do not rename (binary serialization)
1010 private readonly TRest m_Rest; // Do not rename (binary serialization)
1012 public T1 Item1 => m_Item1;
1013 public T2 Item2 => m_Item2;
1014 public T3 Item3 => m_Item3;
1015 public T4 Item4 => m_Item4;
1016 public T5 Item5 => m_Item5;
1017 public T6 Item6 => m_Item6;
1018 public T7 Item7 => m_Item7;
1019 public TRest Rest => m_Rest;
1021 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest)
1023 if (!(rest is ITupleInternal))
1025 throw new ArgumentException(SR.ArgumentException_TupleLastArgumentNotATuple);
1028 m_Item1 = item1;
1029 m_Item2 = item2;
1030 m_Item3 = item3;
1031 m_Item4 = item4;
1032 m_Item5 = item5;
1033 m_Item6 = item6;
1034 m_Item7 = item7;
1035 m_Rest = rest;
1038 public override bool Equals(object? obj)
1040 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
1043 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
1045 if (other == null) return false;
1047 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple))
1049 return false;
1052 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);
1055 int IComparable.CompareTo(object? obj)
1057 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
1060 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
1062 if (other == null) return 1;
1064 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple))
1066 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
1069 int c = 0;
1071 c = comparer.Compare(m_Item1, objTuple.m_Item1);
1073 if (c != 0) return c;
1075 c = comparer.Compare(m_Item2, objTuple.m_Item2);
1077 if (c != 0) return c;
1079 c = comparer.Compare(m_Item3, objTuple.m_Item3);
1081 if (c != 0) return c;
1083 c = comparer.Compare(m_Item4, objTuple.m_Item4);
1085 if (c != 0) return c;
1087 c = comparer.Compare(m_Item5, objTuple.m_Item5);
1089 if (c != 0) return c;
1091 c = comparer.Compare(m_Item6, objTuple.m_Item6);
1093 if (c != 0) return c;
1095 c = comparer.Compare(m_Item7, objTuple.m_Item7);
1097 if (c != 0) return c;
1099 return comparer.Compare(m_Rest, objTuple.m_Rest);
1102 public override int GetHashCode()
1104 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
1107 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
1109 // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
1110 ITupleInternal t = (ITupleInternal)m_Rest;
1111 if (t.Length >= 8) { return t.GetHashCode(comparer); }
1113 // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
1114 int k = 8 - t.Length;
1115 switch (k)
1117 case 1:
1118 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1119 case 2:
1120 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1121 case 3:
1122 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1123 case 4:
1124 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1125 case 5:
1126 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));
1127 case 6:
1128 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));
1129 case 7:
1130 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));
1132 Debug.Fail("Missed all cases for computing Tuple hash code");
1133 return -1;
1136 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
1138 return ((IStructuralEquatable)this).GetHashCode(comparer);
1140 public override string ToString()
1142 StringBuilder sb = new StringBuilder();
1143 sb.Append('(');
1144 return ((ITupleInternal)this).ToString(sb);
1147 string ITupleInternal.ToString(StringBuilder sb)
1149 sb.Append(m_Item1);
1150 sb.Append(", ");
1151 sb.Append(m_Item2);
1152 sb.Append(", ");
1153 sb.Append(m_Item3);
1154 sb.Append(", ");
1155 sb.Append(m_Item4);
1156 sb.Append(", ");
1157 sb.Append(m_Item5);
1158 sb.Append(", ");
1159 sb.Append(m_Item6);
1160 sb.Append(", ");
1161 sb.Append(m_Item7);
1162 sb.Append(", ");
1163 return ((ITupleInternal)m_Rest).ToString(sb);
1166 /// <summary>
1167 /// The number of positions in this data structure.
1168 /// </summary>
1169 int ITuple.Length => 7 + ((ITupleInternal)Rest).Length;
1171 /// <summary>
1172 /// Get the element at position <param name="index"/>.
1173 /// </summary>
1174 object? ITuple.this[int index]
1178 return index switch
1180 0 => Item1,
1181 1 => Item2,
1182 2 => Item3,
1183 3 => Item4,
1184 4 => Item5,
1185 5 => Item6,
1186 6 => Item7,
1188 _ => ((ITupleInternal)Rest)[index - 7],