Async Entity Component System based on the ideas of specs (https://github.com/amethyst/specs)
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

585 satır
13 KiB

  1. use std::iter::{once, DoubleEndedIterator, ExactSizeIterator, Fuse, Iterator};
  2. use crate::{
  3. Consumer, Executor, Folder, IndexedParallelIterator, IndexedProducer, IndexedProducerCallback,
  4. ParallelIterator, Producer, ProducerCallback, Reducer, Setup, WithSetup,
  5. };
  6. /* Intersperse */
  7. pub struct Intersperse<X, I> {
  8. base: X,
  9. item: I,
  10. }
  11. impl<X, I> Intersperse<X, I> {
  12. pub fn new(base: X, item: I) -> Self {
  13. Self { base, item }
  14. }
  15. }
  16. impl<'a, X, I> ParallelIterator<'a> for Intersperse<X, I>
  17. where
  18. X: ParallelIterator<'a, Item = I>,
  19. I: Clone + Send + 'a,
  20. {
  21. type Item = I;
  22. fn drive<E, C, D, R>(self, executor: E, base: C) -> E::Result
  23. where
  24. E: Executor<'a, D>,
  25. C: Consumer<Self::Item, Result = D, Reducer = R> + 'a,
  26. D: Send + 'a,
  27. R: Reducer<D> + Send + 'a,
  28. {
  29. self.base.drive(
  30. executor,
  31. IntersperseConsumer {
  32. base,
  33. item: self.item,
  34. clone_first: false,
  35. },
  36. )
  37. }
  38. fn with_producer<CB>(self, base: CB) -> CB::Output
  39. where
  40. CB: ProducerCallback<'a, Self::Item>,
  41. {
  42. let item = self.item;
  43. self.base.with_producer(IntersperseCallback { base, item })
  44. }
  45. fn len_hint_opt(&self) -> Option<usize> {
  46. match self.base.len_hint_opt()? {
  47. 0 => Some(0),
  48. len => len.checked_add(len - 1),
  49. }
  50. }
  51. }
  52. impl<'a, X, I> IndexedParallelIterator<'a> for Intersperse<X, I>
  53. where
  54. X: IndexedParallelIterator<'a, Item = I>,
  55. I: Clone + Send + 'a,
  56. {
  57. fn drive_indexed<E, C, D, R>(self, executor: E, base: C) -> E::Result
  58. where
  59. E: Executor<'a, D>,
  60. C: Consumer<Self::Item, Result = D, Reducer = R> + 'a,
  61. D: Send + 'a,
  62. R: Reducer<D> + Send + 'a,
  63. {
  64. self.base.drive_indexed(
  65. executor,
  66. IntersperseConsumer {
  67. base,
  68. item: self.item,
  69. clone_first: false,
  70. },
  71. )
  72. }
  73. fn with_producer_indexed<CB>(self, base: CB) -> CB::Output
  74. where
  75. CB: IndexedProducerCallback<'a, Self::Item>,
  76. {
  77. let item = self.item;
  78. self.base
  79. .with_producer_indexed(IntersperseCallback { base, item })
  80. }
  81. fn len_hint(&self) -> usize {
  82. match self.base.len_hint() {
  83. 0 => 0,
  84. len => len - 1,
  85. }
  86. }
  87. }
  88. /* IntersperseCallback */
  89. struct IntersperseCallback<CB, I> {
  90. base: CB,
  91. item: I,
  92. }
  93. impl<'a, CB, I> ProducerCallback<'a, I> for IntersperseCallback<CB, I>
  94. where
  95. CB: ProducerCallback<'a, I>,
  96. I: Clone + Send + 'a,
  97. {
  98. type Output = CB::Output;
  99. fn callback<P>(self, base: P) -> Self::Output
  100. where
  101. P: Producer<Item = I> + 'a,
  102. {
  103. let item = self.item;
  104. let len = None;
  105. self.base.callback(IntersperseProducer {
  106. base,
  107. item,
  108. len,
  109. clone_first: false,
  110. })
  111. }
  112. }
  113. impl<'a, CB, I> IndexedProducerCallback<'a, I> for IntersperseCallback<CB, I>
  114. where
  115. CB: IndexedProducerCallback<'a, I>,
  116. I: Clone + Send + 'a,
  117. {
  118. type Output = CB::Output;
  119. fn callback<P>(self, base: P) -> Self::Output
  120. where
  121. P: IndexedProducer<Item = I> + 'a,
  122. {
  123. let item = self.item;
  124. let len = Some(base.len());
  125. self.base.callback(IntersperseProducer {
  126. base,
  127. item,
  128. len,
  129. clone_first: false,
  130. })
  131. }
  132. }
  133. /* IntersperseProducer */
  134. struct IntersperseProducer<P, I> {
  135. base: P,
  136. item: I,
  137. len: Option<usize>,
  138. clone_first: bool,
  139. }
  140. impl<P, I> WithSetup for IntersperseProducer<P, I>
  141. where
  142. P: WithSetup,
  143. {
  144. fn setup(&self) -> Setup {
  145. self.base.setup()
  146. }
  147. }
  148. impl<P, I> Producer for IntersperseProducer<P, I>
  149. where
  150. P: Producer<Item = I>,
  151. I: Clone + Send,
  152. {
  153. type Item = I;
  154. type IntoIter = IntersperseIter<P::IntoIter, I>;
  155. fn into_iter(self) -> Self::IntoIter {
  156. IntersperseIter {
  157. base: self.base.into_iter().fuse(),
  158. item: self.item,
  159. item_front: None,
  160. item_back: None,
  161. clone_first: self.clone_first,
  162. clone_last: false,
  163. }
  164. }
  165. fn split(self) -> (Self, Option<Self>) {
  166. let item = self.item;
  167. let (left, right) = self.base.split();
  168. let left = Self {
  169. base: left,
  170. item: item.clone(),
  171. len: None,
  172. clone_first: self.clone_first,
  173. };
  174. let right = right.map(move |base| Self {
  175. base,
  176. item,
  177. len: None,
  178. clone_first: true,
  179. });
  180. (left, right)
  181. }
  182. fn fold_with<F>(self, base: F) -> F
  183. where
  184. F: Folder<Self::Item>,
  185. {
  186. let item = self.item;
  187. let clone_first = self.clone_first;
  188. let folder = IntersperseFolder {
  189. base,
  190. item,
  191. clone_first,
  192. };
  193. self.base.fold_with(folder).base
  194. }
  195. }
  196. impl<P, I> IndexedProducer for IntersperseProducer<P, I>
  197. where
  198. P: IndexedProducer<Item = I>,
  199. I: Clone + Send,
  200. {
  201. type Item = I;
  202. type IntoIter = IntersperseIter<P::IntoIter, I>;
  203. fn into_iter(self) -> Self::IntoIter {
  204. let len = self.len.unwrap();
  205. IntersperseIter {
  206. base: self.base.into_iter().fuse(),
  207. item: self.item,
  208. item_front: None,
  209. item_back: None,
  210. clone_first: len > 0 && self.clone_first,
  211. clone_last: len > 1 && ((len & 1 == 0) ^ self.clone_first),
  212. }
  213. }
  214. #[allow(clippy::let_and_return)]
  215. fn len(&self) -> usize {
  216. let len = self.len.unwrap();
  217. let clone_first = len > 0 && self.clone_first;
  218. let clone_last = len > 1 && ((len & 1 == 0) ^ self.clone_first);
  219. let len = 2 * self.len.unwrap();
  220. let len = len + clone_first as usize;
  221. let len = len - (len > 0 && !clone_last) as usize;
  222. len
  223. }
  224. fn split_at(self, index: usize) -> (Self, Self) {
  225. let len = self.len.unwrap();
  226. debug_assert!(index <= len);
  227. // The left needs half of the items from the base producer, and the
  228. // other half will be our interspersed item. If we're not leading with
  229. // a cloned item, then we need to round up the base number of items,
  230. // otherwise round down.
  231. let base_index = (index + !self.clone_first as usize) / 2;
  232. let (left_base, right_base) = self.base.split_at(base_index);
  233. let left = IntersperseProducer {
  234. base: left_base,
  235. item: self.item.clone(),
  236. len: Some(index),
  237. clone_first: self.clone_first,
  238. };
  239. let right = IntersperseProducer {
  240. base: right_base,
  241. item: self.item,
  242. len: Some(len - index),
  243. clone_first: (index & 1 == 1) ^ self.clone_first,
  244. };
  245. (left, right)
  246. }
  247. fn fold_with<F>(self, base: F) -> F
  248. where
  249. F: Folder<Self::Item>,
  250. {
  251. let folder = IntersperseFolder {
  252. base,
  253. item: self.item,
  254. clone_first: self.clone_first,
  255. };
  256. self.base.fold_with(folder).base
  257. }
  258. }
  259. /* IntersperseIter */
  260. struct IntersperseIter<X, I> {
  261. base: Fuse<X>,
  262. item: I,
  263. item_front: Option<I>,
  264. item_back: Option<I>,
  265. clone_first: bool,
  266. clone_last: bool,
  267. }
  268. impl<X, I> IntersperseIter<X, I> {
  269. fn calc_len(&self, len: usize) -> usize {
  270. let mut len = 2 * len;
  271. if self.clone_first {
  272. len += 1
  273. }
  274. if len > 0 && !self.clone_last {
  275. len -= 1;
  276. }
  277. len
  278. }
  279. }
  280. impl<X, I> IntersperseIter<X, I>
  281. where
  282. X: Iterator<Item = I>,
  283. {
  284. fn get_next_front(&mut self) -> Option<I> {
  285. if let Some(item) = self.item_front.take() {
  286. return Some(item);
  287. }
  288. if let Some(item) = self.base.next() {
  289. return Some(item);
  290. }
  291. if let Some(item) = self.item_back.take() {
  292. return Some(item);
  293. }
  294. None
  295. }
  296. }
  297. impl<X, I> IntersperseIter<X, I>
  298. where
  299. X: DoubleEndedIterator<Item = I>,
  300. {
  301. fn get_next_back(&mut self) -> Option<I> {
  302. if let Some(item) = self.item_back.take() {
  303. return Some(item);
  304. }
  305. if let Some(item) = self.base.next_back() {
  306. return Some(item);
  307. }
  308. if let Some(item) = self.item_front.take() {
  309. return Some(item);
  310. }
  311. None
  312. }
  313. }
  314. impl<X, I> Iterator for IntersperseIter<X, I>
  315. where
  316. X: Iterator<Item = I>,
  317. I: Clone,
  318. {
  319. type Item = I;
  320. fn next(&mut self) -> Option<Self::Item> {
  321. if self.clone_first {
  322. self.clone_first = false;
  323. Some(self.item.clone())
  324. } else if let Some(next) = self.get_next_front() {
  325. if let Some(item) = self.get_next_front() {
  326. self.clone_first = true;
  327. self.item_front = Some(item);
  328. }
  329. Some(next)
  330. } else if self.clone_last {
  331. self.clone_last = false;
  332. Some(self.item.clone())
  333. } else {
  334. None
  335. }
  336. }
  337. fn size_hint(&self) -> (usize, Option<usize>) {
  338. let (beg, end) = self.base.size_hint();
  339. let beg = self.calc_len(beg);
  340. let end = end.map(|end| self.calc_len(end));
  341. (beg, end)
  342. }
  343. }
  344. impl<X, I> DoubleEndedIterator for IntersperseIter<X, I>
  345. where
  346. X: DoubleEndedIterator<Item = I>,
  347. I: Clone,
  348. {
  349. fn next_back(&mut self) -> Option<Self::Item> {
  350. if self.clone_last {
  351. self.clone_last = false;
  352. Some(self.item.clone())
  353. } else if let Some(next) = self.get_next_back() {
  354. if let Some(item) = self.get_next_back() {
  355. self.clone_last = true;
  356. self.item_back = Some(item);
  357. }
  358. Some(next)
  359. } else if self.clone_first {
  360. self.clone_first = false;
  361. Some(self.item.clone())
  362. } else {
  363. None
  364. }
  365. }
  366. }
  367. impl<X, I> ExactSizeIterator for IntersperseIter<X, I>
  368. where
  369. X: ExactSizeIterator<Item = I>,
  370. I: Clone,
  371. {
  372. fn len(&self) -> usize {
  373. self.calc_len(self.base.len())
  374. }
  375. }
  376. /* IntersperseConsumer */
  377. struct IntersperseConsumer<C, I> {
  378. base: C,
  379. item: I,
  380. clone_first: bool,
  381. }
  382. impl<C, I> WithSetup for IntersperseConsumer<C, I>
  383. where
  384. C: WithSetup,
  385. {
  386. fn setup(&self) -> Setup {
  387. self.base.setup()
  388. }
  389. }
  390. impl<C, I> Consumer<I> for IntersperseConsumer<C, I>
  391. where
  392. C: Consumer<I>,
  393. I: Clone + Send,
  394. {
  395. type Folder = IntersperseFolder<C::Folder, I>;
  396. type Reducer = C::Reducer;
  397. type Result = C::Result;
  398. fn split(self) -> (Self, Self, Self::Reducer) {
  399. let (left, right, reducer) = self.base.split();
  400. let left = Self {
  401. base: left,
  402. item: self.item.clone(),
  403. clone_first: self.clone_first,
  404. };
  405. let right = Self {
  406. base: right,
  407. item: self.item,
  408. clone_first: true,
  409. };
  410. (left, right, reducer)
  411. }
  412. fn split_at(self, index: usize) -> (Self, Self, Self::Reducer) {
  413. let base_index = index + index.saturating_sub(!self.clone_first as usize);
  414. let (left, right, reducer) = self.base.split_at(base_index);
  415. let left = Self {
  416. base: left,
  417. item: self.item.clone(),
  418. clone_first: self.clone_first,
  419. };
  420. let right = Self {
  421. base: right,
  422. item: self.item,
  423. clone_first: true,
  424. };
  425. (left, right, reducer)
  426. }
  427. fn into_folder(self) -> Self::Folder {
  428. IntersperseFolder {
  429. base: self.base.into_folder(),
  430. item: self.item,
  431. clone_first: self.clone_first,
  432. }
  433. }
  434. fn is_full(&self) -> bool {
  435. self.base.is_full()
  436. }
  437. }
  438. /* IntersperseFolder */
  439. struct IntersperseFolder<F, I> {
  440. base: F,
  441. item: I,
  442. clone_first: bool,
  443. }
  444. impl<F, I> Folder<I> for IntersperseFolder<F, I>
  445. where
  446. F: Folder<I>,
  447. I: Clone,
  448. {
  449. type Result = F::Result;
  450. fn consume(mut self, item: I) -> Self {
  451. if self.clone_first {
  452. self.base = self.base.consume(self.item.clone());
  453. } else {
  454. self.clone_first = true;
  455. }
  456. self.base = self.base.consume(item);
  457. self
  458. }
  459. fn consume_iter<X>(self, iter: X) -> Self
  460. where
  461. X: IntoIterator<Item = I>,
  462. {
  463. let mut clone_first = self.clone_first;
  464. let item = self.item;
  465. let iter = iter.into_iter().flat_map(|x| {
  466. let first = if clone_first {
  467. Some(item.clone())
  468. } else {
  469. clone_first = true;
  470. None
  471. };
  472. first.into_iter().chain(once(x))
  473. });
  474. let base = self.base.consume_iter(iter);
  475. IntersperseFolder {
  476. base,
  477. item,
  478. clone_first,
  479. }
  480. }
  481. fn complete(self) -> Self::Result {
  482. self.base.complete()
  483. }
  484. fn is_full(&self) -> bool {
  485. self.base.is_full()
  486. }
  487. }