reinterpret array

Dominikus Dittes Scherkl via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jan 14 04:56:13 PST 2015


On Tuesday, 13 January 2015 at 23:36:51 UTC, Artur Skawina via 
Digitalmars-d-learn wrote:
> It's neat, but the real problems with it are:
> 1) obfuscation - it hides those trivial bit ops behind layers of
> functions and operator overloads, which everyone reading the
> code must then figure out;

Ok, but this is the case with any function - and this modulo stuff
is easy but not so trivial that a function is not justified.

> 2) safety - `a.bit` could potentially outlive `a`; D does not
> handle object lifetimes, so there's no 100% safe way to prevent
> such bugs.
This can be addressed with the newer proposed mechanisms and a 
little
more information-hiding (generator function):

>
> Hence you probably don't actually want to use this.
> [...]
I had something pretty close to that in mind:

@property inout bit(T)(inout ref T a)
    pure @safe @nogc nothrow
    if(isUnsigned!T || (isArray!T && isUnsigned!T[0]))
{
    struct BitArray(T)
    {
    private:
       enum s = std.bitop.bsr(T.sizeof)+2;
       enum m = (1<<s)-1;
       inout T* r;
       size_t len;
    public:
       this(inout T* p, size_t d) { r = p; len = d<<s; }

       bool opIndex(size_t idx) const // get bit
       {
          return (idx < len) ? (r[idx>>s]>>(idx & m))&1u : false;
       }

       static if(isMutable!T)
       {
          void opIndexAssign(bool b, size_t idx) // set or clear 
bit
          {
             if(idx < len)
             {
                if(b) r[idx>>s] |= 1u<<(idx & m);
                else r[idx>>s] &= ~(cast(T)1<<(idx & m));
             }
          }
       }
    }
    static if(isUnsigned!T)
       return BitArray(&a, 1);
    else
       return BitArray(&a[0], a.length);
}



More information about the Digitalmars-d-learn mailing list