diff options
| author | Adrian Kummerlaender | 2015-01-15 20:06:41 +0100 | 
|---|---|---|
| committer | Adrian Kummerlaender | 2015-01-15 20:06:41 +0100 | 
| commit | f63675d062156627dc23aa74d51356a7ab77c914 (patch) | |
| tree | bb4e7923ee197d7172616356dd13d1d21496f505 /src | |
| parent | 5415ecfbdc5078826e09cf6525ff5c0289cedfd4 (diff) | |
| download | TypeAsValue-f63675d062156627dc23aa74d51356a7ab77c914.tar TypeAsValue-f63675d062156627dc23aa74d51356a7ab77c914.tar.gz TypeAsValue-f63675d062156627dc23aa74d51356a7ab77c914.tar.bz2 TypeAsValue-f63675d062156627dc23aa74d51356a7ab77c914.tar.lz TypeAsValue-f63675d062156627dc23aa74d51356a7ab77c914.tar.xz TypeAsValue-f63675d062156627dc23aa74d51356a7ab77c914.tar.zst TypeAsValue-f63675d062156627dc23aa74d51356a7ab77c914.zip | |
Completed basic math operators and fixed their result type
* the result type now depends on the `decltype` of the performed operation
Diffstat (limited to 'src')
| -rw-r--r-- | src/operation.h | 42 | ||||
| -rw-r--r-- | src/type.h | 9 | 
2 files changed, 49 insertions, 2 deletions
| diff --git a/src/operation.h b/src/operation.h index c906b55..66dbc41 100644 --- a/src/operation.h +++ b/src/operation.h @@ -15,7 +15,10 @@ struct add {  		"only values of the same type may be added"  	); -	typedef Int<X::value + Y::value> type; +	typedef std::integral_constant< +		decltype(X::value + Y::value), +		X::value + Y::value +	> type;  };  template < @@ -28,7 +31,42 @@ struct substract {  		"only values of the same type may be substracted"  	); -	typedef Int<X::value - Y::value> type; +	typedef std::integral_constant< +		decltype(X::value - Y::value), +		X::value - Y::value +	> type; +}; + +template < +	typename X, +	typename Y +> +struct multiply { +	static_assert( +		equal_type<X, Y>::value, +		"only values of the same type may be multiplied" +	); + +	typedef std::integral_constant< +		decltype(X::value * Y::value), +		X::value * Y::value +	> type; +}; + +template < +	typename X, +	typename Y +> +struct divide { +	static_assert( +		equal_type<X, Y>::value, +		"only values of the same type may be divided" +	); + +	typedef std::integral_constant< +		decltype(X::value / Y::value), +		X::value / Y::value +	> type;  };  } @@ -20,6 +20,15 @@ using equal_type = typename std::integral_constant<  	std::is_same<typename X::value_type, typename Y::value_type>::value  >::type; +template < +	typename X, +	typename Y +> +using equal_value = typename std::integral_constant< +	bool, +	X::value == Y::value +>::type; +  }  #endif  // TYPEASVALUE_SRC_TYPE_H_ | 
