Guest User

Untitled

a guest
Aug 20th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.97 KB | None | 0 0
  1. use std::ops::{Deref, DerefMut};
  2.  
  3. // POOL
  4.  
  5. trait Pool {
  6. type Item: ?Sized;
  7. type Wrapper: DerefMut<Target=Self::Item>;
  8.  
  9. fn get(&self) -> Self::Wrapper;
  10. }
  11.  
  12. // DEREF POOL
  13.  
  14. struct DerefPool<Inner>(Inner);
  15. struct DerefWrapper<Wrapper>(Wrapper);
  16.  
  17. impl <Wrapper> Deref for DerefWrapper<Wrapper> where
  18. Wrapper: Deref,
  19. Wrapper::Target: Deref,
  20. {
  21. type Target = <<Wrapper as Deref>::Target as Deref>::Target;
  22.  
  23. fn deref(&self) -> &Self::Target {
  24. &**self.0
  25. }
  26. }
  27.  
  28. impl <Wrapper> DerefMut for DerefWrapper<Wrapper> where
  29. Wrapper: DerefMut,
  30. Wrapper::Target: DerefMut,
  31. {
  32. fn deref_mut(&mut self) -> &mut Self::Target {
  33. &mut **self.0
  34. }
  35. }
  36.  
  37. impl <Inner> Pool for DerefPool<Inner> where
  38. Inner: Pool,
  39. Inner::Item: DerefMut,
  40. {
  41. type Item = <<Inner as Pool>::Item as Deref>::Target;
  42. type Wrapper = DerefWrapper<Inner::Wrapper>;
  43.  
  44. fn get(&self) -> Self::Wrapper {
  45. DerefWrapper(self.0.get())
  46. }
  47. }
  48.  
  49.  
  50. fn main() {
  51.  
  52. }
Add Comment
Please, Sign In to add comment