1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 using System
.Collections
;
6 using System
.Collections
.Generic
;
7 using System
.Diagnostics
;
8 using System
.Runtime
.CompilerServices
;
12 // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it.
18 /// Helper so we can call some tuple methods recursively without knowing the underlying types.
20 internal interface ITupleInternal
: ITuple
22 string ToString(StringBuilder sb
);
23 int GetHashCode(IEqualityComparer comparer
);
26 public static class Tuple
28 public static Tuple
<T1
> Create
<T1
>(T1 item1
)
30 return new Tuple
<T1
>(item1
);
33 public static Tuple
<T1
, T2
> Create
<T1
, T2
>(T1 item1
, T2 item2
)
35 return new Tuple
<T1
, T2
>(item1
, item2
);
38 public static Tuple
<T1
, T2
, T3
> Create
<T1
, T2
, T3
>(T1 item1
, T2 item2
, T3 item3
)
40 return new Tuple
<T1
, T2
, T3
>(item1
, item2
, item3
);
43 public static Tuple
<T1
, T2
, T3
, T4
> Create
<T1
, T2
, T3
, T4
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
)
45 return new Tuple
<T1
, T2
, T3
, T4
>(item1
, item2
, item3
, item4
);
48 public static Tuple
<T1
, T2
, T3
, T4
, T5
> Create
<T1
, T2
, T3
, T4
, T5
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
)
50 return new Tuple
<T1
, T2
, T3
, T4
, T5
>(item1
, item2
, item3
, item4
, item5
);
53 public static Tuple
<T1
, T2
, T3
, T4
, T5
, T6
> Create
<T1
, T2
, T3
, T4
, T5
, T6
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
)
55 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
>(item1
, item2
, item3
, item4
, item5
, item6
);
58 public static Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
> Create
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
)
60 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
>(item1
, item2
, item3
, item4
, item5
, item6
, item7
);
63 public static Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, Tuple
<T8
>> Create
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, T8
>(T1 item1
, T2 item2
, T3 item3
, T4 item4
, T5 item5
, T6 item6
, T7 item7
, T8 item8
)
65 return new Tuple
<T1
, T2
, T3
, T4
, T5
, T6
, T7
, Tuple
<T8
>>(item1
, item2
, item3
, item4
, item5
, item6
, item7
, new Tuple
<T8
>(item8
));
68 // From System.Web.Util.HashCodeCombiner
69 internal static int CombineHashCodes(int h1
, int h2
)
71 return (((h1
<< 5) + h1
) ^ h2
);
74 internal static int CombineHashCodes(int h1
, int h2
, int h3
)
76 return CombineHashCodes(CombineHashCodes(h1
, h2
), h3
);
79 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
)
81 return CombineHashCodes(CombineHashCodes(h1
, h2
), CombineHashCodes(h3
, h4
));
84 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
)
86 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), h5
);
89 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
)
91 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
));
94 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
)
96 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
));
99 internal static int CombineHashCodes(int h1
, int h2
, int h3
, int h4
, int h5
, int h6
, int h7
, int h8
)
101 return CombineHashCodes(CombineHashCodes(h1
, h2
, h3
, h4
), CombineHashCodes(h5
, h6
, h7
, h8
));
106 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
107 public class Tuple
<T1
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
109 private readonly T1 m_Item1
; // Do not rename (binary serialization)
111 public T1 Item1
=> m_Item1
;
113 public Tuple(T1 item1
)
118 public override bool Equals(object? obj
)
120 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
);
123 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
125 if (other
== null) return false;
127 if (!(other
is Tuple
<T1
> objTuple
))
132 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
);
135 int IComparable
.CompareTo(object? obj
)
137 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
140 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
142 if (other
== null) return 1;
144 if (!(other
is Tuple
<T1
> objTuple
))
146 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
149 return comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
152 public override int GetHashCode()
154 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
157 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
159 return comparer
.GetHashCode(m_Item1
!);
162 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
164 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
166 public override string ToString()
168 StringBuilder sb
= new StringBuilder();
170 return ((ITupleInternal
)this).ToString(sb
);
173 string ITupleInternal
.ToString(StringBuilder sb
)
177 return sb
.ToString();
181 /// The number of positions in this data structure.
183 int ITuple
.Length
=> 1;
186 /// Get the element at position <param name="index"/>.
188 object? ITuple
.this[int index
]
194 throw new IndexOutOfRangeException();
202 [System
.Runtime
.CompilerServices
.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
203 public class Tuple
<T1
, T2
> : IStructuralEquatable
, IStructuralComparable
, IComparable
, ITupleInternal
, ITuple
205 private readonly T1 m_Item1
; // Do not rename (binary serialization)
206 private readonly T2 m_Item2
; // Do not rename (binary serialization)
208 public T1 Item1
=> m_Item1
;
209 public T2 Item2
=> m_Item2
;
211 public Tuple(T1 item1
, T2 item2
)
217 public override bool Equals(object? obj
)
219 return ((IStructuralEquatable
)this).Equals(obj
, EqualityComparer
<object>.Default
); ;
222 bool IStructuralEquatable
.Equals(object? other
, IEqualityComparer comparer
)
224 if (other
== null) return false;
226 if (!(other
is Tuple
<T1
, T2
> objTuple
))
231 return comparer
.Equals(m_Item1
, objTuple
.m_Item1
) && comparer
.Equals(m_Item2
, objTuple
.m_Item2
);
234 int IComparable
.CompareTo(object? obj
)
236 return ((IStructuralComparable
)this).CompareTo(obj
, Comparer
<object>.Default
);
239 int IStructuralComparable
.CompareTo(object? other
, IComparer comparer
)
241 if (other
== null) return 1;
243 if (!(other
is Tuple
<T1
, T2
> objTuple
))
245 throw new ArgumentException(SR
.Format(SR
.ArgumentException_TupleIncorrectType
, GetType()), nameof(other
));
250 c
= comparer
.Compare(m_Item1
, objTuple
.m_Item1
);
252 if (c
!= 0) return c
;
254 return comparer
.Compare(m_Item2
, objTuple
.m_Item2
);
257 public override int GetHashCode()
259 return ((IStructuralEquatable
)this).GetHashCode(EqualityComparer
<object>.Default
);
262 int IStructuralEquatable
.GetHashCode(IEqualityComparer comparer
)
264 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item1
!), comparer
.GetHashCode(m_Item2
!));
267 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
269 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
271 public override string ToString()
273 StringBuilder sb
= new StringBuilder();
275 return ((ITupleInternal
)this).ToString(sb
);
278 string ITupleInternal
.ToString(StringBuilder sb
)
284 return sb
.ToString();
288 /// The number of positions in this data structure.
290 int ITuple
.Length
=> 2;
293 /// Get the element at position <param name="index"/>.
295 object? ITuple
.this[int index
]
303 _
=> throw new IndexOutOfRangeException(),
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
)
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
))
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
));
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();
390 return ((ITupleInternal
)this).ToString(sb
);
393 string ITupleInternal
.ToString(StringBuilder sb
)
401 return sb
.ToString();
405 /// The number of positions in this data structure.
407 int ITuple
.Length
=> 3;
410 /// Get the element at position <param name="index"/>.
412 object? ITuple
.this[int index
]
421 _
=> throw new IndexOutOfRangeException(),
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
)
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
))
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
));
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();
515 return ((ITupleInternal
)this).ToString(sb
);
518 string ITupleInternal
.ToString(StringBuilder sb
)
528 return sb
.ToString();
532 /// The number of positions in this data structure.
534 int ITuple
.Length
=> 4;
537 /// Get the element at position <param name="index"/>.
539 object? ITuple
.this[int index
]
549 _
=> throw new IndexOutOfRangeException(),
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
)
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
))
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
));
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();
650 return ((ITupleInternal
)this).ToString(sb
);
653 string ITupleInternal
.ToString(StringBuilder sb
)
665 return sb
.ToString();
669 /// The number of positions in this data structure.
671 int ITuple
.Length
=> 5;
674 /// Get the element at position <param name="index"/>.
676 object? ITuple
.this[int index
]
687 _
=> throw new IndexOutOfRangeException(),
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
)
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
))
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
));
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();
795 return ((ITupleInternal
)this).ToString(sb
);
798 string ITupleInternal
.ToString(StringBuilder sb
)
812 return sb
.ToString();
816 /// The number of positions in this data structure.
818 int ITuple
.Length
=> 6;
821 /// Get the element at position <param name="index"/>.
823 object? ITuple
.this[int index
]
835 _
=> throw new IndexOutOfRangeException(),
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
)
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
))
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
));
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();
950 return ((ITupleInternal
)this).ToString(sb
);
953 string ITupleInternal
.ToString(StringBuilder sb
)
969 return sb
.ToString();
973 /// The number of positions in this data structure.
975 int ITuple
.Length
=> 7;
978 /// Get the element at position <param name="index"/>.
980 object? ITuple
.this[int index
]
993 _
=> throw new IndexOutOfRangeException(),
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
);
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
))
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
));
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
;
1118 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1120 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1122 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
1124 return Tuple
.CombineHashCodes(comparer
.GetHashCode(m_Item4
!), comparer
.GetHashCode(m_Item5
!), comparer
.GetHashCode(m_Item6
!), comparer
.GetHashCode(m_Item7
!), t
.GetHashCode(comparer
));
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
));
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
));
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");
1136 int ITupleInternal
.GetHashCode(IEqualityComparer comparer
)
1138 return ((IStructuralEquatable
)this).GetHashCode(comparer
);
1140 public override string ToString()
1142 StringBuilder sb
= new StringBuilder();
1144 return ((ITupleInternal
)this).ToString(sb
);
1147 string ITupleInternal
.ToString(StringBuilder sb
)
1163 return ((ITupleInternal
)m_Rest
).ToString(sb
);
1167 /// The number of positions in this data structure.
1169 int ITuple
.Length
=> 7 + ((ITupleInternal
)Rest
).Length
;
1172 /// Get the element at position <param name="index"/>.
1174 object? ITuple
.this[int index
]
1188 _
=> ((ITupleInternal
)Rest
)[index
- 7],