Problem with object understanding and datatypes

Namal sotis22 at mail.ru
Fri May 24 13:19:58 PDT 2013


So the task is to write a struct  object for the saturation 
arithmetic. I tried first to write it for the unsigned Types:

struct Saturated(T)
	if (isIntegral!T)
{
	static assert (isUnsigned!T || isSigned!T);

	@property
	{
		static Saturated min() { return Saturated(T.min); }
		static Saturated max() { return Saturated(T.max); }
		static Saturated init() { return Saturated(T.init); }
	}
	Saturated opBinary(string op)(const Saturated rhs) const
		if (op == "+" || op == "-" || op == "/")
	{
		static if (isUnsigned!T){
			if(rhs.max - rhs._value < _value)
				return rhs.max;
			if(rhs._value > _value)
				return rhs.min;
			return Saturated(cast(T)(mixin("_value " ~ op ~ " 
rhs._value")));
		}
		else{
		return Saturated(cast(T)(mixin("_value " ~ op ~ " 
rhs._value")));
		}
	}

	string toString() const
	{
		import std.conv;
		return to!string(_value);
	}

private:
	T _value;
}

unittest
{
	alias subyte = Saturated!ubyte;
	assert(subyte(254) + subyte(2) == subyte(255));
	assert(subyte(100) + subyte(2) == subyte(102));
	assert(subyte(10) - subyte(11) == subyte(0));
	assert(subyte(128) - subyte(129) == subyte(0));
}

But the last test does not pass. Why does the minus operation is 
treated in signed datatype, while + is unsigned? Note that I do 
not know much about templates or methods. So pls execuse me if I 
do a major mistake here.


More information about the Digitalmars-d-learn mailing list