Async Entity Component System based on the ideas of specs (https://github.com/amethyst/specs)
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

276 rindas
5.9 KiB

  1. use crate::{
  2. Consumer, Executor, Folder, IndexedParallelIterator, IndexedProducer, IndexedProducerCallback,
  3. ParallelIterator, Producer, ProducerCallback, Reducer,
  4. };
  5. /* Copied */
  6. pub struct Copied<X> {
  7. base: X,
  8. }
  9. impl<X> Copied<X> {
  10. pub fn new(base: X) -> Self {
  11. Self { base }
  12. }
  13. }
  14. impl<'a, X, T> ParallelIterator<'a> for Copied<X>
  15. where
  16. X: ParallelIterator<'a, Item = &'a T>,
  17. T: Copy + Send + Sync + 'a,
  18. {
  19. type Item = T;
  20. fn drive<E, C, D, R>(self, executor: E, consumer: C) -> E::Result
  21. where
  22. E: Executor<'a, D>,
  23. C: Consumer<Self::Item, Result = D, Reducer = R> + 'a,
  24. D: Send + 'a,
  25. R: Reducer<D> + Send + 'a,
  26. {
  27. self.base.drive(executor, CopiedConsumer { base: consumer })
  28. }
  29. fn with_producer<CB>(self, callback: CB) -> CB::Output
  30. where
  31. CB: ProducerCallback<'a, Self::Item>,
  32. {
  33. self.base.with_producer(CopiedCallback { base: callback })
  34. }
  35. fn len_hint_opt(&self) -> Option<usize> {
  36. self.base.len_hint_opt()
  37. }
  38. }
  39. impl<'a, X, T> IndexedParallelIterator<'a> for Copied<X>
  40. where
  41. X: IndexedParallelIterator<'a, Item = &'a T>,
  42. T: Copy + Send + Sync + 'a,
  43. {
  44. fn drive_indexed<E, C, D, R>(self, executor: E, consumer: C) -> E::Result
  45. where
  46. E: Executor<'a, D>,
  47. C: Consumer<Self::Item, Result = D, Reducer = R> + 'a,
  48. D: Send + 'a,
  49. R: Reducer<D> + Send + 'a,
  50. {
  51. self.base
  52. .drive_indexed(executor, CopiedConsumer { base: consumer })
  53. }
  54. fn with_producer_indexed<CB>(self, callback: CB) -> CB::Output
  55. where
  56. CB: IndexedProducerCallback<'a, Self::Item>,
  57. {
  58. self.base
  59. .with_producer_indexed(CopiedCallback { base: callback })
  60. }
  61. fn len_hint(&self) -> usize {
  62. self.base.len_hint()
  63. }
  64. }
  65. /* CopiedConsumer */
  66. struct CopiedConsumer<C> {
  67. base: C,
  68. }
  69. impl<'a, T, C> Consumer<&'a T> for CopiedConsumer<C>
  70. where
  71. T: Copy,
  72. C: Consumer<T>,
  73. {
  74. type Folder = CopiedFolder<C::Folder>;
  75. type Reducer = C::Reducer;
  76. type Result = C::Result;
  77. fn split(self) -> (Self, Self, Self::Reducer) {
  78. let (left, right, reducer) = self.base.split();
  79. let left = CopiedConsumer { base: left };
  80. let right = CopiedConsumer { base: right };
  81. (left, right, reducer)
  82. }
  83. fn split_at(self, index: usize) -> (Self, Self, Self::Reducer) {
  84. let (left, right, reducer) = self.base.split_at(index);
  85. let left = CopiedConsumer { base: left };
  86. let right = CopiedConsumer { base: right };
  87. (left, right, reducer)
  88. }
  89. fn into_folder(self) -> Self::Folder {
  90. CopiedFolder {
  91. base: self.base.into_folder(),
  92. }
  93. }
  94. fn is_full(&self) -> bool {
  95. self.base.is_full()
  96. }
  97. }
  98. /* CopiedFolder */
  99. struct CopiedFolder<F> {
  100. base: F,
  101. }
  102. impl<'a, T, F> Folder<&'a T> for CopiedFolder<F>
  103. where
  104. T: Copy + 'a,
  105. F: Folder<T>,
  106. {
  107. type Result = F::Result;
  108. fn consume(mut self, item: &'a T) -> Self {
  109. self.base = self.base.consume(*item);
  110. self
  111. }
  112. fn consume_iter<X>(mut self, iter: X) -> Self
  113. where
  114. X: IntoIterator<Item = &'a T>,
  115. {
  116. self.base = self.base.consume_iter(iter.into_iter().copied());
  117. self
  118. }
  119. fn complete(self) -> Self::Result {
  120. self.base.complete()
  121. }
  122. fn is_full(&self) -> bool {
  123. self.base.is_full()
  124. }
  125. }
  126. /* CopiedCallback */
  127. struct CopiedCallback<CB> {
  128. base: CB,
  129. }
  130. impl<'a, T, CB> ProducerCallback<'a, &'a T> for CopiedCallback<CB>
  131. where
  132. T: Copy + 'a,
  133. CB: ProducerCallback<'a, T>,
  134. {
  135. type Output = CB::Output;
  136. fn callback<P>(self, producer: P) -> Self::Output
  137. where
  138. P: Producer<Item = &'a T> + 'a,
  139. {
  140. self.base.callback(CopiedProducer { base: producer })
  141. }
  142. }
  143. impl<'a, T, CB> IndexedProducerCallback<'a, &'a T> for CopiedCallback<CB>
  144. where
  145. T: Copy + 'a,
  146. CB: IndexedProducerCallback<'a, T>,
  147. {
  148. type Output = CB::Output;
  149. fn callback<P>(self, producer: P) -> Self::Output
  150. where
  151. P: IndexedProducer<Item = &'a T> + 'a,
  152. {
  153. self.base.callback(CopiedProducer { base: producer })
  154. }
  155. }
  156. /* CopiedProducer */
  157. struct CopiedProducer<P> {
  158. base: P,
  159. }
  160. impl<'a, T, P> Producer for CopiedProducer<P>
  161. where
  162. T: Copy + 'a,
  163. P: Producer<Item = &'a T>,
  164. {
  165. type Item = T;
  166. type IntoIter = std::iter::Copied<P::IntoIter>;
  167. fn into_iter(self) -> Self::IntoIter {
  168. self.base.into_iter().copied()
  169. }
  170. fn split(self) -> (Self, Option<Self>) {
  171. let (left, right) = self.base.split();
  172. let left = CopiedProducer { base: left };
  173. let right = right.map(|right| CopiedProducer { base: right });
  174. (left, right)
  175. }
  176. fn splits(&self) -> Option<usize> {
  177. self.base.splits()
  178. }
  179. fn fold_with<F>(self, folder: F) -> F
  180. where
  181. F: Folder<Self::Item>,
  182. {
  183. self.base.fold_with(CopiedFolder { base: folder }).base
  184. }
  185. }
  186. impl<'a, T, P> IndexedProducer for CopiedProducer<P>
  187. where
  188. T: Copy + 'a,
  189. P: IndexedProducer<Item = &'a T>,
  190. {
  191. type Item = T;
  192. type IntoIter = std::iter::Copied<P::IntoIter>;
  193. fn into_iter(self) -> Self::IntoIter {
  194. self.base.into_iter().copied()
  195. }
  196. fn len(&self) -> usize {
  197. self.base.len()
  198. }
  199. fn split_at(self, index: usize) -> (Self, Self) {
  200. let (left, right) = self.base.split_at(index);
  201. let left = CopiedProducer { base: left };
  202. let right = CopiedProducer { base: right };
  203. (left, right)
  204. }
  205. fn splits(&self) -> Option<usize> {
  206. self.base.splits()
  207. }
  208. fn min_len(&self) -> Option<usize> {
  209. self.base.min_len()
  210. }
  211. fn max_len(&self) -> Option<usize> {
  212. self.base.max_len()
  213. }
  214. fn fold_with<F>(self, folder: F) -> F
  215. where
  216. F: Folder<Self::Item>,
  217. {
  218. self.base.fold_with(CopiedFolder { base: folder }).base
  219. }
  220. }