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;