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?