Guest User

Untitled

a guest
Jun 17th, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.88 KB | None | 0 0
  1. #![allow(unused)]
  2.  
  3. trait WriterKind {
  4. type Written;
  5. }
  6.  
  7. struct Writer<K: WriterKind> {
  8. m: std::marker::PhantomData<fn(&K::Written)>,
  9. }
  10.  
  11. struct BasicWriter<T>(std::marker::PhantomData<T>);
  12.  
  13. impl<T> WriterKind for BasicWriter<T> {
  14. type Written = T;
  15. }
  16.  
  17. impl<T> Writer<BasicWriter<T>> {
  18. fn write(&mut self, val: &T) {} // basic implementation (accepts only exactly &T)
  19. }
  20.  
  21. struct RecordWriter;
  22.  
  23. impl WriterKind for RecordWriter {
  24. type Written = Record<'static>;
  25. }
  26.  
  27. impl Writer<RecordWriter> {
  28. fn write(&mut self, val: &Record) {} // custom implementation (accepts any &Record<'?>)
  29. }
  30.  
  31. struct Record<'a> {
  32. x: &'a i32,
  33. }
  34.  
  35. // Don't want a lifetime parameter on `Logger`
  36. struct Logger {
  37. rec_writer: Writer<RecordWriter>,
  38. }
  39.  
  40. impl Logger {
  41. fn write_record(&mut self) {
  42. let x = 5;
  43. let rec = Record { x: &x };
  44. self.rec_writer.write(&rec);
  45. }
  46. }
  47.  
  48. fn main() {}
Add Comment
Please, Sign In to add comment