On Wednesday, 12 December 2012 at 08:23:48 UTC, Simen Kjaeraas wrote:
On 2012-09-12 00:12, js.mdnq <[email protected]> wrote:

struct bbyte {
byte value;
...
}

bbyte a; bbyte b;

b = a + b; // uses bbyte's operators and casts to do the computation and assignment but then returns a bbyte instead of an int.

You should have no problems implicitly converting bbyte to built in types or built in types to bbyte.

Not entirely true. Converting from bbyte to built-in works, but these
are to my knowledge currently impossible:

void foo(bbyte b);
byte b;

foo(b); // No conversion.


bbyte bar( ) {
    byte b;
    return b;
}


What I mean is that you use bbyte for all your arithmetic operations and computations. When you need to convert it to a byte(hopefully at the end of the process), you can use an implicit cast.


struct bbyte {
        byte b;
        byte opCast(bbyte a) { return a.b; }
        alias b this;


        bbyte bar(byte b) { bbyte q; q.b = b; return q; }

        byte foo(bbyte b) {  return b.b; }
}

byte bar2(byte b) { return b; }



int main(string[] argv)
{

        bbyte bb;
        byte b;

        bb.foo(bb);             
        bb.bar(b);
        b = bb;
        bb = b;
}

the point is no explicit op casts are required. Essentially a bbyte is a byte. One can overload all the operators that are needed for bit manipulation, even using asm if necessary and one should be able to hide most of the details. `alias this` might not stop some of the value propagation in some cases. If one only converts to the built-in types when actually needed(when passing to and from routines that use them) but uses bbyte for all bit manipulations it shouldn't be much of a problem(if at all).


The idea is that conversion from bbyte to byte does not induce an expansion to int, only the arithmetic operations. Hence, overriding them can stop that.

but something like

byte b1;
byte b2;
bbyte b3 = b1 + b2;

is computing the arithmetic operation from byte(which converts to an int). This is why I say one must use bbytes for all arithmetic operations to solve that problem. (or write a cast for int, if you just don't want to deal with it but don't mind the expansion)

But this works:

byte b1;
byte b2;
bbyte b3;
b3 = b1 + b2;

if one has bbyte opAssign(int i) { this.b = cast(byte)i; return this; } in bbyte.

which avoids having to do b3 = cast(byte)(b1 + b2) which I think was what the original post was about.

Reply via email to