Move portable thread pool to shared partition (dotnet/corert#7828)
[mono-project.git] / netcore / System.Private.CoreLib / shared / System / Tuple.cs
blobe912ee1462e518c7339d50f81085eebba415d5ad
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;
11 namespace System
13 /// <summary>
14 /// Helper so we can call some tuple methods recursively without knowing the underlying types.
15 /// </summary>
16 internal interface ITupleInternal : ITuple
18 string ToString(StringBuilder sb);
19 int GetHashCode(IEqualityComparer comparer);
22 public static class Tuple
24 public static Tuple<T1> Create<T1>(T1 item1)
26 return new Tuple<T1>(item1);
29 public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
31 return new Tuple<T1, T2>(item1, item2);
34 public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
36 return new Tuple<T1, T2, T3>(item1, item2, item3);
39 public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)
41 return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);
44 public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
46 return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
49 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)
51 return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
54 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)
56 return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
59 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)
61 return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
64 // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it.
66 // From System.Web.Util.HashCodeCombiner
67 internal static int CombineHashCodes(int h1, int h2)
69 return ((h1 << 5) + h1) ^ h2;
72 internal static int CombineHashCodes(int h1, int h2, int h3)
74 return CombineHashCodes(CombineHashCodes(h1, h2), h3);
77 internal static int CombineHashCodes(int h1, int h2, int h3, int h4)
79 return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4));
82 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5)
84 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), h5);
87 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6)
89 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6));
92 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7)
94 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7));
97 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8)
99 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8));
103 [Serializable]
104 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
105 public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
107 private readonly T1 m_Item1; // Do not rename (binary serialization)
109 public T1 Item1 => m_Item1;
111 public Tuple(T1 item1)
113 m_Item1 = item1;
116 public override bool Equals(object? obj)
118 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
121 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
123 if (other == null) return false;
125 if (!(other is Tuple<T1> objTuple))
127 return false;
130 return comparer.Equals(m_Item1, objTuple.m_Item1);
133 int IComparable.CompareTo(object? obj)
135 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
138 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
140 if (other == null) return 1;
142 if (!(other is Tuple<T1> objTuple))
144 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
147 return comparer.Compare(m_Item1, objTuple.m_Item1);
150 public override int GetHashCode()
152 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
155 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
157 return comparer.GetHashCode(m_Item1!);
160 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
162 return ((IStructuralEquatable)this).GetHashCode(comparer);
164 public override string ToString()
166 StringBuilder sb = new StringBuilder();
167 sb.Append('(');
168 return ((ITupleInternal)this).ToString(sb);
171 string ITupleInternal.ToString(StringBuilder sb)
173 sb.Append(m_Item1);
174 sb.Append(')');
175 return sb.ToString();
178 /// <summary>
179 /// The number of positions in this data structure.
180 /// </summary>
181 int ITuple.Length => 1;
183 /// <summary>
184 /// Get the element at position <param name="index"/>.
185 /// </summary>
186 object? ITuple.this[int index]
190 if (index != 0)
192 throw new IndexOutOfRangeException();
194 return Item1;
199 [Serializable]
200 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
201 public class Tuple<T1, T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
203 private readonly T1 m_Item1; // Do not rename (binary serialization)
204 private readonly T2 m_Item2; // Do not rename (binary serialization)
206 public T1 Item1 => m_Item1;
207 public T2 Item2 => m_Item2;
209 public Tuple(T1 item1, T2 item2)
211 m_Item1 = item1;
212 m_Item2 = item2;
215 public override bool Equals(object? obj)
217 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
220 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
222 if (other == null) return false;
224 if (!(other is Tuple<T1, T2> objTuple))
226 return false;
229 return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2);
232 int IComparable.CompareTo(object? obj)
234 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
237 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
239 if (other == null) return 1;
241 if (!(other is Tuple<T1, T2> objTuple))
243 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
246 int c = comparer.Compare(m_Item1, objTuple.m_Item1);
248 if (c != 0) return c;
250 return comparer.Compare(m_Item2, objTuple.m_Item2);
253 public override int GetHashCode()
255 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
258 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
260 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!));
263 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
265 return ((IStructuralEquatable)this).GetHashCode(comparer);
267 public override string ToString()
269 StringBuilder sb = new StringBuilder();
270 sb.Append('(');
271 return ((ITupleInternal)this).ToString(sb);
274 string ITupleInternal.ToString(StringBuilder sb)
276 sb.Append(m_Item1);
277 sb.Append(", ");
278 sb.Append(m_Item2);
279 sb.Append(')');
280 return sb.ToString();
283 /// <summary>
284 /// The number of positions in this data structure.
285 /// </summary>
286 int ITuple.Length => 2;
288 /// <summary>
289 /// Get the element at position <param name="index"/>.
290 /// </summary>
291 object? ITuple.this[int index] =>
292 index switch
294 0 => Item1,
295 1 => Item2,
296 _ => throw new IndexOutOfRangeException(),
300 [Serializable]
301 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
302 public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
304 private readonly T1 m_Item1; // Do not rename (binary serialization)
305 private readonly T2 m_Item2; // Do not rename (binary serialization)
306 private readonly T3 m_Item3; // Do not rename (binary serialization)
308 public T1 Item1 => m_Item1;
309 public T2 Item2 => m_Item2;
310 public T3 Item3 => m_Item3;
312 public Tuple(T1 item1, T2 item2, T3 item3)
314 m_Item1 = item1;
315 m_Item2 = item2;
316 m_Item3 = item3;
319 public override bool Equals(object? obj)
321 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
324 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
326 if (other == null) return false;
328 if (!(other is Tuple<T1, T2, T3> objTuple))
330 return false;
333 return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3);
336 int IComparable.CompareTo(object? obj)
338 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
341 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
343 if (other == null) return 1;
345 if (!(other is Tuple<T1, T2, T3> objTuple))
347 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
350 int c = comparer.Compare(m_Item1, objTuple.m_Item1);
352 if (c != 0) return c;
354 c = comparer.Compare(m_Item2, objTuple.m_Item2);
356 if (c != 0) return c;
358 return comparer.Compare(m_Item3, objTuple.m_Item3);
361 public override int GetHashCode()
363 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
366 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
368 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!));
371 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
373 return ((IStructuralEquatable)this).GetHashCode(comparer);
375 public override string ToString()
377 StringBuilder sb = new StringBuilder();
378 sb.Append('(');
379 return ((ITupleInternal)this).ToString(sb);
382 string ITupleInternal.ToString(StringBuilder sb)
384 sb.Append(m_Item1);
385 sb.Append(", ");
386 sb.Append(m_Item2);
387 sb.Append(", ");
388 sb.Append(m_Item3);
389 sb.Append(')');
390 return sb.ToString();
393 /// <summary>
394 /// The number of positions in this data structure.
395 /// </summary>
396 int ITuple.Length => 3;
398 /// <summary>
399 /// Get the element at position <param name="index"/>.
400 /// </summary>
401 object? ITuple.this[int index] =>
402 index switch
404 0 => Item1,
405 1 => Item2,
406 2 => Item3,
407 _ => throw new IndexOutOfRangeException(),
411 [Serializable]
412 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
413 public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
415 private readonly T1 m_Item1; // Do not rename (binary serialization)
416 private readonly T2 m_Item2; // Do not rename (binary serialization)
417 private readonly T3 m_Item3; // Do not rename (binary serialization)
418 private readonly T4 m_Item4; // Do not rename (binary serialization)
420 public T1 Item1 => m_Item1;
421 public T2 Item2 => m_Item2;
422 public T3 Item3 => m_Item3;
423 public T4 Item4 => m_Item4;
425 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4)
427 m_Item1 = item1;
428 m_Item2 = item2;
429 m_Item3 = item3;
430 m_Item4 = item4;
433 public override bool Equals(object? obj)
435 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
438 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
440 if (other == null) return false;
442 if (!(other is Tuple<T1, T2, T3, T4> objTuple))
444 return false;
447 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);
450 int IComparable.CompareTo(object? obj)
452 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
455 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
457 if (other == null) return 1;
459 if (!(other is Tuple<T1, T2, T3, T4> objTuple))
461 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
464 int c = comparer.Compare(m_Item1, objTuple.m_Item1);
466 if (c != 0) return c;
468 c = comparer.Compare(m_Item2, objTuple.m_Item2);
470 if (c != 0) return c;
472 c = comparer.Compare(m_Item3, objTuple.m_Item3);
474 if (c != 0) return c;
476 return comparer.Compare(m_Item4, objTuple.m_Item4);
479 public override int GetHashCode()
481 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
484 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
486 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!));
489 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
491 return ((IStructuralEquatable)this).GetHashCode(comparer);
493 public override string ToString()
495 StringBuilder sb = new StringBuilder();
496 sb.Append('(');
497 return ((ITupleInternal)this).ToString(sb);
500 string ITupleInternal.ToString(StringBuilder sb)
502 sb.Append(m_Item1);
503 sb.Append(", ");
504 sb.Append(m_Item2);
505 sb.Append(", ");
506 sb.Append(m_Item3);
507 sb.Append(", ");
508 sb.Append(m_Item4);
509 sb.Append(')');
510 return sb.ToString();
513 /// <summary>
514 /// The number of positions in this data structure.
515 /// </summary>
516 int ITuple.Length => 4;
518 /// <summary>
519 /// Get the element at position <param name="index"/>.
520 /// </summary>
521 object? ITuple.this[int index] =>
522 index switch
524 0 => Item1,
525 1 => Item2,
526 2 => Item3,
527 3 => Item4,
528 _ => throw new IndexOutOfRangeException(),
532 [Serializable]
533 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
534 public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
536 private readonly T1 m_Item1; // Do not rename (binary serialization)
537 private readonly T2 m_Item2; // Do not rename (binary serialization)
538 private readonly T3 m_Item3; // Do not rename (binary serialization)
539 private readonly T4 m_Item4; // Do not rename (binary serialization)
540 private readonly T5 m_Item5; // Do not rename (binary serialization)
542 public T1 Item1 => m_Item1;
543 public T2 Item2 => m_Item2;
544 public T3 Item3 => m_Item3;
545 public T4 Item4 => m_Item4;
546 public T5 Item5 => m_Item5;
548 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
550 m_Item1 = item1;
551 m_Item2 = item2;
552 m_Item3 = item3;
553 m_Item4 = item4;
554 m_Item5 = item5;
557 public override bool Equals(object? obj)
559 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
562 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
564 if (other == null) return false;
566 if (!(other is Tuple<T1, T2, T3, T4, T5> objTuple))
568 return false;
571 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);
574 int IComparable.CompareTo(object? obj)
576 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
579 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
581 if (other == null) return 1;
583 if (!(other is Tuple<T1, T2, T3, T4, T5> objTuple))
585 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
588 int c = comparer.Compare(m_Item1, objTuple.m_Item1);
590 if (c != 0) return c;
592 c = comparer.Compare(m_Item2, objTuple.m_Item2);
594 if (c != 0) return c;
596 c = comparer.Compare(m_Item3, objTuple.m_Item3);
598 if (c != 0) return c;
600 c = comparer.Compare(m_Item4, objTuple.m_Item4);
602 if (c != 0) return c;
604 return comparer.Compare(m_Item5, objTuple.m_Item5);
607 public override int GetHashCode()
609 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
612 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
614 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1!), comparer.GetHashCode(m_Item2!), comparer.GetHashCode(m_Item3!), comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!));
617 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
619 return ((IStructuralEquatable)this).GetHashCode(comparer);
621 public override string ToString()
623 StringBuilder sb = new StringBuilder();
624 sb.Append('(');
625 return ((ITupleInternal)this).ToString(sb);
628 string ITupleInternal.ToString(StringBuilder sb)
630 sb.Append(m_Item1);
631 sb.Append(", ");
632 sb.Append(m_Item2);
633 sb.Append(", ");
634 sb.Append(m_Item3);
635 sb.Append(", ");
636 sb.Append(m_Item4);
637 sb.Append(", ");
638 sb.Append(m_Item5);
639 sb.Append(')');
640 return sb.ToString();
643 /// <summary>
644 /// The number of positions in this data structure.
645 /// </summary>
646 int ITuple.Length => 5;
648 /// <summary>
649 /// Get the element at position <param name="index"/>.
650 /// </summary>
651 object? ITuple.this[int index] =>
652 index switch
654 0 => Item1,
655 1 => Item2,
656 2 => Item3,
657 3 => Item4,
658 4 => Item5,
659 _ => throw new IndexOutOfRangeException(),
663 [Serializable]
664 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
665 public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
667 private readonly T1 m_Item1; // Do not rename (binary serialization)
668 private readonly T2 m_Item2; // Do not rename (binary serialization)
669 private readonly T3 m_Item3; // Do not rename (binary serialization)
670 private readonly T4 m_Item4; // Do not rename (binary serialization)
671 private readonly T5 m_Item5; // Do not rename (binary serialization)
672 private readonly T6 m_Item6; // Do not rename (binary serialization)
674 public T1 Item1 => m_Item1;
675 public T2 Item2 => m_Item2;
676 public T3 Item3 => m_Item3;
677 public T4 Item4 => m_Item4;
678 public T5 Item5 => m_Item5;
679 public T6 Item6 => m_Item6;
681 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
683 m_Item1 = item1;
684 m_Item2 = item2;
685 m_Item3 = item3;
686 m_Item4 = item4;
687 m_Item5 = item5;
688 m_Item6 = item6;
691 public override bool Equals(object? obj)
693 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
696 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
698 if (other == null) return false;
700 if (!(other is Tuple<T1, T2, T3, T4, T5, T6> objTuple))
702 return false;
705 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);
708 int IComparable.CompareTo(object? obj)
710 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
713 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
715 if (other == null) return 1;
717 if (!(other is Tuple<T1, T2, T3, T4, T5, T6> objTuple))
719 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
722 int c = comparer.Compare(m_Item1, objTuple.m_Item1);
724 if (c != 0) return c;
726 c = comparer.Compare(m_Item2, objTuple.m_Item2);
728 if (c != 0) return c;
730 c = comparer.Compare(m_Item3, objTuple.m_Item3);
732 if (c != 0) return c;
734 c = comparer.Compare(m_Item4, objTuple.m_Item4);
736 if (c != 0) return c;
738 c = comparer.Compare(m_Item5, objTuple.m_Item5);
740 if (c != 0) return c;
742 return comparer.Compare(m_Item6, objTuple.m_Item6);
745 public override int GetHashCode()
747 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
750 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
752 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!));
755 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
757 return ((IStructuralEquatable)this).GetHashCode(comparer);
759 public override string ToString()
761 StringBuilder sb = new StringBuilder();
762 sb.Append('(');
763 return ((ITupleInternal)this).ToString(sb);
766 string ITupleInternal.ToString(StringBuilder sb)
768 sb.Append(m_Item1);
769 sb.Append(", ");
770 sb.Append(m_Item2);
771 sb.Append(", ");
772 sb.Append(m_Item3);
773 sb.Append(", ");
774 sb.Append(m_Item4);
775 sb.Append(", ");
776 sb.Append(m_Item5);
777 sb.Append(", ");
778 sb.Append(m_Item6);
779 sb.Append(')');
780 return sb.ToString();
783 /// <summary>
784 /// The number of positions in this data structure.
785 /// </summary>
786 int ITuple.Length => 6;
788 /// <summary>
789 /// Get the element at position <param name="index"/>.
790 /// </summary>
791 object? ITuple.this[int index] =>
792 index switch
794 0 => Item1,
795 1 => Item2,
796 2 => Item3,
797 3 => Item4,
798 4 => Item5,
799 5 => Item6,
800 _ => throw new IndexOutOfRangeException(),
804 [Serializable]
805 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
806 public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
808 private readonly T1 m_Item1; // Do not rename (binary serialization)
809 private readonly T2 m_Item2; // Do not rename (binary serialization)
810 private readonly T3 m_Item3; // Do not rename (binary serialization)
811 private readonly T4 m_Item4; // Do not rename (binary serialization)
812 private readonly T5 m_Item5; // Do not rename (binary serialization)
813 private readonly T6 m_Item6; // Do not rename (binary serialization)
814 private readonly T7 m_Item7; // Do not rename (binary serialization)
816 public T1 Item1 => m_Item1;
817 public T2 Item2 => m_Item2;
818 public T3 Item3 => m_Item3;
819 public T4 Item4 => m_Item4;
820 public T5 Item5 => m_Item5;
821 public T6 Item6 => m_Item6;
822 public T7 Item7 => m_Item7;
824 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
826 m_Item1 = item1;
827 m_Item2 = item2;
828 m_Item3 = item3;
829 m_Item4 = item4;
830 m_Item5 = item5;
831 m_Item6 = item6;
832 m_Item7 = item7;
835 public override bool Equals(object? obj)
837 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
840 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
842 if (other == null) return false;
844 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple))
846 return false;
849 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);
852 int IComparable.CompareTo(object? obj)
854 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
857 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
859 if (other == null) return 1;
861 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple))
863 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
866 int c = comparer.Compare(m_Item1, objTuple.m_Item1);
868 if (c != 0) return c;
870 c = comparer.Compare(m_Item2, objTuple.m_Item2);
872 if (c != 0) return c;
874 c = comparer.Compare(m_Item3, objTuple.m_Item3);
876 if (c != 0) return c;
878 c = comparer.Compare(m_Item4, objTuple.m_Item4);
880 if (c != 0) return c;
882 c = comparer.Compare(m_Item5, objTuple.m_Item5);
884 if (c != 0) return c;
886 c = comparer.Compare(m_Item6, objTuple.m_Item6);
888 if (c != 0) return c;
890 return comparer.Compare(m_Item7, objTuple.m_Item7);
893 public override int GetHashCode()
895 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
898 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
900 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!));
903 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
905 return ((IStructuralEquatable)this).GetHashCode(comparer);
907 public override string ToString()
909 StringBuilder sb = new StringBuilder();
910 sb.Append('(');
911 return ((ITupleInternal)this).ToString(sb);
914 string ITupleInternal.ToString(StringBuilder sb)
916 sb.Append(m_Item1);
917 sb.Append(", ");
918 sb.Append(m_Item2);
919 sb.Append(", ");
920 sb.Append(m_Item3);
921 sb.Append(", ");
922 sb.Append(m_Item4);
923 sb.Append(", ");
924 sb.Append(m_Item5);
925 sb.Append(", ");
926 sb.Append(m_Item6);
927 sb.Append(", ");
928 sb.Append(m_Item7);
929 sb.Append(')');
930 return sb.ToString();
933 /// <summary>
934 /// The number of positions in this data structure.
935 /// </summary>
936 int ITuple.Length => 7;
938 /// <summary>
939 /// Get the element at position <param name="index"/>.
940 /// </summary>
941 object? ITuple.this[int index] =>
942 index switch
944 0 => Item1,
945 1 => Item2,
946 2 => Item3,
947 3 => Item4,
948 4 => Item5,
949 5 => Item6,
950 6 => Item7,
951 _ => throw new IndexOutOfRangeException(),
955 [Serializable]
956 [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
957 public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple where TRest : notnull
959 private readonly T1 m_Item1; // Do not rename (binary serialization)
960 private readonly T2 m_Item2; // Do not rename (binary serialization)
961 private readonly T3 m_Item3; // Do not rename (binary serialization)
962 private readonly T4 m_Item4; // Do not rename (binary serialization)
963 private readonly T5 m_Item5; // Do not rename (binary serialization)
964 private readonly T6 m_Item6; // Do not rename (binary serialization)
965 private readonly T7 m_Item7; // Do not rename (binary serialization)
966 private readonly TRest m_Rest; // Do not rename (binary serialization)
968 public T1 Item1 => m_Item1;
969 public T2 Item2 => m_Item2;
970 public T3 Item3 => m_Item3;
971 public T4 Item4 => m_Item4;
972 public T5 Item5 => m_Item5;
973 public T6 Item6 => m_Item6;
974 public T7 Item7 => m_Item7;
975 public TRest Rest => m_Rest;
977 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest)
979 if (!(rest is ITupleInternal))
981 throw new ArgumentException(SR.ArgumentException_TupleLastArgumentNotATuple);
984 m_Item1 = item1;
985 m_Item2 = item2;
986 m_Item3 = item3;
987 m_Item4 = item4;
988 m_Item5 = item5;
989 m_Item6 = item6;
990 m_Item7 = item7;
991 m_Rest = rest;
994 public override bool Equals(object? obj)
996 return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
999 bool IStructuralEquatable.Equals(object? other, IEqualityComparer comparer)
1001 if (other == null) return false;
1003 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple))
1005 return false;
1008 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);
1011 int IComparable.CompareTo(object? obj)
1013 return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
1016 int IStructuralComparable.CompareTo(object? other, IComparer comparer)
1018 if (other == null) return 1;
1020 if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple))
1022 throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, GetType()), nameof(other));
1025 int c = comparer.Compare(m_Item1, objTuple.m_Item1);
1027 if (c != 0) return c;
1029 c = comparer.Compare(m_Item2, objTuple.m_Item2);
1031 if (c != 0) return c;
1033 c = comparer.Compare(m_Item3, objTuple.m_Item3);
1035 if (c != 0) return c;
1037 c = comparer.Compare(m_Item4, objTuple.m_Item4);
1039 if (c != 0) return c;
1041 c = comparer.Compare(m_Item5, objTuple.m_Item5);
1043 if (c != 0) return c;
1045 c = comparer.Compare(m_Item6, objTuple.m_Item6);
1047 if (c != 0) return c;
1049 c = comparer.Compare(m_Item7, objTuple.m_Item7);
1051 if (c != 0) return c;
1053 return comparer.Compare(m_Rest, objTuple.m_Rest);
1056 public override int GetHashCode()
1058 return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
1061 int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
1063 // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
1064 ITupleInternal t = (ITupleInternal)m_Rest;
1065 if (t.Length >= 8) { return t.GetHashCode(comparer); }
1067 // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
1068 int k = 8 - t.Length;
1069 switch (k)
1071 case 1:
1072 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1073 case 2:
1074 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1075 case 3:
1076 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1077 case 4:
1078 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4!), comparer.GetHashCode(m_Item5!), comparer.GetHashCode(m_Item6!), comparer.GetHashCode(m_Item7!), t.GetHashCode(comparer));
1079 case 5:
1080 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));
1081 case 6:
1082 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));
1083 case 7:
1084 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));
1086 Debug.Fail("Missed all cases for computing Tuple hash code");
1087 return -1;
1090 int ITupleInternal.GetHashCode(IEqualityComparer comparer)
1092 return ((IStructuralEquatable)this).GetHashCode(comparer);
1094 public override string ToString()
1096 StringBuilder sb = new StringBuilder();
1097 sb.Append('(');
1098 return ((ITupleInternal)this).ToString(sb);
1101 string ITupleInternal.ToString(StringBuilder sb)
1103 sb.Append(m_Item1);
1104 sb.Append(", ");
1105 sb.Append(m_Item2);
1106 sb.Append(", ");
1107 sb.Append(m_Item3);
1108 sb.Append(", ");
1109 sb.Append(m_Item4);
1110 sb.Append(", ");
1111 sb.Append(m_Item5);
1112 sb.Append(", ");
1113 sb.Append(m_Item6);
1114 sb.Append(", ");
1115 sb.Append(m_Item7);
1116 sb.Append(", ");
1117 return ((ITupleInternal)m_Rest).ToString(sb);
1120 /// <summary>
1121 /// The number of positions in this data structure.
1122 /// </summary>
1123 int ITuple.Length => 7 + ((ITupleInternal)Rest).Length;
1125 /// <summary>
1126 /// Get the element at position <param name="index"/>.
1127 /// </summary>
1128 object? ITuple.this[int index] =>
1129 index switch
1131 0 => Item1,
1132 1 => Item2,
1133 2 => Item3,
1134 3 => Item4,
1135 4 => Item5,
1136 5 => Item6,
1137 6 => Item7,
1139 _ => ((ITupleInternal)Rest)[index - 7],