Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. #[derive(Clone)]
  2. struct NotQuiteStatic<'not_quite_static>(&'not_quite_static u32);
  3.  
  4. struct IteratorWithRef<'creates_iterator, 'not_quite_static>
  5. where
  6. 'not_quite_static: 'creates_iterator,
  7. {
  8. reference: &'creates_iterator CreatesIteratorImpl<'not_quite_static>,
  9. underlying: std::vec::IntoIter<NotQuiteStatic<'not_quite_static>>,
  10. }
  11. impl<'creates_iterator, 'not_quite_static> Iterator
  12. for IteratorWithRef<'creates_iterator, 'not_quite_static>
  13. where
  14. 'not_quite_static: 'creates_iterator,
  15. {
  16. type Item = NotQuiteStatic<'not_quite_static>;
  17.  
  18. fn next(&mut self) -> Option<Self::Item> {
  19. self.underlying.next()
  20. }
  21. }
  22.  
  23.  
  24. trait CreatesIterator<'creates_iterator, 'not_quite_static>
  25. where
  26. 'not_quite_static: 'creates_iterator,
  27. Self::Eventual: Iterator + 'creates_iterator,
  28. <Self::Eventual as Iterator>::Item: 'not_quite_static,
  29. {
  30. type Eventual;
  31. fn iterate(&'creates_iterator self) -> Self::Eventual;
  32. }
  33.  
  34. struct CreatesIteratorImpl<'not_quite_static>(
  35. Vec<NotQuiteStatic<'not_quite_static>>
  36. );
  37.  
  38. impl<'creates_iterator, 'not_quite_static> CreatesIterator<'creates_iterator,
  39. 'not_quite_static>
  40. for CreatesIteratorImpl<'not_quite_static>
  41. where
  42. 'not_quite_static: 'creates_iterator,
  43. {
  44. type Eventual = Box<dyn Iterator<Item = NotQuiteStatic<'not_quite_static>>
  45. + 'creates_iterator>;
  46. fn iterate(&'creates_iterator self) -> Self::Eventual {
  47. Box::new(
  48. IteratorWithRef {
  49. reference: self,
  50. underlying: self.0.clone().into_iter(),
  51. }
  52. )
  53. as Self::Eventual
  54. }
  55. }
  56.  
  57. type LongTraitObjType<'creates_iterator, 'not_quite_static: 'creates_iterator> =
  58. Box<
  59. dyn CreatesIterator<
  60. 'creates_iterator,
  61. 'not_quite_static,
  62. Eventual =
  63. Box<
  64. dyn Iterator<Item = NotQuiteStatic<'not_quite_static>>
  65. + 'creates_iterator
  66. >
  67. >
  68. + 'not_quite_static
  69. >;
  70.  
  71. fn main() {
  72. let not_quite_static = 1;
  73.  
  74. // Works: concrete implementation:
  75. {
  76. let creates_iterator_impl =
  77. Box::new(
  78. CreatesIteratorImpl(
  79. vec![
  80. NotQuiteStatic(&not_quite_static)
  81. ]
  82. )
  83. );
  84. let _ = creates_iterator_impl.iterate().count();
  85. }
  86.  
  87. // Doesn't work: same as above, but cast to a trait object.
  88. {
  89. let creates_iterator_dyn: LongTraitObjType =
  90. Box::new(
  91. CreatesIteratorImpl(
  92. vec![
  93. NotQuiteStatic(&not_quite_static)
  94. ]
  95. )
  96. );
  97. let _ = creates_iterator_dyn.iterate().count();
  98. }
  99.  
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement