Am Sat, 16 Aug 2014 11:58:49 +0200
schrieb "Artur Skawina via D.gnu" <d.gnu@puremagic.com>:

> On 08/16/14 09:33, Johannes Pfau via D.gnu wrote:
> > https://github.com/D-Programming-GDC/GDC/pull/82
> 
> [Only noticed this accidentally; using a mailing list
> instead of some web forum would increase visibility...]
> 
> >  enum var = Volatile!(T,addr)(): doesn't allow |= on enum literals,
> > even if the type implements opAssign as there's no this pointer
> 
>    T volatile_load(T)(ref T v) nothrow {
>       asm { "" : "+m" v; }
>       T res = v;
>       asm { "" : "+g" res; }
>       return res;
>    }
> 
>    void volatile_store(T)(ref T v, const T a) nothrow {
>       asm { "" : : "m" v; }
>       v = a;
>       asm { "" : "+m" v; }
>    }
>       
>    struct Volatile(T, alias /* T* */ A) {
>        void opOpAssign(string OP)(const T rhs) nothrow {
>            auto v = volatile_load(*A);
>            mixin("v " ~ OP ~ "= rhs;");
>            volatile_store(*A, v);
>        }
>    }
> 
>    enum TimerB = Volatile!(uint, cast(uint*)0xDEADBEEF)();
> 
>    void main() {
>       TimerB |= 0b1;
>       TimerB += 1;
>    }

That's a good start. Can you also get unary operators working?
e.g
TimerB++;

Do you think it's possible to combine this with the other solution you
posted for struct fields? Or do we need separate Volatile!T and
VolatileField!T types?

Reply via email to