Add and apply nullable attributes (dotnet/coreclr#24679)
[mono-project.git] / netcore / System.Private.CoreLib / shared / System / Tuple.cs
blob034264df21af157c87641cc86bffafd0aac1add7
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 { get { return 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 { get { return m_Item1; } }
209 public T2 Item2 { get { return 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 switch (index)
301 case 0:
302 return Item1;
303 case 1:
304 return Item2;
305 default:
306 throw new IndexOutOfRangeException();
312 [Serializable]
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)
326 m_Item1 = item1;
327 m_Item2 = item2;
328 m_Item3 = 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))
342 return false;
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));
362 int c = 0;
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();
392 sb.Append('(');
393 return ((ITupleInternal)this).ToString(sb);
396 string ITupleInternal.ToString(StringBuilder sb)
398 sb.Append(m_Item1);
399 sb.Append(", ");
400 sb.Append(m_Item2);
401 sb.Append(", ");
402 sb.Append(m_Item3);
403 sb.Append(')');
404 return sb.ToString();
407 /// <summary>
408 /// The number of positions in this data structure.
409 /// </summary>
410 int ITuple.Length => 3;
412 /// <summary>
413 /// Get the element at position <param name="index"/>.
414 /// </summary>
415 object? ITuple.this[int index]
419 switch (index)
421 case 0:
422 return Item1;
423 case 1:
424 return Item2;
425 case 2:
426 return Item3;
427 default:
428 throw new IndexOutOfRangeException();
434 [Serializable]
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)
450 m_Item1 = item1;
451 m_Item2 = item2;
452 m_Item3 = item3;
453 m_Item4 = 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))
467 return false;
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));
487 int c = 0;
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();
521 sb.Append('(');
522 return ((ITupleInternal)this).ToString(sb);
525 string ITupleInternal.ToString(StringBuilder sb)
527 sb.Append(m_Item1);
528 sb.Append(", ");
529 sb.Append(m_Item2);
530 sb.Append(", ");
531 sb.Append(m_Item3);
532 sb.Append(", ");
533 sb.Append(m_Item4);
534 sb.Append(')');
535 return sb.ToString();
538 /// <summary>
539 /// The number of positions in this data structure.
540 /// </summary>
541 int ITuple.Length => 4;
543 /// <summary>
544 /// Get the element at position <param name="index"/>.
545 /// </summary>
546 object? ITuple.this[int index]
550 switch (index)
552 case 0:
553 return Item1;
554 case 1:
555 return Item2;
556 case 2:
557 return Item3;
558 case 3:
559 return Item4;
560 default:
561 throw new IndexOutOfRangeException();
567 [Serializable]
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)
585 m_Item1 = item1;
586 m_Item2 = item2;
587 m_Item3 = item3;
588 m_Item4 = item4;
589 m_Item5 = 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))
603 return false;
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));
623 int c = 0;
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();
661 sb.Append('(');
662 return ((ITupleInternal)this).ToString(sb);
665 string ITupleInternal.ToString(StringBuilder sb)
667 sb.Append(m_Item1);
668 sb.Append(", ");
669 sb.Append(m_Item2);
670 sb.Append(", ");
671 sb.Append(m_Item3);
672 sb.Append(", ");
673 sb.Append(m_Item4);
674 sb.Append(", ");
675 sb.Append(m_Item5);
676 sb.Append(')');
677 return sb.ToString();
680 /// <summary>
681 /// The number of positions in this data structure.
682 /// </summary>
683 int ITuple.Length => 5;
685 /// <summary>
686 /// Get the element at position <param name="index"/>.
687 /// </summary>
688 object? ITuple.this[int index]
692 switch (index)
694 case 0:
695 return Item1;
696 case 1:
697 return Item2;
698 case 2:
699 return Item3;
700 case 3:
701 return Item4;
702 case 4:
703 return Item5;
704 default:
705 throw new IndexOutOfRangeException();
711 [Serializable]
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)
731 m_Item1 = item1;
732 m_Item2 = item2;
733 m_Item3 = item3;
734 m_Item4 = item4;
735 m_Item5 = item5;
736 m_Item6 = 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))
750 return false;
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));
770 int c = 0;
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();
812 sb.Append('(');
813 return ((ITupleInternal)this).ToString(sb);
816 string ITupleInternal.ToString(StringBuilder sb)
818 sb.Append(m_Item1);
819 sb.Append(", ");
820 sb.Append(m_Item2);
821 sb.Append(", ");
822 sb.Append(m_Item3);
823 sb.Append(", ");
824 sb.Append(m_Item4);
825 sb.Append(", ");
826 sb.Append(m_Item5);
827 sb.Append(", ");
828 sb.Append(m_Item6);
829 sb.Append(')');
830 return sb.ToString();
833 /// <summary>
834 /// The number of positions in this data structure.
835 /// </summary>
836 int ITuple.Length => 6;
838 /// <summary>
839 /// Get the element at position <param name="index"/>.
840 /// </summary>
841 object? ITuple.this[int index]
845 switch (index)
847 case 0:
848 return Item1;
849 case 1:
850 return Item2;
851 case 2:
852 return Item3;
853 case 3:
854 return Item4;
855 case 4:
856 return Item5;
857 case 5:
858 return Item6;
859 default:
860 throw new IndexOutOfRangeException();
866 [Serializable]
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)
888 m_Item1 = item1;
889 m_Item2 = item2;
890 m_Item3 = item3;
891 m_Item4 = item4;
892 m_Item5 = item5;
893 m_Item6 = item6;
894 m_Item7 = 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))
908 return false;
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));
928 int c = 0;
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();
974 sb.Append('(');
975 return ((ITupleInternal)this).ToString(sb);
978 string ITupleInternal.ToString(StringBuilder sb)
980 sb.Append(m_Item1);
981 sb.Append(", ");
982 sb.Append(m_Item2);
983 sb.Append(", ");
984 sb.Append(m_Item3);
985 sb.Append(", ");
986 sb.Append(m_Item4);
987 sb.Append(", ");
988 sb.Append(m_Item5);
989 sb.Append(", ");
990 sb.Append(m_Item6);
991 sb.Append(", ");
992 sb.Append(m_Item7);
993 sb.Append(')');
994 return sb.ToString();
997 /// <summary>
998 /// The number of positions in this data structure.
999 /// </summary>
1000 int ITuple.Length => 7;
1002 /// <summary>
1003 /// Get the element at position <param name="index"/>.
1004 /// </summary>
1005 object? ITuple.this[int index]
1009 switch (index)
1011 case 0:
1012 return Item1;
1013 case 1:
1014 return Item2;
1015 case 2:
1016 return Item3;
1017 case 3:
1018 return Item4;
1019 case 4:
1020 return Item5;
1021 case 5:
1022 return Item6;
1023 case 6:
1024 return Item7;
1025 default:
1026 throw new IndexOutOfRangeException();
1032 [Serializable]
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);
1061 m_Item1 = item1;
1062 m_Item2 = item2;
1063 m_Item3 = item3;
1064 m_Item4 = item4;
1065 m_Item5 = item5;
1066 m_Item6 = item6;
1067 m_Item7 = item7;
1068 m_Rest = rest;
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))
1082 return false;
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));
1102 int c = 0;
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;
1148 switch (k)
1150 case 1:
1151 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1152 case 2:
1153 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1154 case 3:
1155 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1156 case 4:
1157 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1158 case 5:
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));
1160 case 6:
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));
1162 case 7:
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");
1166 return -1;
1169 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
1171 return ((IStructuralEquatable)this).GetHashCode(comparer);
1173 public override string ToString()
1175 StringBuilder sb = new StringBuilder();
1176 sb.Append('(');
1177 return ((ITupleInternal)this).ToString(sb);
1180 string ITupleInternal.ToString(StringBuilder sb)
1182 sb.Append(m_Item1);
1183 sb.Append(", ");
1184 sb.Append(m_Item2);
1185 sb.Append(", ");
1186 sb.Append(m_Item3);
1187 sb.Append(", ");
1188 sb.Append(m_Item4);
1189 sb.Append(", ");
1190 sb.Append(m_Item5);
1191 sb.Append(", ");
1192 sb.Append(m_Item6);
1193 sb.Append(", ");
1194 sb.Append(m_Item7);
1195 sb.Append(", ");
1196 return ((ITupleInternal)m_Rest).ToString(sb);
1199 /// <summary>
1200 /// The number of positions in this data structure.
1201 /// </summary>
1202 int ITuple.Length
1206 return 7 + ((ITupleInternal)Rest).Length;
1210 /// <summary>
1211 /// Get the element at position <param name="index"/>.
1212 /// </summary>
1213 object? ITuple.this[int index]
1217 switch (index)
1219 case 0:
1220 return Item1;
1221 case 1:
1222 return Item2;
1223 case 2:
1224 return Item3;
1225 case 3:
1226 return Item4;
1227 case 4:
1228 return Item5;
1229 case 5:
1230 return Item6;
1231 case 6:
1232 return Item7;
1235 return ((ITupleInternal)Rest)[index - 7];