Mirror of Svelto.ECS because we're a fan of it
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

410 lines
17KB

  1. using System.Runtime.CompilerServices;
  2. using Svelto.DataStructures;
  3. using Svelto.ECS.Hybrid;
  4. using Svelto.ECS.Internal;
  5. namespace Svelto.ECS
  6. {
  7. public static class EntityCollectionExtension
  8. {
  9. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  10. public static void Deconstruct<T1>(in this EntityCollection<T1> ec, out NB<T1> buffer, out int count)
  11. where T1 : unmanaged, IEntityComponent
  12. {
  13. if (ec._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  14. {
  15. buffer = default;
  16. count = 0;
  17. return;
  18. }
  19. buffer = (NB<T1>)ec._buffer;
  20. count = (int)ec.count;
  21. }
  22. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  23. public static void Deconstruct<T1>(in this EntityCollection<T1> ec, out NB<T1> buffer,
  24. out NativeEntityIDs entityIDs, out int count) where T1 : unmanaged, IEntityComponent
  25. {
  26. if (ec._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  27. {
  28. buffer = default;
  29. count = 0;
  30. entityIDs = default;
  31. return;
  32. }
  33. buffer = (NB<T1>)ec._buffer;
  34. count = (int)ec.count;
  35. entityIDs = (NativeEntityIDs)ec._entityIDs;
  36. }
  37. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  38. public static void Deconstruct<T1, T2>(in this EntityCollection<T1, T2> ec, out NB<T1> buffer1,
  39. out NB<T2> buffer2, out NativeEntityIDs entityIDs, out int count) where T1 : unmanaged, IEntityComponent
  40. where T2 : unmanaged, IEntityComponent
  41. {
  42. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  43. {
  44. buffer1 = default;
  45. buffer2 = default;
  46. count = 0;
  47. entityIDs = default;
  48. return;
  49. }
  50. buffer1 = (NB<T1>)ec.buffer1._buffer;
  51. buffer2 = (NB<T2>)ec.buffer2._buffer;
  52. count = ec.count;
  53. entityIDs = (NativeEntityIDs)ec.buffer1._entityIDs;
  54. }
  55. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  56. public static void Deconstruct<T1, T2>(in this EntityCollection<T1, T2> ec, out NB<T1> buffer1,
  57. out NB<T2> buffer2, out int count) where T1 : unmanaged, IEntityComponent
  58. where T2 : unmanaged, IEntityComponent
  59. {
  60. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  61. {
  62. buffer1 = default;
  63. buffer2 = default;
  64. count = 0;
  65. return;
  66. }
  67. buffer1 = (NB<T1>)ec.buffer1._buffer;
  68. buffer2 = (NB<T2>)ec.buffer2._buffer;
  69. count = (int)ec.count;
  70. }
  71. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  72. public static void Deconstruct<T1, T2, T3>(in this EntityCollection<T1, T2, T3> ec, out NB<T1> buffer1,
  73. out NB<T2> buffer2, out NB<T3> buffer3, out int count) where T1 : unmanaged, IEntityComponent
  74. where T2 : unmanaged, IEntityComponent
  75. where T3 : unmanaged, IEntityComponent
  76. {
  77. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  78. {
  79. buffer1 = default;
  80. buffer2 = default;
  81. buffer3 = default;
  82. count = 0;
  83. return;
  84. }
  85. buffer1 = (NB<T1>)ec.buffer1._buffer;
  86. buffer2 = (NB<T2>)ec.buffer2._buffer;
  87. buffer3 = (NB<T3>)ec.buffer3._buffer;
  88. count = (int)ec.count;
  89. }
  90. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  91. public static void Deconstruct<T1, T2, T3>(in this EntityCollection<T1, T2, T3> ec, out NB<T1> buffer1,
  92. out NB<T2> buffer2, out NB<T3> buffer3, out NativeEntityIDs entityIDs, out int count)
  93. where T1 : unmanaged, IEntityComponent
  94. where T2 : unmanaged, IEntityComponent
  95. where T3 : unmanaged, IEntityComponent
  96. {
  97. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  98. {
  99. buffer1 = default;
  100. buffer2 = default;
  101. buffer3 = default;
  102. count = 0;
  103. entityIDs = default;
  104. return;
  105. }
  106. buffer1 = (NB<T1>)ec.buffer1._buffer;
  107. buffer2 = (NB<T2>)ec.buffer2._buffer;
  108. buffer3 = (NB<T3>)ec.buffer3._buffer;
  109. count = (int)ec.count;
  110. entityIDs = (NativeEntityIDs)ec.buffer1._entityIDs;
  111. }
  112. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  113. public static void Deconstruct<T1, T2, T3, T4>(in this EntityCollection<T1, T2, T3, T4> ec, out NB<T1> buffer1,
  114. out NB<T2> buffer2, out NB<T3> buffer3, out NB<T4> buffer4, out int count)
  115. where T1 : unmanaged, IEntityComponent
  116. where T2 : unmanaged, IEntityComponent
  117. where T3 : unmanaged, IEntityComponent
  118. where T4 : unmanaged, IEntityComponent
  119. {
  120. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  121. {
  122. buffer1 = default;
  123. buffer2 = default;
  124. buffer3 = default;
  125. buffer4 = default;
  126. count = 0;
  127. return;
  128. }
  129. buffer1 = (NB<T1>)ec.buffer1._buffer;
  130. buffer2 = (NB<T2>)ec.buffer2._buffer;
  131. buffer3 = (NB<T3>)ec.buffer3._buffer;
  132. buffer4 = (NB<T4>)ec.buffer4._buffer;
  133. count = (int)ec.count;
  134. }
  135. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  136. public static void Deconstruct<T1, T2, T3, T4>(in this EntityCollection<T1, T2, T3, T4> ec, out NB<T1> buffer1,
  137. out NB<T2> buffer2, out NB<T3> buffer3, out NB<T4> buffer4, out NativeEntityIDs entityIDs, out int count)
  138. where T1 : unmanaged, IEntityComponent
  139. where T2 : unmanaged, IEntityComponent
  140. where T3 : unmanaged, IEntityComponent
  141. where T4 : unmanaged, IEntityComponent
  142. {
  143. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  144. {
  145. buffer1 = default;
  146. buffer2 = default;
  147. buffer3 = default;
  148. buffer4 = default;
  149. count = 0;
  150. entityIDs = default;
  151. return;
  152. }
  153. buffer1 = (NB<T1>)ec.buffer1._buffer;
  154. buffer2 = (NB<T2>)ec.buffer2._buffer;
  155. buffer3 = (NB<T3>)ec.buffer3._buffer;
  156. buffer4 = (NB<T4>)ec.buffer4._buffer;
  157. entityIDs = (NativeEntityIDs)ec.buffer1._entityIDs;
  158. count = (int)ec.count;
  159. }
  160. }
  161. public static class EntityCollectionExtensionB
  162. {
  163. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  164. public static void Deconstruct<T1>(in this EntityCollection<T1> ec, out MB<T1> buffer, out int count)
  165. where T1 : struct, IEntityViewComponent
  166. {
  167. if (ec._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  168. {
  169. buffer = default;
  170. count = 0;
  171. return;
  172. }
  173. buffer = (MB<T1>)ec._buffer;
  174. count = (int)ec.count;
  175. }
  176. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  177. public static void Deconstruct<T1>(in this EntityCollection<T1> ec, out MB<T1> buffer,
  178. out ManagedEntityIDs entityIDs, out int count) where T1 : struct, IEntityViewComponent
  179. {
  180. if (ec._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  181. {
  182. buffer = default;
  183. count = 0;
  184. entityIDs = default;
  185. return;
  186. }
  187. buffer = (MB<T1>)ec._buffer;
  188. count = (int)ec.count;
  189. entityIDs = (ManagedEntityIDs)ec._entityIDs;
  190. }
  191. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  192. public static void Deconstruct<T1, T2>(in this EntityCollection<T1, T2> ec, out MB<T1> buffer1,
  193. out MB<T2> buffer2, out int count) where T1 : struct, IEntityViewComponent
  194. where T2 : struct, IEntityViewComponent
  195. {
  196. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  197. {
  198. buffer1 = default;
  199. buffer2 = default;
  200. count = 0;
  201. return;
  202. }
  203. buffer1 = (MB<T1>)ec.buffer1._buffer;
  204. buffer2 = (MB<T2>)ec.buffer2._buffer;
  205. count = (int)ec.count;
  206. }
  207. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  208. public static void Deconstruct<T1, T2>(in this EntityCollection<T1, T2> ec, out MB<T1> buffer1,
  209. out MB<T2> buffer2, out ManagedEntityIDs entityIDs, out int count) where T1 : struct, IEntityViewComponent
  210. where T2 : struct, IEntityViewComponent
  211. {
  212. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  213. {
  214. buffer1 = default;
  215. buffer2 = default;
  216. count = 0;
  217. entityIDs = default;
  218. return;
  219. }
  220. buffer1 = (MB<T1>)ec.buffer1._buffer;
  221. buffer2 = (MB<T2>)ec.buffer2._buffer;
  222. count = (int)ec.count;
  223. entityIDs = (ManagedEntityIDs)ec.buffer1._entityIDs;
  224. }
  225. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  226. public static void Deconstruct<T1, T2, T3>(in this EntityCollection<T1, T2, T3> ec, out MB<T1> buffer1,
  227. out MB<T2> buffer2, out MB<T3> buffer3, out int count) where T1 : struct, IEntityViewComponent
  228. where T2 : struct, IEntityViewComponent
  229. where T3 : struct, IEntityViewComponent
  230. {
  231. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  232. {
  233. buffer1 = default;
  234. buffer2 = default;
  235. buffer3 = default;
  236. count = 0;
  237. return;
  238. }
  239. buffer1 = (MB<T1>)ec.buffer1._buffer;
  240. buffer2 = (MB<T2>)ec.buffer2._buffer;
  241. buffer3 = (MB<T3>)ec.buffer3._buffer;
  242. count = (int)ec.count;
  243. }
  244. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  245. public static void Deconstruct<T1, T2, T3>(in this EntityCollection<T1, T2, T3> ec, out MB<T1> buffer1,
  246. out MB<T2> buffer2, out MB<T3> buffer3, out ManagedEntityIDs entityIDs, out int count)
  247. where T1 : struct, IEntityViewComponent
  248. where T2 : struct, IEntityViewComponent
  249. where T3 : struct, IEntityViewComponent
  250. {
  251. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  252. {
  253. buffer1 = default;
  254. buffer2 = default;
  255. buffer3 = default;
  256. entityIDs = default;
  257. count = 0;
  258. return;
  259. }
  260. buffer1 = (MB<T1>)ec.buffer1._buffer;
  261. buffer2 = (MB<T2>)ec.buffer2._buffer;
  262. buffer3 = (MB<T3>)ec.buffer3._buffer;
  263. count = (int)ec.count;
  264. entityIDs = (ManagedEntityIDs)ec.buffer1._entityIDs;
  265. }
  266. }
  267. public static class EntityCollectionExtensionC
  268. {
  269. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  270. public static void Deconstruct<T1, T2>(in this EntityCollection<T1, T2> ec, out NB<T1> buffer1,
  271. out MB<T2> buffer2, out int count) where T1 : unmanaged, IEntityComponent
  272. where T2 : struct, IEntityViewComponent
  273. {
  274. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  275. {
  276. buffer1 = default;
  277. buffer2 = default;
  278. count = 0;
  279. return;
  280. }
  281. buffer1 = (NB<T1>)ec.buffer1._buffer;
  282. buffer2 = (MB<T2>)ec.buffer2._buffer;
  283. count = (int)ec.count;
  284. }
  285. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  286. public static void Deconstruct<T1, T2, T3>(in this EntityCollection<T1, T2, T3> ec, out NB<T1> buffer1,
  287. out MB<T2> buffer2, out MB<T3> buffer3, out int count) where T1 : unmanaged, IEntityComponent
  288. where T2 : struct, IEntityViewComponent
  289. where T3 : struct, IEntityViewComponent
  290. {
  291. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  292. {
  293. buffer1 = default;
  294. buffer2 = default;
  295. buffer3 = default;
  296. count = 0;
  297. return;
  298. }
  299. buffer1 = (NB<T1>)ec.buffer1._buffer;
  300. buffer2 = (MB<T2>)ec.buffer2._buffer;
  301. buffer3 = (MB<T3>)ec.buffer3._buffer;
  302. count = (int)ec.count;
  303. }
  304. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  305. public static void Deconstruct<T1, T2, T3, T4>(in this EntityCollection<T1, T2, T3, T4> ec, out NB<T1> buffer1,
  306. out NB<T2> buffer2, out NB<T3> buffer3, out MB<T4> buffer4, out int count)
  307. where T1 : unmanaged, IEntityComponent
  308. where T2 : unmanaged, IEntityComponent
  309. where T3 : unmanaged, IEntityComponent
  310. where T4 : struct, IEntityViewComponent
  311. {
  312. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  313. {
  314. buffer1 = default;
  315. buffer2 = default;
  316. buffer3 = default;
  317. buffer4 = default;
  318. count = 0;
  319. return;
  320. }
  321. buffer1 = (NB<T1>)ec.buffer1._buffer;
  322. buffer2 = (NB<T2>)ec.buffer2._buffer;
  323. buffer3 = (NB<T3>)ec.buffer3._buffer;
  324. buffer4 = (MB<T4>)ec.buffer4._buffer;
  325. count = (int)ec.count;
  326. }
  327. }
  328. public static class EntityCollectionExtensionD
  329. {
  330. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  331. public static void Deconstruct<T1, T2, T3>(in this EntityCollection<T1, T2, T3> ec, out NB<T1> buffer1,
  332. out NB<T2> buffer2, out MB<T3> buffer3, out int count) where T1 : unmanaged, IEntityComponent
  333. where T2 : unmanaged, IEntityComponent
  334. where T3 : struct, IEntityViewComponent
  335. {
  336. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  337. {
  338. buffer1 = default;
  339. buffer2 = default;
  340. buffer3 = default;
  341. count = 0;
  342. return;
  343. }
  344. buffer1 = (NB<T1>)ec.buffer1._buffer;
  345. buffer2 = (NB<T2>)ec.buffer2._buffer;
  346. buffer3 = (MB<T3>)ec.buffer3._buffer;
  347. count = (int)ec.count;
  348. }
  349. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  350. public static void Deconstruct<T1, T2, T3, T4>(in this EntityCollection<T1, T2, T3, T4> ec, out NB<T1> buffer1,
  351. out NB<T2> buffer2, out MB<T3> buffer3, out MB<T4> buffer4, out int count)
  352. where T1 : unmanaged, IEntityComponent
  353. where T2 : unmanaged, IEntityComponent
  354. where T3 : struct, IEntityViewComponent
  355. where T4 : struct, IEntityViewComponent
  356. {
  357. if (ec.buffer1._buffer == null) //I cannot test 0, as buffer can be valid and processed by removeEx with count 0
  358. {
  359. buffer1 = default;
  360. buffer2 = default;
  361. buffer3 = default;
  362. buffer4 = default;
  363. count = 0;
  364. return;
  365. }
  366. buffer1 = (NB<T1>)ec.buffer1._buffer;
  367. buffer2 = (NB<T2>)ec.buffer2._buffer;
  368. buffer3 = (MB<T3>)ec.buffer3._buffer;
  369. buffer4 = (MB<T4>)ec.buffer4._buffer;
  370. count = (int)ec.count;
  371. }
  372. }
  373. }