Advertisement
Guest User

@property wrapper in D

a guest
Jul 6th, 2016
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 1.07 KB | None | 0 0
  1. import std.stdio;
  2.  
  3. struct Wrapper(O, string getter, string setter) {
  4.     auto get() {
  5.         mixin("return obj."~getter~";");
  6.     }
  7.  
  8.     Wrapper opAssign(T)(T value) {
  9.         mixin("obj."~setter~"(value);");
  10.         return this;
  11.     }
  12.  
  13.     Wrapper opOpAssign(string op, T)(T value) {
  14.         mixin("obj."~setter~"(obj."~getter~op~"value);");
  15.         return this;
  16.     }
  17.  
  18.     private O* obj;
  19.    
  20.     alias get this;
  21. }
  22. mixin template InjectWrapper(string name, string getter, string setter)
  23. {
  24.     mixin(
  25.     "@property auto "~name~"(this T)() {"~
  26.     "   return Wrapper!(T, getter, setter)(&this);"~
  27.     "}");
  28.     mixin(
  29.     "@property auto "~name~"(this T, U)(U value) {"~
  30.     "   return Wrapper!(T, getter, setter)(&this) = value;"~
  31.     "}");
  32. }
  33.  
  34. struct Foo {
  35.     mixin InjectWrapper!("value","getValue", "setValue");
  36. private:
  37.     int value_;
  38.  
  39.     int getValue() const {
  40.         return value_;
  41.     }
  42.  
  43.     void setValue(int value) {
  44.         value_ = value;
  45.     }
  46. }
  47.  
  48. int main(string[] args) {
  49.     Foo foo;
  50.     foo.value = 20;
  51.     writeln(foo.value_);
  52.  
  53.     foo.value += 15;
  54.     writeln(foo.value_);
  55.  
  56.  
  57.     foo.value--;
  58.     writeln(foo.value_);
  59.     return 0;
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement