Tuple.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239
  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.
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.Runtime.CompilerServices;
  8. using System.Text;
  9. //
  10. // Note: F# compiler depends on the exact tuple hashing algorithm. Do not ever change it.
  11. //
  12. namespace System
  13. {
  14. /// <summary>
  15. /// Helper so we can call some tuple methods recursively without knowing the underlying types.
  16. /// </summary>
  17. internal interface ITupleInternal : ITuple
  18. {
  19. string ToString(StringBuilder sb);
  20. int GetHashCode(IEqualityComparer comparer);
  21. }
  22. public static class Tuple
  23. {
  24. public static Tuple<T1> Create<T1>(T1 item1)
  25. {
  26. return new Tuple<T1>(item1);
  27. }
  28. public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
  29. {
  30. return new Tuple<T1, T2>(item1, item2);
  31. }
  32. public static Tuple<T1, T2, T3> Create<T1, T2, T3>(T1 item1, T2 item2, T3 item3)
  33. {
  34. return new Tuple<T1, T2, T3>(item1, item2, item3);
  35. }
  36. public static Tuple<T1, T2, T3, T4> Create<T1, T2, T3, T4>(T1 item1, T2 item2, T3 item3, T4 item4)
  37. {
  38. return new Tuple<T1, T2, T3, T4>(item1, item2, item3, item4);
  39. }
  40. public static Tuple<T1, T2, T3, T4, T5> Create<T1, T2, T3, T4, T5>(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
  41. {
  42. return new Tuple<T1, T2, T3, T4, T5>(item1, item2, item3, item4, item5);
  43. }
  44. 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)
  45. {
  46. return new Tuple<T1, T2, T3, T4, T5, T6>(item1, item2, item3, item4, item5, item6);
  47. }
  48. 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)
  49. {
  50. return new Tuple<T1, T2, T3, T4, T5, T6, T7>(item1, item2, item3, item4, item5, item6, item7);
  51. }
  52. 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)
  53. {
  54. return new Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T8>>(item1, item2, item3, item4, item5, item6, item7, new Tuple<T8>(item8));
  55. }
  56. // From System.Web.Util.HashCodeCombiner
  57. internal static int CombineHashCodes(int h1, int h2)
  58. {
  59. return (((h1 << 5) + h1) ^ h2);
  60. }
  61. internal static int CombineHashCodes(int h1, int h2, int h3)
  62. {
  63. return CombineHashCodes(CombineHashCodes(h1, h2), h3);
  64. }
  65. internal static int CombineHashCodes(int h1, int h2, int h3, int h4)
  66. {
  67. return CombineHashCodes(CombineHashCodes(h1, h2), CombineHashCodes(h3, h4));
  68. }
  69. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5)
  70. {
  71. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), h5);
  72. }
  73. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6)
  74. {
  75. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6));
  76. }
  77. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7)
  78. {
  79. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7));
  80. }
  81. internal static int CombineHashCodes(int h1, int h2, int h3, int h4, int h5, int h6, int h7, int h8)
  82. {
  83. return CombineHashCodes(CombineHashCodes(h1, h2, h3, h4), CombineHashCodes(h5, h6, h7, h8));
  84. }
  85. }
  86. [Serializable]
  87. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  88. public class Tuple<T1> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  89. {
  90. private readonly T1 m_Item1; // Do not rename (binary serialization)
  91. public T1 Item1 { get { return m_Item1; } }
  92. public Tuple(T1 item1)
  93. {
  94. m_Item1 = item1;
  95. }
  96. public override bool Equals(object obj)
  97. {
  98. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default);
  99. }
  100. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  101. {
  102. if (other == null) return false;
  103. if (!(other is Tuple<T1> objTuple))
  104. {
  105. return false;
  106. }
  107. return comparer.Equals(m_Item1, objTuple.m_Item1);
  108. }
  109. int IComparable.CompareTo(object obj)
  110. {
  111. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  112. }
  113. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  114. {
  115. if (other == null) return 1;
  116. if (!(other is Tuple<T1> objTuple))
  117. {
  118. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  119. }
  120. return comparer.Compare(m_Item1, objTuple.m_Item1);
  121. }
  122. public override int GetHashCode()
  123. {
  124. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  125. }
  126. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  127. {
  128. return comparer.GetHashCode(m_Item1);
  129. }
  130. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  131. {
  132. return ((IStructuralEquatable)this).GetHashCode(comparer);
  133. }
  134. public override string ToString()
  135. {
  136. StringBuilder sb = new StringBuilder();
  137. sb.Append('(');
  138. return ((ITupleInternal)this).ToString(sb);
  139. }
  140. string ITupleInternal.ToString(StringBuilder sb)
  141. {
  142. sb.Append(m_Item1);
  143. sb.Append(')');
  144. return sb.ToString();
  145. }
  146. /// <summary>
  147. /// The number of positions in this data structure.
  148. /// </summary>
  149. int ITuple.Length => 1;
  150. /// <summary>
  151. /// Get the element at position <param name="index"/>.
  152. /// </summary>
  153. object ITuple.this[int index]
  154. {
  155. get
  156. {
  157. if (index != 0)
  158. {
  159. throw new IndexOutOfRangeException();
  160. }
  161. return Item1;
  162. }
  163. }
  164. }
  165. [Serializable]
  166. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  167. public class Tuple<T1, T2> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  168. {
  169. private readonly T1 m_Item1; // Do not rename (binary serialization)
  170. private readonly T2 m_Item2; // Do not rename (binary serialization)
  171. public T1 Item1 { get { return m_Item1; } }
  172. public T2 Item2 { get { return m_Item2; } }
  173. public Tuple(T1 item1, T2 item2)
  174. {
  175. m_Item1 = item1;
  176. m_Item2 = item2;
  177. }
  178. public override bool Equals(object obj)
  179. {
  180. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  181. }
  182. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  183. {
  184. if (other == null) return false;
  185. if (!(other is Tuple<T1, T2> objTuple))
  186. {
  187. return false;
  188. }
  189. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2);
  190. }
  191. int IComparable.CompareTo(object obj)
  192. {
  193. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  194. }
  195. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  196. {
  197. if (other == null) return 1;
  198. if (!(other is Tuple<T1, T2> objTuple))
  199. {
  200. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  201. }
  202. int c = 0;
  203. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  204. if (c != 0) return c;
  205. return comparer.Compare(m_Item2, objTuple.m_Item2);
  206. }
  207. public override int GetHashCode()
  208. {
  209. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  210. }
  211. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  212. {
  213. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2));
  214. }
  215. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  216. {
  217. return ((IStructuralEquatable)this).GetHashCode(comparer);
  218. }
  219. public override string ToString()
  220. {
  221. StringBuilder sb = new StringBuilder();
  222. sb.Append('(');
  223. return ((ITupleInternal)this).ToString(sb);
  224. }
  225. string ITupleInternal.ToString(StringBuilder sb)
  226. {
  227. sb.Append(m_Item1);
  228. sb.Append(", ");
  229. sb.Append(m_Item2);
  230. sb.Append(')');
  231. return sb.ToString();
  232. }
  233. /// <summary>
  234. /// The number of positions in this data structure.
  235. /// </summary>
  236. int ITuple.Length => 2;
  237. /// <summary>
  238. /// Get the element at position <param name="index"/>.
  239. /// </summary>
  240. object ITuple.this[int index]
  241. {
  242. get
  243. {
  244. switch (index)
  245. {
  246. case 0:
  247. return Item1;
  248. case 1:
  249. return Item2;
  250. default:
  251. throw new IndexOutOfRangeException();
  252. }
  253. }
  254. }
  255. }
  256. [Serializable]
  257. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  258. public class Tuple<T1, T2, T3> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  259. {
  260. private readonly T1 m_Item1; // Do not rename (binary serialization)
  261. private readonly T2 m_Item2; // Do not rename (binary serialization)
  262. private readonly T3 m_Item3; // Do not rename (binary serialization)
  263. public T1 Item1 { get { return m_Item1; } }
  264. public T2 Item2 { get { return m_Item2; } }
  265. public T3 Item3 { get { return m_Item3; } }
  266. public Tuple(T1 item1, T2 item2, T3 item3)
  267. {
  268. m_Item1 = item1;
  269. m_Item2 = item2;
  270. m_Item3 = item3;
  271. }
  272. public override bool Equals(object obj)
  273. {
  274. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  275. }
  276. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  277. {
  278. if (other == null) return false;
  279. if (!(other is Tuple<T1, T2, T3> objTuple))
  280. {
  281. return false;
  282. }
  283. return comparer.Equals(m_Item1, objTuple.m_Item1) && comparer.Equals(m_Item2, objTuple.m_Item2) && comparer.Equals(m_Item3, objTuple.m_Item3);
  284. }
  285. int IComparable.CompareTo(object obj)
  286. {
  287. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  288. }
  289. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  290. {
  291. if (other == null) return 1;
  292. if (!(other is Tuple<T1, T2, T3> objTuple))
  293. {
  294. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  295. }
  296. int c = 0;
  297. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  298. if (c != 0) return c;
  299. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  300. if (c != 0) return c;
  301. return comparer.Compare(m_Item3, objTuple.m_Item3);
  302. }
  303. public override int GetHashCode()
  304. {
  305. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  306. }
  307. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  308. {
  309. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3));
  310. }
  311. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  312. {
  313. return ((IStructuralEquatable)this).GetHashCode(comparer);
  314. }
  315. public override string ToString()
  316. {
  317. StringBuilder sb = new StringBuilder();
  318. sb.Append('(');
  319. return ((ITupleInternal)this).ToString(sb);
  320. }
  321. string ITupleInternal.ToString(StringBuilder sb)
  322. {
  323. sb.Append(m_Item1);
  324. sb.Append(", ");
  325. sb.Append(m_Item2);
  326. sb.Append(", ");
  327. sb.Append(m_Item3);
  328. sb.Append(')');
  329. return sb.ToString();
  330. }
  331. /// <summary>
  332. /// The number of positions in this data structure.
  333. /// </summary>
  334. int ITuple.Length => 3;
  335. /// <summary>
  336. /// Get the element at position <param name="index"/>.
  337. /// </summary>
  338. object ITuple.this[int index]
  339. {
  340. get
  341. {
  342. switch (index)
  343. {
  344. case 0:
  345. return Item1;
  346. case 1:
  347. return Item2;
  348. case 2:
  349. return Item3;
  350. default:
  351. throw new IndexOutOfRangeException();
  352. }
  353. }
  354. }
  355. }
  356. [Serializable]
  357. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  358. public class Tuple<T1, T2, T3, T4> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  359. {
  360. private readonly T1 m_Item1; // Do not rename (binary serialization)
  361. private readonly T2 m_Item2; // Do not rename (binary serialization)
  362. private readonly T3 m_Item3; // Do not rename (binary serialization)
  363. private readonly T4 m_Item4; // Do not rename (binary serialization)
  364. public T1 Item1 { get { return m_Item1; } }
  365. public T2 Item2 { get { return m_Item2; } }
  366. public T3 Item3 { get { return m_Item3; } }
  367. public T4 Item4 { get { return m_Item4; } }
  368. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4)
  369. {
  370. m_Item1 = item1;
  371. m_Item2 = item2;
  372. m_Item3 = item3;
  373. m_Item4 = item4;
  374. }
  375. public override bool Equals(object obj)
  376. {
  377. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  378. }
  379. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  380. {
  381. if (other == null) return false;
  382. if (!(other is Tuple<T1, T2, T3, T4> objTuple))
  383. {
  384. return false;
  385. }
  386. 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);
  387. }
  388. int IComparable.CompareTo(object obj)
  389. {
  390. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  391. }
  392. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  393. {
  394. if (other == null) return 1;
  395. if (!(other is Tuple<T1, T2, T3, T4> objTuple))
  396. {
  397. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  398. }
  399. int c = 0;
  400. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  401. if (c != 0) return c;
  402. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  403. if (c != 0) return c;
  404. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  405. if (c != 0) return c;
  406. return comparer.Compare(m_Item4, objTuple.m_Item4);
  407. }
  408. public override int GetHashCode()
  409. {
  410. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  411. }
  412. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  413. {
  414. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4));
  415. }
  416. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  417. {
  418. return ((IStructuralEquatable)this).GetHashCode(comparer);
  419. }
  420. public override string ToString()
  421. {
  422. StringBuilder sb = new StringBuilder();
  423. sb.Append('(');
  424. return ((ITupleInternal)this).ToString(sb);
  425. }
  426. string ITupleInternal.ToString(StringBuilder sb)
  427. {
  428. sb.Append(m_Item1);
  429. sb.Append(", ");
  430. sb.Append(m_Item2);
  431. sb.Append(", ");
  432. sb.Append(m_Item3);
  433. sb.Append(", ");
  434. sb.Append(m_Item4);
  435. sb.Append(')');
  436. return sb.ToString();
  437. }
  438. /// <summary>
  439. /// The number of positions in this data structure.
  440. /// </summary>
  441. int ITuple.Length => 4;
  442. /// <summary>
  443. /// Get the element at position <param name="index"/>.
  444. /// </summary>
  445. object ITuple.this[int index]
  446. {
  447. get
  448. {
  449. switch (index)
  450. {
  451. case 0:
  452. return Item1;
  453. case 1:
  454. return Item2;
  455. case 2:
  456. return Item3;
  457. case 3:
  458. return Item4;
  459. default:
  460. throw new IndexOutOfRangeException();
  461. }
  462. }
  463. }
  464. }
  465. [Serializable]
  466. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  467. public class Tuple<T1, T2, T3, T4, T5> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  468. {
  469. private readonly T1 m_Item1; // Do not rename (binary serialization)
  470. private readonly T2 m_Item2; // Do not rename (binary serialization)
  471. private readonly T3 m_Item3; // Do not rename (binary serialization)
  472. private readonly T4 m_Item4; // Do not rename (binary serialization)
  473. private readonly T5 m_Item5; // Do not rename (binary serialization)
  474. public T1 Item1 { get { return m_Item1; } }
  475. public T2 Item2 { get { return m_Item2; } }
  476. public T3 Item3 { get { return m_Item3; } }
  477. public T4 Item4 { get { return m_Item4; } }
  478. public T5 Item5 { get { return m_Item5; } }
  479. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
  480. {
  481. m_Item1 = item1;
  482. m_Item2 = item2;
  483. m_Item3 = item3;
  484. m_Item4 = item4;
  485. m_Item5 = item5;
  486. }
  487. public override bool Equals(object obj)
  488. {
  489. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  490. }
  491. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  492. {
  493. if (other == null) return false;
  494. if (!(other is Tuple<T1, T2, T3, T4, T5> objTuple))
  495. {
  496. return false;
  497. }
  498. 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);
  499. }
  500. int IComparable.CompareTo(object obj)
  501. {
  502. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  503. }
  504. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  505. {
  506. if (other == null) return 1;
  507. if (!(other is Tuple<T1, T2, T3, T4, T5> objTuple))
  508. {
  509. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  510. }
  511. int c = 0;
  512. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  513. if (c != 0) return c;
  514. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  515. if (c != 0) return c;
  516. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  517. if (c != 0) return c;
  518. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  519. if (c != 0) return c;
  520. return comparer.Compare(m_Item5, objTuple.m_Item5);
  521. }
  522. public override int GetHashCode()
  523. {
  524. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  525. }
  526. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  527. {
  528. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item1), comparer.GetHashCode(m_Item2), comparer.GetHashCode(m_Item3), comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5));
  529. }
  530. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  531. {
  532. return ((IStructuralEquatable)this).GetHashCode(comparer);
  533. }
  534. public override string ToString()
  535. {
  536. StringBuilder sb = new StringBuilder();
  537. sb.Append('(');
  538. return ((ITupleInternal)this).ToString(sb);
  539. }
  540. string ITupleInternal.ToString(StringBuilder sb)
  541. {
  542. sb.Append(m_Item1);
  543. sb.Append(", ");
  544. sb.Append(m_Item2);
  545. sb.Append(", ");
  546. sb.Append(m_Item3);
  547. sb.Append(", ");
  548. sb.Append(m_Item4);
  549. sb.Append(", ");
  550. sb.Append(m_Item5);
  551. sb.Append(')');
  552. return sb.ToString();
  553. }
  554. /// <summary>
  555. /// The number of positions in this data structure.
  556. /// </summary>
  557. int ITuple.Length => 5;
  558. /// <summary>
  559. /// Get the element at position <param name="index"/>.
  560. /// </summary>
  561. object ITuple.this[int index]
  562. {
  563. get
  564. {
  565. switch (index)
  566. {
  567. case 0:
  568. return Item1;
  569. case 1:
  570. return Item2;
  571. case 2:
  572. return Item3;
  573. case 3:
  574. return Item4;
  575. case 4:
  576. return Item5;
  577. default:
  578. throw new IndexOutOfRangeException();
  579. }
  580. }
  581. }
  582. }
  583. [Serializable]
  584. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  585. public class Tuple<T1, T2, T3, T4, T5, T6> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  586. {
  587. private readonly T1 m_Item1; // Do not rename (binary serialization)
  588. private readonly T2 m_Item2; // Do not rename (binary serialization)
  589. private readonly T3 m_Item3; // Do not rename (binary serialization)
  590. private readonly T4 m_Item4; // Do not rename (binary serialization)
  591. private readonly T5 m_Item5; // Do not rename (binary serialization)
  592. private readonly T6 m_Item6; // Do not rename (binary serialization)
  593. public T1 Item1 { get { return m_Item1; } }
  594. public T2 Item2 { get { return m_Item2; } }
  595. public T3 Item3 { get { return m_Item3; } }
  596. public T4 Item4 { get { return m_Item4; } }
  597. public T5 Item5 { get { return m_Item5; } }
  598. public T6 Item6 { get { return m_Item6; } }
  599. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6)
  600. {
  601. m_Item1 = item1;
  602. m_Item2 = item2;
  603. m_Item3 = item3;
  604. m_Item4 = item4;
  605. m_Item5 = item5;
  606. m_Item6 = item6;
  607. }
  608. public override bool Equals(object obj)
  609. {
  610. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  611. }
  612. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  613. {
  614. if (other == null) return false;
  615. if (!(other is Tuple<T1, T2, T3, T4, T5, T6> objTuple))
  616. {
  617. return false;
  618. }
  619. 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);
  620. }
  621. int IComparable.CompareTo(object obj)
  622. {
  623. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  624. }
  625. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  626. {
  627. if (other == null) return 1;
  628. if (!(other is Tuple<T1, T2, T3, T4, T5, T6> objTuple))
  629. {
  630. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  631. }
  632. int c = 0;
  633. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  634. if (c != 0) return c;
  635. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  636. if (c != 0) return c;
  637. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  638. if (c != 0) return c;
  639. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  640. if (c != 0) return c;
  641. c = comparer.Compare(m_Item5, objTuple.m_Item5);
  642. if (c != 0) return c;
  643. return comparer.Compare(m_Item6, objTuple.m_Item6);
  644. }
  645. public override int GetHashCode()
  646. {
  647. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  648. }
  649. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  650. {
  651. 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));
  652. }
  653. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  654. {
  655. return ((IStructuralEquatable)this).GetHashCode(comparer);
  656. }
  657. public override string ToString()
  658. {
  659. StringBuilder sb = new StringBuilder();
  660. sb.Append('(');
  661. return ((ITupleInternal)this).ToString(sb);
  662. }
  663. string ITupleInternal.ToString(StringBuilder sb)
  664. {
  665. sb.Append(m_Item1);
  666. sb.Append(", ");
  667. sb.Append(m_Item2);
  668. sb.Append(", ");
  669. sb.Append(m_Item3);
  670. sb.Append(", ");
  671. sb.Append(m_Item4);
  672. sb.Append(", ");
  673. sb.Append(m_Item5);
  674. sb.Append(", ");
  675. sb.Append(m_Item6);
  676. sb.Append(')');
  677. return sb.ToString();
  678. }
  679. /// <summary>
  680. /// The number of positions in this data structure.
  681. /// </summary>
  682. int ITuple.Length => 6;
  683. /// <summary>
  684. /// Get the element at position <param name="index"/>.
  685. /// </summary>
  686. object ITuple.this[int index]
  687. {
  688. get
  689. {
  690. switch (index)
  691. {
  692. case 0:
  693. return Item1;
  694. case 1:
  695. return Item2;
  696. case 2:
  697. return Item3;
  698. case 3:
  699. return Item4;
  700. case 4:
  701. return Item5;
  702. case 5:
  703. return Item6;
  704. default:
  705. throw new IndexOutOfRangeException();
  706. }
  707. }
  708. }
  709. }
  710. [Serializable]
  711. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  712. public class Tuple<T1, T2, T3, T4, T5, T6, T7> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  713. {
  714. private readonly T1 m_Item1; // Do not rename (binary serialization)
  715. private readonly T2 m_Item2; // Do not rename (binary serialization)
  716. private readonly T3 m_Item3; // Do not rename (binary serialization)
  717. private readonly T4 m_Item4; // Do not rename (binary serialization)
  718. private readonly T5 m_Item5; // Do not rename (binary serialization)
  719. private readonly T6 m_Item6; // Do not rename (binary serialization)
  720. private readonly T7 m_Item7; // Do not rename (binary serialization)
  721. public T1 Item1 { get { return m_Item1; } }
  722. public T2 Item2 { get { return m_Item2; } }
  723. public T3 Item3 { get { return m_Item3; } }
  724. public T4 Item4 { get { return m_Item4; } }
  725. public T5 Item5 { get { return m_Item5; } }
  726. public T6 Item6 { get { return m_Item6; } }
  727. public T7 Item7 { get { return m_Item7; } }
  728. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7)
  729. {
  730. m_Item1 = item1;
  731. m_Item2 = item2;
  732. m_Item3 = item3;
  733. m_Item4 = item4;
  734. m_Item5 = item5;
  735. m_Item6 = item6;
  736. m_Item7 = item7;
  737. }
  738. public override bool Equals(object obj)
  739. {
  740. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  741. }
  742. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  743. {
  744. if (other == null) return false;
  745. if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple))
  746. {
  747. return false;
  748. }
  749. 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);
  750. }
  751. int IComparable.CompareTo(object obj)
  752. {
  753. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  754. }
  755. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  756. {
  757. if (other == null) return 1;
  758. if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7> objTuple))
  759. {
  760. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  761. }
  762. int c = 0;
  763. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  764. if (c != 0) return c;
  765. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  766. if (c != 0) return c;
  767. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  768. if (c != 0) return c;
  769. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  770. if (c != 0) return c;
  771. c = comparer.Compare(m_Item5, objTuple.m_Item5);
  772. if (c != 0) return c;
  773. c = comparer.Compare(m_Item6, objTuple.m_Item6);
  774. if (c != 0) return c;
  775. return comparer.Compare(m_Item7, objTuple.m_Item7);
  776. }
  777. public override int GetHashCode()
  778. {
  779. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  780. }
  781. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  782. {
  783. 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));
  784. }
  785. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  786. {
  787. return ((IStructuralEquatable)this).GetHashCode(comparer);
  788. }
  789. public override string ToString()
  790. {
  791. StringBuilder sb = new StringBuilder();
  792. sb.Append('(');
  793. return ((ITupleInternal)this).ToString(sb);
  794. }
  795. string ITupleInternal.ToString(StringBuilder sb)
  796. {
  797. sb.Append(m_Item1);
  798. sb.Append(", ");
  799. sb.Append(m_Item2);
  800. sb.Append(", ");
  801. sb.Append(m_Item3);
  802. sb.Append(", ");
  803. sb.Append(m_Item4);
  804. sb.Append(", ");
  805. sb.Append(m_Item5);
  806. sb.Append(", ");
  807. sb.Append(m_Item6);
  808. sb.Append(", ");
  809. sb.Append(m_Item7);
  810. sb.Append(')');
  811. return sb.ToString();
  812. }
  813. /// <summary>
  814. /// The number of positions in this data structure.
  815. /// </summary>
  816. int ITuple.Length => 7;
  817. /// <summary>
  818. /// Get the element at position <param name="index"/>.
  819. /// </summary>
  820. object ITuple.this[int index]
  821. {
  822. get
  823. {
  824. switch (index)
  825. {
  826. case 0:
  827. return Item1;
  828. case 1:
  829. return Item2;
  830. case 2:
  831. return Item3;
  832. case 3:
  833. return Item4;
  834. case 4:
  835. return Item5;
  836. case 5:
  837. return Item6;
  838. case 6:
  839. return Item7;
  840. default:
  841. throw new IndexOutOfRangeException();
  842. }
  843. }
  844. }
  845. }
  846. [Serializable]
  847. [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
  848. public class Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> : IStructuralEquatable, IStructuralComparable, IComparable, ITupleInternal, ITuple
  849. {
  850. private readonly T1 m_Item1; // Do not rename (binary serialization)
  851. private readonly T2 m_Item2; // Do not rename (binary serialization)
  852. private readonly T3 m_Item3; // Do not rename (binary serialization)
  853. private readonly T4 m_Item4; // Do not rename (binary serialization)
  854. private readonly T5 m_Item5; // Do not rename (binary serialization)
  855. private readonly T6 m_Item6; // Do not rename (binary serialization)
  856. private readonly T7 m_Item7; // Do not rename (binary serialization)
  857. private readonly TRest m_Rest; // Do not rename (binary serialization)
  858. public T1 Item1 { get { return m_Item1; } }
  859. public T2 Item2 { get { return m_Item2; } }
  860. public T3 Item3 { get { return m_Item3; } }
  861. public T4 Item4 { get { return m_Item4; } }
  862. public T5 Item5 { get { return m_Item5; } }
  863. public T6 Item6 { get { return m_Item6; } }
  864. public T7 Item7 { get { return m_Item7; } }
  865. public TRest Rest { get { return m_Rest; } }
  866. public Tuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest)
  867. {
  868. if (!(rest is ITupleInternal))
  869. {
  870. throw new ArgumentException(SR.ArgumentException_TupleLastArgumentNotATuple);
  871. }
  872. m_Item1 = item1;
  873. m_Item2 = item2;
  874. m_Item3 = item3;
  875. m_Item4 = item4;
  876. m_Item5 = item5;
  877. m_Item6 = item6;
  878. m_Item7 = item7;
  879. m_Rest = rest;
  880. }
  881. public override bool Equals(object obj)
  882. {
  883. return ((IStructuralEquatable)this).Equals(obj, EqualityComparer<object>.Default); ;
  884. }
  885. bool IStructuralEquatable.Equals(object other, IEqualityComparer comparer)
  886. {
  887. if (other == null) return false;
  888. if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple))
  889. {
  890. return false;
  891. }
  892. 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);
  893. }
  894. int IComparable.CompareTo(object obj)
  895. {
  896. return ((IStructuralComparable)this).CompareTo(obj, Comparer<object>.Default);
  897. }
  898. int IStructuralComparable.CompareTo(object other, IComparer comparer)
  899. {
  900. if (other == null) return 1;
  901. if (!(other is Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> objTuple))
  902. {
  903. throw new ArgumentException(SR.Format(SR.ArgumentException_TupleIncorrectType, this.GetType().ToString()), nameof(other));
  904. }
  905. int c = 0;
  906. c = comparer.Compare(m_Item1, objTuple.m_Item1);
  907. if (c != 0) return c;
  908. c = comparer.Compare(m_Item2, objTuple.m_Item2);
  909. if (c != 0) return c;
  910. c = comparer.Compare(m_Item3, objTuple.m_Item3);
  911. if (c != 0) return c;
  912. c = comparer.Compare(m_Item4, objTuple.m_Item4);
  913. if (c != 0) return c;
  914. c = comparer.Compare(m_Item5, objTuple.m_Item5);
  915. if (c != 0) return c;
  916. c = comparer.Compare(m_Item6, objTuple.m_Item6);
  917. if (c != 0) return c;
  918. c = comparer.Compare(m_Item7, objTuple.m_Item7);
  919. if (c != 0) return c;
  920. return comparer.Compare(m_Rest, objTuple.m_Rest);
  921. }
  922. public override int GetHashCode()
  923. {
  924. return ((IStructuralEquatable)this).GetHashCode(EqualityComparer<object>.Default);
  925. }
  926. int IStructuralEquatable.GetHashCode(IEqualityComparer comparer)
  927. {
  928. // We want to have a limited hash in this case. We'll use the last 8 elements of the tuple
  929. ITupleInternal t = (ITupleInternal)m_Rest;
  930. if (t.Length >= 8) { return t.GetHashCode(comparer); }
  931. // In this case, the rest memeber has less than 8 elements so we need to combine some our elements with the elements in rest
  932. int k = 8 - t.Length;
  933. switch (k)
  934. {
  935. case 1:
  936. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  937. case 2:
  938. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  939. case 3:
  940. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  941. case 4:
  942. return Tuple.CombineHashCodes(comparer.GetHashCode(m_Item4), comparer.GetHashCode(m_Item5), comparer.GetHashCode(m_Item6), comparer.GetHashCode(m_Item7), t.GetHashCode(comparer));
  943. case 5:
  944. 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));
  945. case 6:
  946. 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));
  947. case 7:
  948. 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));
  949. }
  950. Debug.Fail("Missed all cases for computing Tuple hash code");
  951. return -1;
  952. }
  953. int ITupleInternal.GetHashCode(IEqualityComparer comparer)
  954. {
  955. return ((IStructuralEquatable)this).GetHashCode(comparer);
  956. }
  957. public override string ToString()
  958. {
  959. StringBuilder sb = new StringBuilder();
  960. sb.Append('(');
  961. return ((ITupleInternal)this).ToString(sb);
  962. }
  963. string ITupleInternal.ToString(StringBuilder sb)
  964. {
  965. sb.Append(m_Item1);
  966. sb.Append(", ");
  967. sb.Append(m_Item2);
  968. sb.Append(", ");
  969. sb.Append(m_Item3);
  970. sb.Append(", ");
  971. sb.Append(m_Item4);
  972. sb.Append(", ");
  973. sb.Append(m_Item5);
  974. sb.Append(", ");
  975. sb.Append(m_Item6);
  976. sb.Append(", ");
  977. sb.Append(m_Item7);
  978. sb.Append(", ");
  979. return ((ITupleInternal)m_Rest).ToString(sb);
  980. }
  981. /// <summary>
  982. /// The number of positions in this data structure.
  983. /// </summary>
  984. int ITuple.Length
  985. {
  986. get
  987. {
  988. return 7 + ((ITupleInternal)Rest).Length;
  989. }
  990. }
  991. /// <summary>
  992. /// Get the element at position <param name="index"/>.
  993. /// </summary>
  994. object ITuple.this[int index]
  995. {
  996. get
  997. {
  998. switch (index)
  999. {
  1000. case 0:
  1001. return Item1;
  1002. case 1:
  1003. return Item2;
  1004. case 2:
  1005. return Item3;
  1006. case 3:
  1007. return Item4;
  1008. case 4:
  1009. return Item5;
  1010. case 5:
  1011. return Item6;
  1012. case 6:
  1013. return Item7;
  1014. }
  1015. return ((ITupleInternal)Rest)[index - 7];
  1016. }
  1017. }
  1018. }
  1019. }