[bcl] Updates referencesource to 4.7.1
[mono-project.git] / mcs / class / referencesource / mscorlib / system / tuple.cs
blobb42f1107907617efaabd57e6b8489e9f710ea458
1 using System;
2 using System.Text;
3 using System.Collections;
4 using System.Collections.Generic;
5 using System.Diagnostics.Contracts;
6 using System.Runtime.CompilerServices;
8 namespace System {
10 /// <summary>
11 /// Helper so we can call some tuple methods recursively without knowing the underlying types.
12 /// </summary>
13 internal interface ITupleInternal : ITuple {
14 string ToString(StringBuilder sb);
15 int GetHashCode(IEqualityComparer comparer);
18 public static class Tuple {
19 public static Tuple<T1> Create<T1>(T1 item1) {
20 return new Tuple<T1>(item1);
23 public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2) {
24 return new Tuple<T1, T2>(item1, item2);
27 public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3) {
28 return new Tuple<T1, T2, T3>(item1, item2, item3);
31 public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4) {
32 return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);
35 public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) {
36 return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
39 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) {
40 return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
43 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) {
44 return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
47 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) {
48 return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
51 // From System.Web.Util.HashCodeCombiner
52 internal static int CombineHashCodes(int h1, int h2)
54 return (((h1 << 5) + h1) ^ h2);
57 internal static int CombineHashCodes(int h1, int h2, int h3) {
58 return CombineHashCodes(CombineHashCodes(h1, h2), h3);
61 internal static int CombineHashCodes(int h1, int h2, int h3, int h4) {
62 return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4));
65 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5) {
66 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), h5);
69 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6) {
70 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6));
73 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7) {
74 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7));
77 internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8) {
78 return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8));
82 [Serializable]
83 public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
85 private readonly T1 m_Item1;
87 public T1 Item1 { get { return m_Item1; } }
89 public Tuple(T1 item1) {
90 m_Item1 = item1;
93 public override Boolean Equals(Object obj) {
94 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);
97 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
98 if (other == null) return false;
100 Tuple<T1> objTuple = other as Tuple<T1>;
102 if (objTuple == null) {
103 return false;
106 return comparer.Equals(m_Item1, objTuple.m_Item1);
109 Int32 IComparable.CompareTo(Object obj) {
110 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
113 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
114 if (other == null) return 1;
116 Tuple<T1> objTuple = other as Tuple<T1>;
118 if (objTuple == null) {
119 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
122 return comparer.Compare(m_Item1, objTuple.m_Item1);
125 public override int GetHashCode() {
126 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
129 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
130 return comparer.GetHashCode(m_Item1);
133 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
134 return ((IStructuralEquatable) this).GetHashCode(comparer);
136 public override string ToString() {
137 StringBuilder sb = new StringBuilder();
138 sb.Append("(");
139 return ((ITupleInternal)this).ToString(sb);
142 string ITupleInternal.ToString(StringBuilder sb) {
143 sb.Append(m_Item1);
144 sb.Append(")");
145 return sb.ToString();
148 /// <summary>
149 /// The number of positions in this data structure.
150 /// </summary>
151 int ITuple.Length => 1;
153 /// <summary>
154 /// Get the element at position <param name="index"/>.
155 /// </summary>
156 object ITuple.this[int index]
160 if (index != 0)
162 throw new IndexOutOfRangeException();
164 return Item1;
169 [Serializable]
170 public class Tuple<T1, T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
172 private readonly T1 m_Item1;
173 private readonly T2 m_Item2;
175 public T1 Item1 { get { return m_Item1; } }
176 public T2 Item2 { get { return m_Item2; } }
178 public Tuple(T1 item1, T2 item2) {
179 m_Item1 = item1;
180 m_Item2 = item2;
183 public override Boolean Equals(Object obj) {
184 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
187 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
188 if (other == null) return false;
190 Tuple<T1, T2> objTuple = other as Tuple<T1, T2>;
192 if (objTuple == null) {
193 return false;
196 return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2);
199 Int32 IComparable.CompareTo(Object obj) {
200 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
203 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
204 if (other == null) return 1;
206 Tuple<T1, T2> objTuple = other as Tuple<T1, T2>;
208 if (objTuple == null) {
209 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
212 int c = 0;
214 c = comparer.Compare(m_Item1, objTuple.m_Item1);
216 if (c != 0) return c;
218 return comparer.Compare(m_Item2, objTuple.m_Item2);
221 public override int GetHashCode() {
222 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
225 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
226 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2));
229 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
230 return ((IStructuralEquatable) this).GetHashCode(comparer);
232 public override string ToString() {
233 StringBuilder sb = new StringBuilder();
234 sb.Append("(");
235 return ((ITupleInternal)this).ToString(sb);
238 string ITupleInternal.ToString(StringBuilder sb) {
239 sb.Append(m_Item1);
240 sb.Append(", ");
241 sb.Append(m_Item2);
242 sb.Append(")");
243 return sb.ToString();
246 /// <summary>
247 /// The number of positions in this data structure.
248 /// </summary>
249 int ITuple.Length => 2;
251 /// <summary>
252 /// Get the element at position <param name="index"/>.
253 /// </summary>
254 object ITuple.this[int index]
258 switch (index)
260 case 0:
261 return Item1;
262 case 1:
263 return Item2;
264 default:
265 throw new IndexOutOfRangeException();
271 [Serializable]
272 public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
274 private readonly T1 m_Item1;
275 private readonly T2 m_Item2;
276 private readonly T3 m_Item3;
278 public T1 Item1 { get { return m_Item1; } }
279 public T2 Item2 { get { return m_Item2; } }
280 public T3 Item3 { get { return m_Item3; } }
282 public Tuple(T1 item1, T2 item2, T3 item3) {
283 m_Item1 = item1;
284 m_Item2 = item2;
285 m_Item3 = item3;
288 public override Boolean Equals(Object obj) {
289 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
292 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
293 if (other == null) return false;
295 Tuple<T1, T2, T3> objTuple = other as Tuple<T1, T2, T3>;
297 if (objTuple == null) {
298 return false;
301 return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3);
304 Int32 IComparable.CompareTo(Object obj) {
305 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
308 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
309 if (other == null) return 1;
311 Tuple<T1, T2, T3> objTuple = other as Tuple<T1, T2, T3>;
313 if (objTuple == null) {
314 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
317 int c = 0;
319 c = comparer.Compare(m_Item1, objTuple.m_Item1);
321 if (c != 0) return c;
323 c = comparer.Compare(m_Item2, objTuple.m_Item2);
325 if (c != 0) return c;
327 return comparer.Compare(m_Item3, objTuple.m_Item3);
330 public override int GetHashCode() {
331 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
334 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
335 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3));
338 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
339 return ((IStructuralEquatable) this).GetHashCode(comparer);
341 public override string ToString() {
342 StringBuilder sb = new StringBuilder();
343 sb.Append("(");
344 return ((ITupleInternal)this).ToString(sb);
347 string ITupleInternal.ToString(StringBuilder sb) {
348 sb.Append(m_Item1);
349 sb.Append(", ");
350 sb.Append(m_Item2);
351 sb.Append(", ");
352 sb.Append(m_Item3);
353 sb.Append(")");
354 return sb.ToString();
357 /// <summary>
358 /// The number of positions in this data structure.
359 /// </summary>
360 int ITuple.Length => 3;
362 /// <summary>
363 /// Get the element at position <param name="index"/>.
364 /// </summary>
365 object ITuple.this[int index]
369 switch (index)
371 case 0:
372 return Item1;
373 case 1:
374 return Item2;
375 case 2:
376 return Item3;
377 default:
378 throw new IndexOutOfRangeException();
384 [Serializable]
385 public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
387 private readonly T1 m_Item1;
388 private readonly T2 m_Item2;
389 private readonly T3 m_Item3;
390 private readonly T4 m_Item4;
392 public T1 Item1 { get { return m_Item1; } }
393 public T2 Item2 { get { return m_Item2; } }
394 public T3 Item3 { get { return m_Item3; } }
395 public T4 Item4 { get { return m_Item4; } }
397 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4) {
398 m_Item1 = item1;
399 m_Item2 = item2;
400 m_Item3 = item3;
401 m_Item4 = item4;
404 public override Boolean Equals(Object obj) {
405 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
408 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
409 if (other == null) return false;
411 Tuple<T1, T2, T3, T4> objTuple = other as Tuple<T1, T2, T3, T4>;
413 if (objTuple == null) {
414 return false;
417 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);
420 Int32 IComparable.CompareTo(Object obj) {
421 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
424 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
425 if (other == null) return 1;
427 Tuple<T1, T2, T3, T4> objTuple = other as Tuple<T1, T2, T3, T4>;
429 if (objTuple == null) {
430 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
433 int c = 0;
435 c = comparer.Compare(m_Item1, objTuple.m_Item1);
437 if (c != 0) return c;
439 c = comparer.Compare(m_Item2, objTuple.m_Item2);
441 if (c != 0) return c;
443 c = comparer.Compare(m_Item3, objTuple.m_Item3);
445 if (c != 0) return c;
447 return comparer.Compare(m_Item4, objTuple.m_Item4);
450 public override int GetHashCode() {
451 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
454 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
455 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4));
458 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
459 return ((IStructuralEquatable) this).GetHashCode(comparer);
461 public override string ToString() {
462 StringBuilder sb = new StringBuilder();
463 sb.Append("(");
464 return ((ITupleInternal)this).ToString(sb);
467 string ITupleInternal.ToString(StringBuilder sb) {
468 sb.Append(m_Item1);
469 sb.Append(", ");
470 sb.Append(m_Item2);
471 sb.Append(", ");
472 sb.Append(m_Item3);
473 sb.Append(", ");
474 sb.Append(m_Item4);
475 sb.Append(")");
476 return sb.ToString();
479 /// <summary>
480 /// The number of positions in this data structure.
481 /// </summary>
482 int ITuple.Length => 4;
484 /// <summary>
485 /// Get the element at position <param name="index"/>.
486 /// </summary>
487 object ITuple.this[int index]
491 switch (index)
493 case 0:
494 return Item1;
495 case 1:
496 return Item2;
497 case 2:
498 return Item3;
499 case 3:
500 return Item4;
501 default:
502 throw new IndexOutOfRangeException();
508 [Serializable]
509 public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
511 private readonly T1 m_Item1;
512 private readonly T2 m_Item2;
513 private readonly T3 m_Item3;
514 private readonly T4 m_Item4;
515 private readonly T5 m_Item5;
517 public T1 Item1 { get { return m_Item1; } }
518 public T2 Item2 { get { return m_Item2; } }
519 public T3 Item3 { get { return m_Item3; } }
520 public T4 Item4 { get { return m_Item4; } }
521 public T5 Item5 { get { return m_Item5; } }
523 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5) {
524 m_Item1 = item1;
525 m_Item2 = item2;
526 m_Item3 = item3;
527 m_Item4 = item4;
528 m_Item5 = item5;
531 public override Boolean Equals(Object obj) {
532 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
535 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
536 if (other == null) return false;
538 Tuple<T1, T2, T3, T4, T5> objTuple = other as Tuple<T1, T2, T3, T4, T5>;
540 if (objTuple == null) {
541 return false;
544 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);
547 Int32 IComparable.CompareTo(Object obj) {
548 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
551 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
552 if (other == null) return 1;
554 Tuple<T1, T2, T3, T4, T5> objTuple = other as Tuple<T1, T2, T3, T4, T5>;
556 if (objTuple == null) {
557 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
560 int c = 0;
562 c = comparer.Compare(m_Item1, objTuple.m_Item1);
564 if (c != 0) return c;
566 c = comparer.Compare(m_Item2, objTuple.m_Item2);
568 if (c != 0) return c;
570 c = comparer.Compare(m_Item3, objTuple.m_Item3);
572 if (c != 0) return c;
574 c = comparer.Compare(m_Item4, objTuple.m_Item4);
576 if (c != 0) return c;
578 return comparer.Compare(m_Item5, objTuple.m_Item5);
581 public override int GetHashCode() {
582 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
585 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
586 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5));
589 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
590 return ((IStructuralEquatable) this).GetHashCode(comparer);
592 public override string ToString() {
593 StringBuilder sb = new StringBuilder();
594 sb.Append("(");
595 return ((ITupleInternal)this).ToString(sb);
598 string ITupleInternal.ToString(StringBuilder sb) {
599 sb.Append(m_Item1);
600 sb.Append(", ");
601 sb.Append(m_Item2);
602 sb.Append(", ");
603 sb.Append(m_Item3);
604 sb.Append(", ");
605 sb.Append(m_Item4);
606 sb.Append(", ");
607 sb.Append(m_Item5);
608 sb.Append(")");
609 return sb.ToString();
612 /// <summary>
613 /// The number of positions in this data structure.
614 /// </summary>
615 int ITuple.Length => 5;
617 /// <summary>
618 /// Get the element at position <param name="index"/>.
619 /// </summary>
620 object ITuple.this[int index]
624 switch (index)
626 case 0:
627 return Item1;
628 case 1:
629 return Item2;
630 case 2:
631 return Item3;
632 case 3:
633 return Item4;
634 case 4:
635 return Item5;
636 default:
637 throw new IndexOutOfRangeException();
643 [Serializable]
644 public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
646 private readonly T1 m_Item1;
647 private readonly T2 m_Item2;
648 private readonly T3 m_Item3;
649 private readonly T4 m_Item4;
650 private readonly T5 m_Item5;
651 private readonly T6 m_Item6;
653 public T1 Item1 { get { return m_Item1; } }
654 public T2 Item2 { get { return m_Item2; } }
655 public T3 Item3 { get { return m_Item3; } }
656 public T4 Item4 { get { return m_Item4; } }
657 public T5 Item5 { get { return m_Item5; } }
658 public T6 Item6 { get { return m_Item6; } }
660 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6) {
661 m_Item1 = item1;
662 m_Item2 = item2;
663 m_Item3 = item3;
664 m_Item4 = item4;
665 m_Item5 = item5;
666 m_Item6 = item6;
669 public override Boolean Equals(Object obj) {
670 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
673 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
674 if (other == null) return false;
676 Tuple<T1, T2, T3, T4, T5, T6> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6>;
678 if (objTuple == null) {
679 return false;
682 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);
685 Int32 IComparable.CompareTo(Object obj) {
686 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
689 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
690 if (other == null) return 1;
692 Tuple<T1, T2, T3, T4, T5, T6> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6>;
694 if (objTuple == null) {
695 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
698 int c = 0;
700 c = comparer.Compare(m_Item1, objTuple.m_Item1);
702 if (c != 0) return c;
704 c = comparer.Compare(m_Item2, objTuple.m_Item2);
706 if (c != 0) return c;
708 c = comparer.Compare(m_Item3, objTuple.m_Item3);
710 if (c != 0) return c;
712 c = comparer.Compare(m_Item4, objTuple.m_Item4);
714 if (c != 0) return c;
716 c = comparer.Compare(m_Item5, objTuple.m_Item5);
718 if (c != 0) return c;
720 return comparer.Compare(m_Item6, objTuple.m_Item6);
723 public override int GetHashCode() {
724 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
727 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
728 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));
731 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
732 return ((IStructuralEquatable) this).GetHashCode(comparer);
734 public override string ToString() {
735 StringBuilder sb = new StringBuilder();
736 sb.Append("(");
737 return ((ITupleInternal)this).ToString(sb);
740 string ITupleInternal.ToString(StringBuilder sb) {
741 sb.Append(m_Item1);
742 sb.Append(", ");
743 sb.Append(m_Item2);
744 sb.Append(", ");
745 sb.Append(m_Item3);
746 sb.Append(", ");
747 sb.Append(m_Item4);
748 sb.Append(", ");
749 sb.Append(m_Item5);
750 sb.Append(", ");
751 sb.Append(m_Item6);
752 sb.Append(")");
753 return sb.ToString();
756 /// <summary>
757 /// The number of positions in this data structure.
758 /// </summary>
759 int ITuple.Length => 6;
761 /// <summary>
762 /// Get the element at position <param name="index"/>.
763 /// </summary>
764 object ITuple.this[int index]
768 switch (index)
770 case 0:
771 return Item1;
772 case 1:
773 return Item2;
774 case 2:
775 return Item3;
776 case 3:
777 return Item4;
778 case 4:
779 return Item5;
780 case 5:
781 return Item6;
782 default:
783 throw new IndexOutOfRangeException();
789 [Serializable]
790 public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
792 private readonly T1 m_Item1;
793 private readonly T2 m_Item2;
794 private readonly T3 m_Item3;
795 private readonly T4 m_Item4;
796 private readonly T5 m_Item5;
797 private readonly T6 m_Item6;
798 private readonly T7 m_Item7;
800 public T1 Item1 { get { return m_Item1; } }
801 public T2 Item2 { get { return m_Item2; } }
802 public T3 Item3 { get { return m_Item3; } }
803 public T4 Item4 { get { return m_Item4; } }
804 public T5 Item5 { get { return m_Item5; } }
805 public T6 Item6 { get { return m_Item6; } }
806 public T7 Item7 { get { return m_Item7; } }
808 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7) {
809 m_Item1 = item1;
810 m_Item2 = item2;
811 m_Item3 = item3;
812 m_Item4 = item4;
813 m_Item5 = item5;
814 m_Item6 = item6;
815 m_Item7 = item7;
818 public override Boolean Equals(Object obj) {
819 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
822 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
823 if (other == null) return false;
825 Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7>;
827 if (objTuple == null) {
828 return false;
831 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);
834 Int32 IComparable.CompareTo(Object obj) {
835 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
838 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
839 if (other == null) return 1;
841 Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7>;
843 if (objTuple == null) {
844 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
847 int c = 0;
849 c = comparer.Compare(m_Item1, objTuple.m_Item1);
851 if (c != 0) return c;
853 c = comparer.Compare(m_Item2, objTuple.m_Item2);
855 if (c != 0) return c;
857 c = comparer.Compare(m_Item3, objTuple.m_Item3);
859 if (c != 0) return c;
861 c = comparer.Compare(m_Item4, objTuple.m_Item4);
863 if (c != 0) return c;
865 c = comparer.Compare(m_Item5, objTuple.m_Item5);
867 if (c != 0) return c;
869 c = comparer.Compare(m_Item6, objTuple.m_Item6);
871 if (c != 0) return c;
873 return comparer.Compare(m_Item7, objTuple.m_Item7);
876 public override int GetHashCode() {
877 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
880 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
881 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));
884 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
885 return ((IStructuralEquatable) this).GetHashCode(comparer);
887 public override string ToString() {
888 StringBuilder sb = new StringBuilder();
889 sb.Append("(");
890 return ((ITupleInternal)this).ToString(sb);
893 string ITupleInternal.ToString(StringBuilder sb) {
894 sb.Append(m_Item1);
895 sb.Append(", ");
896 sb.Append(m_Item2);
897 sb.Append(", ");
898 sb.Append(m_Item3);
899 sb.Append(", ");
900 sb.Append(m_Item4);
901 sb.Append(", ");
902 sb.Append(m_Item5);
903 sb.Append(", ");
904 sb.Append(m_Item6);
905 sb.Append(", ");
906 sb.Append(m_Item7);
907 sb.Append(")");
908 return sb.ToString();
911 /// <summary>
912 /// The number of positions in this data structure.
913 /// </summary>
914 int ITuple.Length => 7;
916 /// <summary>
917 /// Get the element at position <param name="index"/>.
918 /// </summary>
919 object ITuple.this[int index]
923 switch (index)
925 case 0:
926 return Item1;
927 case 1:
928 return Item2;
929 case 2:
930 return Item3;
931 case 3:
932 return Item4;
933 case 4:
934 return Item5;
935 case 5:
936 return Item6;
937 case 6:
938 return Item7;
939 default:
940 throw new IndexOutOfRangeException();
946 [Serializable]
947 public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple {
949 private readonly T1 m_Item1;
950 private readonly T2 m_Item2;
951 private readonly T3 m_Item3;
952 private readonly T4 m_Item4;
953 private readonly T5 m_Item5;
954 private readonly T6 m_Item6;
955 private readonly T7 m_Item7;
956 private readonly TRest m_Rest;
958 public T1 Item1 { get { return m_Item1; } }
959 public T2 Item2 { get { return m_Item2; } }
960 public T3 Item3 { get { return m_Item3; } }
961 public T4 Item4 { get { return m_Item4; } }
962 public T5 Item5 { get { return m_Item5; } }
963 public T6 Item6 { get { return m_Item6; } }
964 public T7 Item7 { get { return m_Item7; } }
965 public TRest Rest { get { return m_Rest; } }
967 public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest) {
968 if (!(rest is ITupleInternal)) {
969 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleLastArgumentNotATuple"));
972 m_Item1 = item1;
973 m_Item2 = item2;
974 m_Item3 = item3;
975 m_Item4 = item4;
976 m_Item5 = item5;
977 m_Item6 = item6;
978 m_Item7 = item7;
979 m_Rest = rest;
982 public override Boolean Equals(Object obj) {
983 return ((IStructuralEquatable) this).Equals(obj, EqualityComparer<Object>.Default);;
986 Boolean IStructuralEquatable.Equals(Object other, IEqualityComparer comparer) {
987 if (other == null) return false;
989 Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>;
991 if (objTuple == null) {
992 return false;
995 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);
998 Int32 IComparable.CompareTo(Object obj) {
999 return ((IStructuralComparable) this).CompareTo(obj, Comparer<Object>.Default);
1002 Int32 IStructuralComparable.CompareTo(Object other, IComparer comparer) {
1003 if (other == null) return 1;
1005 Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple = other as Tuple<T1, T2, T3, T4, T5, T6, T7, TRest>;
1007 if (objTuple == null) {
1008 throw new ArgumentException(Environment.GetResourceString("ArgumentException_TupleIncorrectType", this.GetType().ToString()), "other");
1011 int c = 0;
1013 c = comparer.Compare(m_Item1, objTuple.m_Item1);
1015 if (c != 0) return c;
1017 c = comparer.Compare(m_Item2, objTuple.m_Item2);
1019 if (c != 0) return c;
1021 c = comparer.Compare(m_Item3, objTuple.m_Item3);
1023 if (c != 0) return c;
1025 c = comparer.Compare(m_Item4, objTuple.m_Item4);
1027 if (c != 0) return c;
1029 c = comparer.Compare(m_Item5, objTuple.m_Item5);
1031 if (c != 0) return c;
1033 c = comparer.Compare(m_Item6, objTuple.m_Item6);
1035 if (c != 0) return c;
1037 c = comparer.Compare(m_Item7, objTuple.m_Item7);
1039 if (c != 0) return c;
1041 return comparer.Compare(m_Rest, objTuple.m_Rest);
1044 public override int GetHashCode() {
1045 return ((IStructuralEquatable) this).GetHashCode(EqualityComparer<Object>.Default);
1048 Int32 IStructuralEquatable.GetHashCode(IEqualityComparer comparer) {
1049 // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
1050 ITupleInternal t = (ITupleInternal) m_Rest;
1051 if(t.Length >= 8) { return t.GetHashCode(comparer); }
1053 // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
1054 int k = 8 - t.Length;
1055 switch(k) {
1056 case 1:
1057 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
1058 case 2:
1059 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
1060 case 3:
1061 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
1062 case 4:
1063 return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
1064 case 5:
1065 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));
1066 case 6:
1067 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));
1068 case 7:
1069 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));
1071 Contract.Assert(false, "Missed all cases for computing Tuple hash code");
1072 return -1;
1075 Int32 ITupleInternal.GetHashCode(IEqualityComparer comparer) {
1076 return ((IStructuralEquatable) this).GetHashCode(comparer);
1078 public override string ToString() {
1079 StringBuilder sb = new StringBuilder();
1080 sb.Append("(");
1081 return ((ITupleInternal)this).ToString(sb);
1084 string ITupleInternal.ToString(StringBuilder sb) {
1085 sb.Append(m_Item1);
1086 sb.Append(", ");
1087 sb.Append(m_Item2);
1088 sb.Append(", ");
1089 sb.Append(m_Item3);
1090 sb.Append(", ");
1091 sb.Append(m_Item4);
1092 sb.Append(", ");
1093 sb.Append(m_Item5);
1094 sb.Append(", ");
1095 sb.Append(m_Item6);
1096 sb.Append(", ");
1097 sb.Append(m_Item7);
1098 sb.Append(", ");
1099 return ((ITupleInternal)m_Rest).ToString(sb);
1102 /// <summary>
1103 /// The number of positions in this data structure.
1104 /// </summary>
1105 int ITuple.Length
1109 return 7 + ((ITupleInternal)Rest).Length;
1113 /// <summary>
1114 /// Get the element at position <param name="index"/>.
1115 /// </summary>
1116 object ITuple.this[int index]
1120 switch (index)
1122 case 0:
1123 return Item1;
1124 case 1:
1125 return Item2;
1126 case 2:
1127 return Item3;
1128 case 3:
1129 return Item4;
1130 case 4:
1131 return Item5;
1132 case 5:
1133 return Item6;
1134 case 6:
1135 return Item7;
1138 return ((ITupleInternal)Rest)[index - 7];