1 /** 2 Copyright: Copyright Thomas Stuart Bockman 2015 3 License: <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>. 4 Authors: Thomas Stuart Bockman 5 */ 6 7 module checkedint.traits; 8 public import checkedint : isSafeInt, isSmartInt, isCheckedInt, hasBitOps, isThrowingCInt, BasicScalar; 9 10 private template isEx(alias Predicate) { 11 template isEx(T) { 12 static if(isCheckedInt!T) 13 enum isEx = Predicate!(BasicScalar!T); 14 else 15 enum isEx = Predicate!T; 16 } 17 } 18 public import future.traits : 19 isBasicScalar = isScalarType, 20 isBasicNum = isNumeric, 21 isFloatingPoint, 22 isBasicFixed = isFixedPoint, 23 isBasicInt = isIntegral, 24 isSomeChar, 25 isBoolean, 26 isBasicSigned = isSigned, 27 isBasicUnsigned = isUnsigned; 28 alias 29 isScalarType = isEx!isBasicScalar, 30 isNumeric = isEx!isBasicNum, 31 isFixedPoint = isEx!isBasicFixed, 32 isIntegral = isEx!isBasicInt, 33 isSigned = isEx!isBasicSigned, 34 isUnsigned = isEx!isBasicUnsigned; 35 36 template mostNegative(T) 37 if(isFixedPoint!T) 38 { 39 static if(isFloatingPoint!T) 40 enum mostNegative = -T.max; 41 else 42 enum mostNegative = T.min; 43 } 44 45 private template TransEx(alias TypeTransform) { 46 template TransEx(T) { 47 static if(isCheckedInt!T) { 48 alias TTB = TypeTransform!(CopyTypeQualifiers!(T, BasicScalar!T)); 49 alias CheckedInt = Select!(isSmartInt!T, SmartInt, SafeInt); 50 alias TransEx = CopyTypeQualifiers!(TTB, CheckedInt!(TTB, TemplateArgsOf!T[1])); 51 } else 52 alias TransEx = TypeTransform!T; 53 } 54 } 55 import future.traits : 56 BasicSigned = Signed, 57 BasicUnsigned = Unsigned, 58 BasicPromoted = Promoted; 59 alias Signed = TransEx!BasicSigned; 60 alias Unsigned = TransEx!BasicUnsigned; 61 public import future.traits : IntFromChar; 62 alias Promoted = TransEx!BasicPromoted;