On Tuesday, 15 July 2014 at 20:45:20 UTC, Johannes Pfau wrote:
Am Tue, 15 Jul 2014 12:48:21 -0700
schrieb Walter Bright <[email protected]>:
3. if you really hate peek/poke calls appearing in the code,
you can
use UFCS to make them look like variables
But you cant do REGISTER.peek() |= 0b1;
You can create a function which returns a struct that wraps your
desired read-modify-write semantics, e.g.:
auto myvolatile(size_t* addr)
{
static struct VolatileWrapper
{
size_t* addr;
// read-modify-write
auto opOpAssign(string op)(size_t rhs) { /*...*/ }
// write
auto opAssign(size_t rhs) { addr.poke(rhs); return this; }
// read
auto rval() { return addr.peek(); }
alias rval this;
}
return VolatileWrapper(addr);
}
REGISTER.myvolatile() |= 0b1;
Taking it further, I think you could implement something that
looked like this:
enum : VolatileWrapper
{
TIMER0 = VolatileWrapper(REGISTER),
// etc
}
Don't get me wrong, I'm in favor of volatile, it's just that that
counter-argument isn't extremely convincing.