'int' is enough for 'length' to migrate code from x86 to x64

FrankLike via Digitalmars-d digitalmars-d at puremagic.com
Mon Nov 24 21:57:40 PST 2014


On Monday, 24 November 2014 at 19:06:35 UTC, Matthias Bentrup 
wrote:
> Agreed, though I don't like the explosion of new operators. I'd
> prefer the C# syntax like check(<expression>), wrap(expression),
> saturate(expression).

You maybe like this:
-------------------small test 1--------------------------
import std.stdio;

template  subuint(T1,T2){
auto subuint(T1 x, T2 y, ref bool overflow)
{
if(is(T1 == uint) && is(T2==uint))
	{
		if (x < y)
		{
         	return cast(int)(x -y);
		}
     	else
     	{
     		return x - y;
     	}
	}
	else if(is(T1 == uint) && is(T2==int))
	{writeln("enter here1");

		if (x < y)
		{ writeln("enter here2");
			return cast(int)(x -y);
		}
		else
		{ writeln("enter here3");
			return x - y;
		}
	}
	else if(is(T1 == int) && is(T2==uint))
	{
		if (x < y)
		{
         	return cast(int)(x -y);
		}
     	else
     	{
     		return x - y;
     	}
	}
	else if(is(T1 == int) && is(T2==int))
	{
		return x - y;
	}
   }
}

unittest
{
     bool overflow;
     assert(subuint(3, 2, overflow) == 1);
    assert(!overflow);
     assert(subuint(3, 4, overflow) == -1);

     assert(!overflow);
     assert(subuint(uint.max, 1, overflow) == uint.max - 1);
     writeln("typeid = ",typeid(subuint(uint.max, 1, overflow)));
     assert(!overflow);
     assert(subuint(1, 1, overflow) == uint.min);
     assert(!overflow);
     assert(subuint(0, 1, overflow) == -1);
     assert(!overflow);
     assert(subuint(uint.max - 1, uint.max, overflow) == -1);
     assert(!overflow);
     assert(subuint(0, 0, overflow) == 0);
     assert(!overflow);

	assert(subuint(3, -2, overflow) == 5);
     assert(!overflow);
     assert(subuint(uint.max, -1, overflow) == uint.max + 1);

     assert(!overflow);
     assert(subuint(1, -1, overflow) == 2);
     assert(!overflow);
     assert(subuint(0, -1, overflow) == 1);
     assert(!overflow);
     assert(subuint(uint.max - 1, int.max, overflow) == int.max);
     assert(!overflow);
     assert(subuint(0, 0, overflow) == 0);
     assert(!overflow);
     assert(subuint(-2, 1, overflow) == -3);
     assert(!overflow);
}


void main()
{
	 uint a= 3;
	 int b = 4;
	 int c =2;
	  writeln("c -a =",c-a);
	 writeln("a -b =",a-b);
	  writeln("----------------");
	bool overflow;
	 writeln("typeid = ",typeid(subuint(a, b, overflow)),", 
a-b=",subuint(a, b, overflow));
	writeln("ok");
}

---------------here is a simple ,but it's 
error--------------------------
import std.stdio;

template  subuint(T1,T2){
auto subuint(T1 x, T2 y, ref bool overflow)
{
	if(is(T1 == int) && is(T2==int))
	{
		return x - y;
	}
	else if((is(T1 == uint) && is(T2==int)) | (is(T1 == uint) && 
is(T2==uint)) | (is(T1 == int) && is(T2==uint)))
	{
		if (x < y)
		{
         	return cast(int)(x -y);
		}
     	else
     	{
     		return x - y;
     	}
	}
   }
}


void main()
{
	 uint a= 3;
	 int b = 4;
	 int c =2;
	  writeln("c -a =",c-a);
	 writeln("a -b =",a-b);
	  writeln("----------------");
	bool overflow;
	 writeln("typeid = ",typeid(subuint(a, b, overflow)),", 
a-b=",subuint(a, b, overflow));
	writeln("ok");
}



More information about the Digitalmars-d mailing list