Guest User

Untitled

a guest
Jan 17th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.04 KB | None | 0 0
  1. use std::marker::PhantomData;
  2.  
  3. struct PA;
  4. struct PB;
  5. struct PC;
  6.  
  7. struct P; // Present Tag
  8. struct NP; // Non Present Tag
  9.  
  10. struct Parts<A, B, C> {
  11. _a: PhantomData<A>,
  12. _b: PhantomData<B>,
  13. _c: PhantomData<C>,
  14. }
  15.  
  16. pub fn new() -> Parts<P, P, P> {
  17. create()
  18. }
  19.  
  20. fn create<A, B, C>() -> Parts<A, B, C> {
  21. Parts {
  22. _a: PhantomData,
  23. _b: PhantomData,
  24. _c: PhantomData,
  25. }
  26. }
  27.  
  28. impl<B,C> Parts<P, B, C> {
  29. pub fn pa(self) -> (PA, Parts<NP, B, C>) {
  30. (PA, create())
  31. }
  32. }
  33.  
  34. impl<A,C> Parts<A, P, C> {
  35. pub fn pb(self) -> (PB, Parts<A, NP, C>) {
  36. (PB, create())
  37. }
  38. }
  39.  
  40. impl<A, B> Parts<A, B, P> {
  41. pub fn pc(self) -> (PC, Parts<A, B, NP>) {
  42. (PC, create())
  43. }
  44. }
  45.  
  46. struct Led {
  47. p: PB,
  48. }
  49.  
  50. impl Led {
  51. pub fn new<A, C>(parts: Parts<A, P, C>) -> (Self, Parts<A, NP, C>) {
  52. let (pb, parts) = parts.pb();
  53. (Led{ p: pb}, parts)
  54. }
  55. }
  56.  
  57. fn main() {
  58. let parts = new();
  59.  
  60. let (led, parts) = Led::new(parts);
  61.  
  62. // Second one fails
  63. let (led, parts) = Led::new(parts);
  64. }
Add Comment
Please, Sign In to add comment