Update compiler, remove deprecated modules
This commit is contained in:
		| @@ -7,11 +7,11 @@ os: | |||||||
| language: d | language: d | ||||||
|  |  | ||||||
| d: | d: | ||||||
| - dmd-2.087.1 | - dmd-2.091.1 | ||||||
|  |  | ||||||
| env: | env: | ||||||
|   global: |   global: | ||||||
|   - LATEST=2.087.1 |   - LATEST=2.091.1 | ||||||
|  |  | ||||||
|   matrix: |   matrix: | ||||||
|   - ARCH=x86_64 |   - ARCH=x86_64 | ||||||
|   | |||||||
| @@ -174,7 +174,7 @@ parameter is used) | |||||||
|  |  | ||||||
| | DMD     | GCC       | | | DMD     | GCC       | | ||||||
| |:-------:|:---------:| | |:-------:|:---------:| | ||||||
| | 2.087.1 | gdc trunk | | | 2.091.1 | gdc trunk | | ||||||
|  |  | ||||||
| ## Further characteristics | ## Further characteristics | ||||||
|  |  | ||||||
|   | |||||||
| @@ -4,10 +4,10 @@ os: Visual Studio 2015 | |||||||
| environment: | environment: | ||||||
|   matrix: |   matrix: | ||||||
|     - DC: dmd |     - DC: dmd | ||||||
|       DVersion: 2.087.1 |       DVersion: 2.091.1 | ||||||
|       arch: x64 |       arch: x64 | ||||||
|     - DC: dmd |     - DC: dmd | ||||||
|       DVersion: 2.087.1 |       DVersion: 2.091.1 | ||||||
|       arch: x86 |       arch: x86 | ||||||
|  |  | ||||||
| skip_tags: true | skip_tags: true | ||||||
|   | |||||||
| @@ -43,14 +43,14 @@ import tanya.meta.trait; | |||||||
|  */ |  */ | ||||||
| template Unqual(T) | template Unqual(T) | ||||||
| { | { | ||||||
|     static if (is(T U == const U) |     static if (is(T U == shared const U) | ||||||
|  |             || is(T U == shared inout U) | ||||||
|  |             || is(T U == shared inout const U) | ||||||
|  |             || is(T U == inout const U) | ||||||
|  |             || is(T U == const U) | ||||||
|             || is(T U == immutable U) |             || is(T U == immutable U) | ||||||
|             || is(T U == inout U) |             || is(T U == inout U) | ||||||
|             || is(T U == inout const U) |             || is(T U == shared U)) | ||||||
|             || is(T U == shared U) |  | ||||||
|             || is(T U == shared const U) |  | ||||||
|             || is(T U == shared inout U) |  | ||||||
|             || is(T U == shared inout const U)) |  | ||||||
|     { |     { | ||||||
|         alias Unqual = U; |         alias Unqual = U; | ||||||
|     } |     } | ||||||
| @@ -138,8 +138,6 @@ template OriginalType(T) | |||||||
|  *  To   = Target type. |  *  To   = Target type. | ||||||
|  * |  * | ||||||
|  * Returns: $(D_PARAM To) with the constness of $(D_PARAM From). |  * Returns: $(D_PARAM To) with the constness of $(D_PARAM From). | ||||||
|  * |  | ||||||
|  * See_Also: $(D_PSYMBOL CopyTypeQualifiers). |  | ||||||
|  */ |  */ | ||||||
| template CopyConstness(From, To) | template CopyConstness(From, To) | ||||||
| { | { | ||||||
| @@ -185,187 +183,6 @@ template CopyConstness(From, To) | |||||||
|     static assert(is(CopyConstness!(immutable int, const char) == immutable char)); |     static assert(is(CopyConstness!(immutable int, const char) == immutable char)); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Copies type qualifiers of $(D_PARAM From) to $(D_PARAM To). |  | ||||||
|  * |  | ||||||
|  * Type qualifiers copied are: |  | ||||||
|  * $(UL |  | ||||||
|  *  $(LI const) |  | ||||||
|  *  $(LI immutable) |  | ||||||
|  *  $(LI inout) |  | ||||||
|  *  $(LI shared) |  | ||||||
|  * ) |  | ||||||
|  * and combinations of these. |  | ||||||
|  * |  | ||||||
|  * Params: |  | ||||||
|  *  From = Source type. |  | ||||||
|  *  To   = Target type. |  | ||||||
|  * |  | ||||||
|  * Returns: $(D_PARAM To) with the type qualifiers of $(D_PARAM From). |  | ||||||
|  * |  | ||||||
|  * See_Also: $(D_PSYMBOL CopyConstness). |  | ||||||
|  */ |  | ||||||
| template CopyTypeQualifiers(From, To) |  | ||||||
| { |  | ||||||
|     static if (is(From T == immutable T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = immutable To; |  | ||||||
|     } |  | ||||||
|     else static if (is(From T == const T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = const To; |  | ||||||
|     } |  | ||||||
|     else static if (is(From T == shared T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = shared To; |  | ||||||
|     } |  | ||||||
|     else static if (is(From T == shared const T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = shared const To; |  | ||||||
|     } |  | ||||||
|     else static if (is(From T == inout T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = inout To; |  | ||||||
|     } |  | ||||||
|     else static if (is(From T == shared inout T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = shared inout To; |  | ||||||
|     } |  | ||||||
|     else static if (is(From T == inout const T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = inout const To; |  | ||||||
|     } |  | ||||||
|     else static if (is(From T == shared inout const T)) |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = shared inout const To; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         alias CopyTypeQualifiers = To; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     static assert(is(CopyTypeQualifiers!(int, char) == char)); |  | ||||||
|     static assert(is(CopyTypeQualifiers!(const int, char) == const char)); |  | ||||||
|     static assert(is(CopyTypeQualifiers!(immutable int, char) == immutable char)); |  | ||||||
|     static assert(is(CopyTypeQualifiers!(inout int, char) == inout char)); |  | ||||||
|     static assert(is(CopyTypeQualifiers!(inout const int, char) == inout const char)); |  | ||||||
|  |  | ||||||
|     static assert(is(CopyTypeQualifiers!(shared int, char) == shared char)); |  | ||||||
|     static assert(is(CopyTypeQualifiers!(shared const int, char) == shared const char)); |  | ||||||
|     static assert(is(CopyTypeQualifiers!(shared inout int, char) == shared inout char)); |  | ||||||
|     static assert(is(CopyTypeQualifiers!(shared inout const int, char) == shared inout const char)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Evaluates to the unsigned counterpart of the integral type $(D_PARAM T) preserving all type qualifiers. |  | ||||||
|  * If $(D_PARAM T) is already unsigned, $(D_INLINECODE Unsigned!T) aliases $(D_PARAM T). |  | ||||||
|  * |  | ||||||
|  * Params: |  | ||||||
|  *  T = A type. |  | ||||||
|  * |  | ||||||
|  * Returns: Unsigned counterpart of $(D_PARAM T). |  | ||||||
|  * |  | ||||||
|  * See_Also: $(D_PSYMBOL isSigned). |  | ||||||
|  */ |  | ||||||
| template Unsigned(T) |  | ||||||
| if (isIntegral!T) |  | ||||||
| { |  | ||||||
|     alias UnqualedType = Unqual!(OriginalType!T); |  | ||||||
|     static if (is(UnqualedType == byte)) |  | ||||||
|     { |  | ||||||
|         alias Unsigned = CopyTypeQualifiers!(T, ubyte); |  | ||||||
|     } |  | ||||||
|     else static if (is(UnqualedType == short)) |  | ||||||
|     { |  | ||||||
|         alias Unsigned = CopyTypeQualifiers!(T, ushort); |  | ||||||
|     } |  | ||||||
|     else static if (is(UnqualedType == int)) |  | ||||||
|     { |  | ||||||
|         alias Unsigned = CopyTypeQualifiers!(T, uint); |  | ||||||
|     } |  | ||||||
|     else static if (is(UnqualedType == long)) |  | ||||||
|     { |  | ||||||
|         alias Unsigned = CopyTypeQualifiers!(T, ulong); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         alias Unsigned = T; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     static assert(is(Unsigned!byte == ubyte)); |  | ||||||
|     static assert(is(Unsigned!short == ushort)); |  | ||||||
|     static assert(is(Unsigned!int == uint)); |  | ||||||
|     static assert(is(Unsigned!long == ulong)); |  | ||||||
|  |  | ||||||
|     static assert(is(Unsigned!(const byte) == const ubyte)); |  | ||||||
|     static assert(is(Unsigned!(shared byte) == shared ubyte)); |  | ||||||
|     static assert(is(Unsigned!(shared const byte) == shared const ubyte)); |  | ||||||
|  |  | ||||||
|     static assert(!is(Unsigned!float)); |  | ||||||
|     static assert(is(Unsigned!ubyte == ubyte)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Evaluates to the signed counterpart of the integral type $(D_PARAM T) preserving all type qualifiers. |  | ||||||
|  * If $(D_PARAM T) is already signed, $(D_INLINECODE Signed!T) aliases $(D_PARAM T). |  | ||||||
|  * |  | ||||||
|  * Params: |  | ||||||
|  *  T = A type. |  | ||||||
|  * |  | ||||||
|  * Returns: Signed counterpart of $(D_PARAM T). |  | ||||||
|  * |  | ||||||
|  * See_Also: $(D_PSYMBOL isUnsigned). |  | ||||||
|  */ |  | ||||||
| template Signed(T) |  | ||||||
| if (isIntegral!T) |  | ||||||
| { |  | ||||||
|     alias UnqualedType = Unqual!(OriginalType!T); |  | ||||||
|     static if (is(UnqualedType == ubyte)) |  | ||||||
|     { |  | ||||||
|         alias Signed = CopyTypeQualifiers!(T, byte); |  | ||||||
|     } |  | ||||||
|     else static if (is(UnqualedType == ushort)) |  | ||||||
|     { |  | ||||||
|         alias Signed = CopyTypeQualifiers!(T, short); |  | ||||||
|     } |  | ||||||
|     else static if (is(UnqualedType == uint)) |  | ||||||
|     { |  | ||||||
|         alias Signed = CopyTypeQualifiers!(T, int); |  | ||||||
|     } |  | ||||||
|     else static if (is(UnqualedType == ulong)) |  | ||||||
|     { |  | ||||||
|         alias Signed = CopyTypeQualifiers!(T, long); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         alias Signed = T; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     static assert(is(Signed!ubyte == byte)); |  | ||||||
|     static assert(is(Signed!ushort == short)); |  | ||||||
|     static assert(is(Signed!uint == int)); |  | ||||||
|     static assert(is(Signed!ulong == long)); |  | ||||||
|  |  | ||||||
|     static assert(is(Signed!(const ubyte) == const byte)); |  | ||||||
|     static assert(is(Signed!(shared ubyte) == shared byte)); |  | ||||||
|     static assert(is(Signed!(shared const ubyte) == shared const byte)); |  | ||||||
|  |  | ||||||
|     static assert(!is(Signed!float)); |  | ||||||
|     static assert(is(Signed!byte == byte)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Retrieves the target type `U` of a pointer `U*`. |  * Retrieves the target type `U` of a pointer `U*`. | ||||||
|  * |  * | ||||||
| @@ -445,37 +262,6 @@ template ValueType(T) | |||||||
|     static assert(!is(ValueType!(int[15]))); |     static assert(!is(ValueType!(int[15]))); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Params: |  | ||||||
|  *  T = Scalar type. |  | ||||||
|  * |  | ||||||
|  * Returns: The type $(D_PARAM T) will promote to. |  | ||||||
|  * |  | ||||||
|  * See_Also: $(LINK2 https://dlang.org/spec/type.html#integer-promotions, |  | ||||||
|  *                   Integer Promotions). |  | ||||||
|  */ |  | ||||||
| template Promoted(T) |  | ||||||
| if (isScalarType!T) |  | ||||||
| { |  | ||||||
|     alias Promoted = CopyTypeQualifiers!(T, typeof(T.init + T.init)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     static assert(is(Promoted!bool == int)); |  | ||||||
|     static assert(is(Promoted!byte == int)); |  | ||||||
|     static assert(is(Promoted!ubyte == int)); |  | ||||||
|     static assert(is(Promoted!short == int)); |  | ||||||
|     static assert(is(Promoted!ushort == int)); |  | ||||||
|     static assert(is(Promoted!char == int)); |  | ||||||
|     static assert(is(Promoted!wchar == int)); |  | ||||||
|     static assert(is(Promoted!dchar == uint)); |  | ||||||
|  |  | ||||||
|     static assert(is(Promoted!(const bool) == const int)); |  | ||||||
|     static assert(is(Promoted!(shared bool) == shared int)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Adds $(D_KEYWORD inout) qualifier to the type $(D_PARAM T). |  * Adds $(D_KEYWORD inout) qualifier to the type $(D_PARAM T). | ||||||
|  * |  * | ||||||
| @@ -604,86 +390,6 @@ alias SharedInoutConstOf(T) = shared(inout const T); | |||||||
|     static assert(is(SharedInoutConstOf!int == shared inout const int)); |     static assert(is(SharedInoutConstOf!int == shared inout const int)); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Returns a template with one argument which applies all qualifiers of |  | ||||||
|  * $(D_PARAM T) on its argument if instantiated. |  | ||||||
|  * |  | ||||||
|  * Params: |  | ||||||
|  *  T = A type. |  | ||||||
|  * |  | ||||||
|  * Returns: $(D_INLINECODE shared(inout const T)). |  | ||||||
|  */ |  | ||||||
| template QualifierOf(T) |  | ||||||
| { |  | ||||||
|     static if (is(T U == const U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = ConstOf; |  | ||||||
|     } |  | ||||||
|     else static if (is(T U == immutable U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = ImmutableOf; |  | ||||||
|     } |  | ||||||
|     else static if (is(T U == inout U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = InoutOf; |  | ||||||
|     } |  | ||||||
|     else static if (is(T U == inout const U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = InoutConstOf; |  | ||||||
|     } |  | ||||||
|     else static if (is(T U == shared U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = SharedOf; |  | ||||||
|     } |  | ||||||
|     else static if (is(T U == shared const U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = SharedConstOf; |  | ||||||
|     } |  | ||||||
|     else static if (is(T U == shared inout U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = SharedInoutOf; |  | ||||||
|     } |  | ||||||
|     else static if (is(T U == shared inout const U)) |  | ||||||
|     { |  | ||||||
|         alias QualifierOf = SharedInoutConstOf; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         alias QualifierOf(T) = T; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     alias MutableOf = QualifierOf!int; |  | ||||||
|     static assert(is(MutableOf!uint == uint)); |  | ||||||
|  |  | ||||||
|     alias ConstOf = QualifierOf!(const int); |  | ||||||
|     static assert(is(ConstOf!uint == const uint)); |  | ||||||
|  |  | ||||||
|     alias InoutOf = QualifierOf!(inout int); |  | ||||||
|     static assert(is(InoutOf!uint == inout uint)); |  | ||||||
|  |  | ||||||
|     alias InoutConstOf = QualifierOf!(inout const int); |  | ||||||
|     static assert(is(InoutConstOf!uint == inout const uint)); |  | ||||||
|  |  | ||||||
|     alias ImmutableOf = QualifierOf!(immutable int); |  | ||||||
|     static assert(is(ImmutableOf!uint == immutable uint)); |  | ||||||
|  |  | ||||||
|     alias SharedOf = QualifierOf!(shared int); |  | ||||||
|     static assert(is(SharedOf!uint == shared uint)); |  | ||||||
|  |  | ||||||
|     alias SharedConstOf = QualifierOf!(shared const int); |  | ||||||
|     static assert(is(SharedConstOf!uint == shared const uint)); |  | ||||||
|  |  | ||||||
|     alias SharedInoutOf = QualifierOf!(shared inout int); |  | ||||||
|     static assert(is(SharedInoutOf!uint == shared inout uint)); |  | ||||||
|  |  | ||||||
|     alias SharedInoutConstOf = QualifierOf!(shared inout const int); |  | ||||||
|     static assert(is(SharedInoutConstOf!uint == shared inout const uint)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Determines the type of $(D_PARAM T). If $(D_PARAM T) is already a type, |  * Determines the type of $(D_PARAM T). If $(D_PARAM T) is already a type, | ||||||
|  * $(D_PSYMBOL TypeOf) aliases itself to $(D_PARAM T). |  * $(D_PSYMBOL TypeOf) aliases itself to $(D_PARAM T). | ||||||
| @@ -719,142 +425,6 @@ if (isExpressions!T || __traits(isTemplate, T)) | |||||||
|     static assert(!is(TypeOf!(tanya.meta))); |     static assert(!is(TypeOf!(tanya.meta))); | ||||||
| } | } | ||||||
|  |  | ||||||
| // e.g. returns int for int**. |  | ||||||
| private template FinalPointerTarget(T) |  | ||||||
| { |  | ||||||
|     static if (isPointer!T) |  | ||||||
|     { |  | ||||||
|         alias FinalPointerTarget = FinalPointerTarget!(PointerTarget!T); |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         alias FinalPointerTarget = T; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Returns true if T1 is void* and T2 is some pointer. |  | ||||||
| private template voidAndPointer(T1, T2) |  | ||||||
| { |  | ||||||
|     enum bool voidAndPointer = is(Unqual!(PointerTarget!T1) == void) |  | ||||||
|                             && isPointer!T2; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Type returned by the ternary operator. |  | ||||||
| private alias TernaryType(T, U) = typeof(true ? T.init : U.init); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Determines the type all $(D_PARAM Args) can be implicitly converted to. |  | ||||||
|  * |  | ||||||
|  * $(OL |  | ||||||
|  *  $(LI If one of the arguments is $(D_KEYWORD void), the common type is |  | ||||||
|  *       $(D_KEYWORD void).) |  | ||||||
|  *  $(LI The common type of integers with the same sign is the type with a |  | ||||||
|  *       larger size. Signed and unsigned integers don't have a common type. |  | ||||||
|  *       Type qualifiers are only preserved if all arguments are the same |  | ||||||
|  *       type.) |  | ||||||
|  *  $(LI The common type of floating point numbers is the type with more |  | ||||||
|  *       precision. Type qualifiers are only preserved if all arguments are |  | ||||||
|  *       the same type.) |  | ||||||
|  *  $(LI The common type of polymorphic objects is the next, more generic type |  | ||||||
|  *       both objects inherit from, e.g. $(D_PSYMBOL Object).) |  | ||||||
|  *  $(LI `void*` is concerned as a common type of pointers only if one of the |  | ||||||
|  *       arguments is a void pointer.) |  | ||||||
|  *  $(LI Other types have a common type only if their pointers have a common |  | ||||||
|  *       type. It means that for example $(D_KEYWORD bool) and $(D_KEYWORD int) |  | ||||||
|          don't have a common type. If the types fullfill this condition, the |  | ||||||
|          common type is determined with the ternary operator, i.e. |  | ||||||
|          `typeof(true ? T1.init : T2.init)` is evaluated.) |  | ||||||
|  * ) |  | ||||||
|  * |  | ||||||
|  * If $(D_PARAM Args) don't have a common type, $(D_PSYMBOL CommonType) is |  | ||||||
|  * $(D_KEYWORD void). |  | ||||||
|  * |  | ||||||
|  * Params: |  | ||||||
|  *  Args = Type list. |  | ||||||
|  * |  | ||||||
|  * Returns: Common type for $(D_PARAM Args) or $(D_KEYWORD void) if |  | ||||||
|  *          $(D_PARAM Args) don't have a common type. |  | ||||||
|  */ |  | ||||||
| template CommonType(Args...) |  | ||||||
| if (allSatisfy!(isType, Args)) |  | ||||||
| { |  | ||||||
|     static if (Args.length == 0 |  | ||||||
|             || is(Unqual!(Args[0]) == void) |  | ||||||
|             || is(Unqual!(Args[1]) == void)) |  | ||||||
|     { |  | ||||||
|         alias CommonType = void; |  | ||||||
|     } |  | ||||||
|     else static if (Args.length == 1) |  | ||||||
|     { |  | ||||||
|         alias CommonType = Args[0]; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         private alias Pair = Args[0 .. 2]; |  | ||||||
|         private enum bool sameSigned = allSatisfy!(isIntegral, Pair) |  | ||||||
|                                     && isSigned!(Args[0]) == isSigned!(Args[1]); |  | ||||||
|  |  | ||||||
|         static if (is(Args[0] == Args[1])) |  | ||||||
|         { |  | ||||||
|             alias CommonType = CommonType!(Args[0], Args[2 .. $]); |  | ||||||
|         } |  | ||||||
|         else static if (sameSigned || allSatisfy!(isFloatingPoint, Pair)) |  | ||||||
|         { |  | ||||||
|             alias CommonType = CommonType!(Unqual!(Largest!Pair), |  | ||||||
|                                            Args[2 .. $]); |  | ||||||
|         } |  | ||||||
|         else static if (voidAndPointer!Pair |  | ||||||
|                      || voidAndPointer!(Args[1], Args[0])) |  | ||||||
|         { |  | ||||||
|             // Workaround for https://issues.dlang.org/show_bug.cgi?id=15557. |  | ||||||
|             // Determine the qualifiers returned by the ternary operator as if |  | ||||||
|             // both pointers were int*. Then copy the qualifiers to void*. |  | ||||||
|             alias P1 = CopyTypeQualifiers!(FinalPointerTarget!(Args[0]), int)*; |  | ||||||
|             alias P2 = CopyTypeQualifiers!(FinalPointerTarget!(Args[1]), int)*; |  | ||||||
|             static if (is(TernaryType!(P1, P2) U)) |  | ||||||
|             { |  | ||||||
|                 alias CommonType = CopyTypeQualifiers!(PointerTarget!U, void)*; |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 alias CommonType = void; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         else static if ((isPointer!(Args[0]) || isPolymorphicType!(Args[0])) |  | ||||||
|                      && is(TernaryType!Pair U)) |  | ||||||
|         { |  | ||||||
|             alias CommonType = CommonType!(U, Args[2 .. $]); |  | ||||||
|         } |  | ||||||
|         else static if (is(TernaryType!(Args[0]*, Args[1]*))) |  | ||||||
|         { |  | ||||||
|             alias CommonType = CommonType!(TernaryType!Pair, Args[2 .. $]); |  | ||||||
|         } |  | ||||||
|         else |  | ||||||
|         { |  | ||||||
|             alias CommonType = void; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     static assert(is(CommonType!(int, int, int) == int)); |  | ||||||
|     static assert(is(CommonType!(ubyte, ushort, uint) == uint)); |  | ||||||
|     static assert(is(CommonType!(int, uint) == void)); |  | ||||||
|  |  | ||||||
|     static assert(is(CommonType!(int, const int) == int)); |  | ||||||
|     static assert(is(CommonType!(const int, const int) == const int)); |  | ||||||
|  |  | ||||||
|     static assert(is(CommonType!(int[], const(int)[]) == const(int)[])); |  | ||||||
|     static assert(is(CommonType!(string, char[]) == const(char)[])); |  | ||||||
|  |  | ||||||
|     class A |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
|     static assert(is(CommonType!(const A, Object) == const Object)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Finds the type with the smallest size in the $(D_PARAM Args) list. If |  * Finds the type with the smallest size in the $(D_PARAM Args) list. If | ||||||
|  * several types have the same type, the leftmost is returned. |  * several types have the same type, the leftmost is returned. | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ | |||||||
|  */ |  */ | ||||||
| module tanya.algorithm.comparison; | module tanya.algorithm.comparison; | ||||||
|  |  | ||||||
|  | import std.traits : CommonType; | ||||||
| import tanya.algorithm.mutation; | import tanya.algorithm.mutation; | ||||||
| import tanya.math; | import tanya.math; | ||||||
| static import tanya.memory.op; | static import tanya.memory.op; | ||||||
|   | |||||||
| @@ -14,6 +14,7 @@ | |||||||
|  */ |  */ | ||||||
| module tanya.conv; | module tanya.conv; | ||||||
|  |  | ||||||
|  | import std.traits : Unsigned; | ||||||
| import tanya.container.string; | import tanya.container.string; | ||||||
| import tanya.memory.allocator; | import tanya.memory.allocator; | ||||||
| deprecated("Use tanya.memory.lifetime.emplace instead") | deprecated("Use tanya.memory.lifetime.emplace instead") | ||||||
|   | |||||||
| @@ -1,16 +0,0 @@ | |||||||
| /* This Source Code Form is subject to the terms of the Mozilla Public |  | ||||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this |  | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * Copyright: Eugene Wissner 2017-2019. |  | ||||||
|  * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/, |  | ||||||
|  *                  Mozilla Public License, v. 2.0). |  | ||||||
|  * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner) |  | ||||||
|  * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/exception.d, |  | ||||||
|  *                 tanya/exception.d) |  | ||||||
|  */ |  | ||||||
| deprecated("Use tanya.memory.allocator instead") |  | ||||||
| module tanya.exception; |  | ||||||
|  |  | ||||||
| public import tanya.memory.allocator : onOutOfMemoryError, OutOfMemoryError; |  | ||||||
| @@ -1,18 +0,0 @@ | |||||||
| /* This Source Code Form is subject to the terms of the Mozilla Public |  | ||||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this |  | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |  | ||||||
|  |  | ||||||
| /* |  | ||||||
|  * Functions that manipulate other functions and their argument lists. |  | ||||||
|  * |  | ||||||
|  * Copyright: Eugene Wissner 2018-2019. |  | ||||||
|  * License: $(LINK2 https://www.mozilla.org/en-US/MPL/2.0/, |  | ||||||
|  *                  Mozilla Public License, v. 2.0). |  | ||||||
|  * Authors: $(LINK2 mailto:info@caraus.de, Eugene Wissner) |  | ||||||
|  * Source: $(LINK2 https://github.com/caraus-ecms/tanya/blob/master/source/tanya/functional.d, |  | ||||||
|  *                 tanya/functional.d) |  | ||||||
|  */ |  | ||||||
| deprecated("Use tanya.memory.lifetime instead") |  | ||||||
| module tanya.functional; |  | ||||||
|  |  | ||||||
| public import tanya.memory.lifetime : forward; |  | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -14,7 +14,6 @@ | |||||||
|  */ |  */ | ||||||
| module tanya.math.nbtheory; | module tanya.math.nbtheory; | ||||||
|  |  | ||||||
| import tanya.math.mp; |  | ||||||
| import tanya.meta.trait; | import tanya.meta.trait; | ||||||
| import tanya.meta.transform; | import tanya.meta.transform; | ||||||
|  |  | ||||||
| @@ -91,21 +90,6 @@ if (isFloatingPoint!T) | |||||||
|     static assert(is(typeof(r.abs) == real)); |     static assert(is(typeof(r.abs) == real)); | ||||||
| } | } | ||||||
|  |  | ||||||
| /// ditto |  | ||||||
| T abs(T : Integer)(const auto ref T x) |  | ||||||
| { |  | ||||||
|     auto result = Integer(x, x.allocator); |  | ||||||
|     result.sign = Sign.positive; |  | ||||||
|     return result; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// ditto |  | ||||||
| T abs(T : Integer)(T x) |  | ||||||
| { |  | ||||||
|     x.sign = Sign.positive; |  | ||||||
|     return x; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| version (D_Ddoc) | version (D_Ddoc) | ||||||
| { | { | ||||||
|     /** |     /** | ||||||
|   | |||||||
| @@ -21,7 +21,6 @@ | |||||||
|  */ |  */ | ||||||
| module tanya.math; | module tanya.math; | ||||||
|  |  | ||||||
| import tanya.math.mp; |  | ||||||
| import tanya.math.nbtheory; | import tanya.math.nbtheory; | ||||||
| import tanya.meta.trait; | import tanya.meta.trait; | ||||||
| import tanya.meta.transform; | import tanya.meta.transform; | ||||||
| @@ -548,9 +547,6 @@ if (isFloatingPoint!F) | |||||||
| /** | /** | ||||||
|  * Computes $(D_PARAM x) to the power $(D_PARAM y) modulo $(D_PARAM z). |  * Computes $(D_PARAM x) to the power $(D_PARAM y) modulo $(D_PARAM z). | ||||||
|  * |  * | ||||||
|  * If $(D_PARAM I) is an $(D_PSYMBOL Integer), the allocator of $(D_PARAM x) |  | ||||||
|  * is used to allocate the result. |  | ||||||
|  * |  | ||||||
|  * Params: |  * Params: | ||||||
|  *  I = Base type. |  *  I = Base type. | ||||||
|  *  G = Exponent type. |  *  G = Exponent type. | ||||||
| @@ -600,41 +596,6 @@ in (z > 0, "Division by zero") | |||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  |  | ||||||
| /// ditto |  | ||||||
| I pow(I)(const auto ref I x, const auto ref I y, const auto ref I z) |  | ||||||
| if (is(I == Integer)) |  | ||||||
| in (z.length > 0, "Division by zero") |  | ||||||
| { |  | ||||||
|     size_t i; |  | ||||||
|     auto tmp1 = Integer(x, x.allocator); |  | ||||||
|     auto result = Integer(x.allocator); |  | ||||||
|  |  | ||||||
|     if (x.size == 0 && y.size != 0) |  | ||||||
|     { |  | ||||||
|         i = y.size; |  | ||||||
|     } |  | ||||||
|     else |  | ||||||
|     { |  | ||||||
|         result = 1; |  | ||||||
|     } |  | ||||||
|     while (i < y.size) |  | ||||||
|     { |  | ||||||
|         for (uint mask = 0x01; mask != 0x10000000; mask <<= 1) |  | ||||||
|         { |  | ||||||
|             if (y.rep[i] & mask) |  | ||||||
|             { |  | ||||||
|                 result *= tmp1; |  | ||||||
|                 result %= z; |  | ||||||
|             } |  | ||||||
|             auto tmp2 = tmp1; |  | ||||||
|             tmp1 *= tmp2; |  | ||||||
|             tmp1 %= z; |  | ||||||
|         } |  | ||||||
|         ++i; |  | ||||||
|     } |  | ||||||
|     return result; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// | /// | ||||||
| @nogc nothrow pure @safe unittest | @nogc nothrow pure @safe unittest | ||||||
| { | { | ||||||
| @@ -648,32 +609,3 @@ in (z.length > 0, "Division by zero") | |||||||
|     assert(pow(0, 0, 5) == 1); |     assert(pow(0, 0, 5) == 1); | ||||||
|     assert(pow(0, 5, 5) == 0); |     assert(pow(0, 5, 5) == 0); | ||||||
| } | } | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     assert(pow(Integer(3), Integer(5), Integer(7)) == 5); |  | ||||||
|     assert(pow(Integer(2), Integer(2), Integer(1)) == 0); |  | ||||||
|     assert(pow(Integer(3), Integer(3), Integer(3)) == 0); |  | ||||||
|     assert(pow(Integer(7), Integer(4), Integer(2)) == 1); |  | ||||||
|     assert(pow(Integer(53), Integer(0), Integer(2)) == 1); |  | ||||||
|     assert(pow(Integer(53), Integer(1), Integer(3)) == 2); |  | ||||||
|     assert(pow(Integer(53), Integer(2), Integer(5)) == 4); |  | ||||||
|     assert(pow(Integer(0), Integer(0), Integer(5)) == 1); |  | ||||||
|     assert(pow(Integer(0), Integer(5), Integer(5)) == 0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| deprecated |  | ||||||
| bool isPseudoprime(ulong x) @nogc nothrow pure @safe |  | ||||||
| { |  | ||||||
|     return pow(2, x - 1, x) == 1; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /// |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     assert(74623.isPseudoprime); |  | ||||||
|     assert(104729.isPseudoprime); |  | ||||||
|     assert(15485867.isPseudoprime); |  | ||||||
|     assert(!15485868.isPseudoprime); |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,73 +0,0 @@ | |||||||
| /* This Source Code Form is subject to the terms of the Mozilla Public |  | ||||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this |  | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |  | ||||||
| module tanya.math.tests.mp; |  | ||||||
|  |  | ||||||
| import tanya.algorithm.comparison; |  | ||||||
| import tanya.math.mp; |  | ||||||
|  |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     auto h1 = Integer(18); |  | ||||||
|     auto h2 = Integer(4); |  | ||||||
|     h1 %= h2; |  | ||||||
|     assert(h1 == 2); |  | ||||||
|  |  | ||||||
|     h1 = 8; |  | ||||||
|     h1 %= h2; |  | ||||||
|     assert(h1 == 0); |  | ||||||
|  |  | ||||||
|     h1 = 7; |  | ||||||
|     h1 %= h2; |  | ||||||
|     assert(h1 == 3); |  | ||||||
|  |  | ||||||
|     h1 = 56088; |  | ||||||
|     h2 = 456; |  | ||||||
|     h1 /= h2; |  | ||||||
|     assert(h1 == 123); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     Integer integer; |  | ||||||
|     assert(integer.toArray().length == 0); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     auto integer = Integer(0x03); |  | ||||||
|     ubyte[1] expected = [ 0x03 ]; |  | ||||||
|  |  | ||||||
|     auto array = integer.toArray(); |  | ||||||
|     assert(equal(array[], expected[])); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     ubyte[63] expected = [ |  | ||||||
|         0x02, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, |  | ||||||
|         0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, |  | ||||||
|         0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, |  | ||||||
|         0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, |  | ||||||
|         0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, |  | ||||||
|         0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, |  | ||||||
|         0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, |  | ||||||
|         0x39, 0x3a, 0x3b, 0x00, 0x61, 0x62, 0x63, |  | ||||||
|     ]; |  | ||||||
|     auto integer = Integer(Sign.positive, expected[]); |  | ||||||
|  |  | ||||||
|     auto array = integer.toArray(); |  | ||||||
|     assert(equal(array[], expected[])); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     ubyte[14] expected = [ |  | ||||||
|         0x22, 0x33, 0x44, 0x55, 0x05, 0x06, 0x07, |  | ||||||
|         0x08, 0x3a, 0x3b, 0x00, 0x61, 0x62, 0x63, |  | ||||||
|     ]; |  | ||||||
|     auto integer = Integer(Sign.positive, expected[]); |  | ||||||
|  |  | ||||||
|     auto array = integer.toArray(); |  | ||||||
|     assert(equal(array[], expected[])); |  | ||||||
| } |  | ||||||
| @@ -17,33 +17,3 @@ static if (ieeePrecision!float == IEEEPrecision.doubleExtended) | |||||||
|     unnormal.mantissa = 0x1; |     unnormal.mantissa = 0x1; | ||||||
|     assert(classify(unnormal) == FloatingPointClass.subnormal); |     assert(classify(unnormal) == FloatingPointClass.subnormal); | ||||||
| } | } | ||||||
|  |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     assert(74653.isPseudoprime); |  | ||||||
|     assert(74687.isPseudoprime); |  | ||||||
|     assert(74699.isPseudoprime); |  | ||||||
|     assert(74707.isPseudoprime); |  | ||||||
|     assert(74713.isPseudoprime); |  | ||||||
|     assert(74717.isPseudoprime); |  | ||||||
|     assert(74719.isPseudoprime); |  | ||||||
|     assert(74747.isPseudoprime); |  | ||||||
|     assert(74759.isPseudoprime); |  | ||||||
|     assert(74761.isPseudoprime); |  | ||||||
|     assert(74771.isPseudoprime); |  | ||||||
|     assert(74779.isPseudoprime); |  | ||||||
|     assert(74797.isPseudoprime); |  | ||||||
|     assert(74821.isPseudoprime); |  | ||||||
|     assert(74827.isPseudoprime); |  | ||||||
|     assert(9973.isPseudoprime); |  | ||||||
|     assert(49979693.isPseudoprime); |  | ||||||
|     assert(104395303.isPseudoprime); |  | ||||||
|     assert(593441861.isPseudoprime); |  | ||||||
|     assert(104729.isPseudoprime); |  | ||||||
|     assert(15485867.isPseudoprime); |  | ||||||
|     assert(49979693.isPseudoprime); |  | ||||||
|     assert(104395303.isPseudoprime); |  | ||||||
|     assert(593441861.isPseudoprime); |  | ||||||
|     assert(899809363.isPseudoprime); |  | ||||||
|     assert(982451653.isPseudoprime); |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -1,53 +0,0 @@ | |||||||
| /* This Source Code Form is subject to the terms of the Mozilla Public |  | ||||||
|  * License, v. 2.0. If a copy of the MPL was not distributed with this |  | ||||||
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |  | ||||||
| module tanya.meta.tests.transform; |  | ||||||
|  |  | ||||||
| import tanya.meta.transform; |  | ||||||
|  |  | ||||||
| @nogc nothrow pure @safe unittest |  | ||||||
| { |  | ||||||
|     static assert(is(CommonType!(void*, int*) == void*)); |  | ||||||
|     static assert(is(CommonType!(void*, const(int)*) == const(void)*)); |  | ||||||
|     static assert(is(CommonType!(void*, const(void)*) == const(void)*)); |  | ||||||
|     static assert(is(CommonType!(int*, void*) == void*)); |  | ||||||
|     static assert(is(CommonType!(const(int)*, void*) == const(void)*)); |  | ||||||
|     static assert(is(CommonType!(const(void)*, void*) == const(void)*)); |  | ||||||
|  |  | ||||||
|     static assert(is(CommonType!() == void)); |  | ||||||
|     static assert(is(CommonType!(int*, const(int)*) == const(int)*)); |  | ||||||
|     static assert(is(CommonType!(int**, const(int)**) == const(int*)*)); |  | ||||||
|  |  | ||||||
|     static assert(is(CommonType!(float, double) == double)); |  | ||||||
|     static assert(is(CommonType!(float, int) == void)); |  | ||||||
|  |  | ||||||
|     static assert(is(CommonType!(bool, const bool) == bool)); |  | ||||||
|     static assert(is(CommonType!(int, bool) == void)); |  | ||||||
|     static assert(is(CommonType!(int, void) == void)); |  | ||||||
|     static assert(is(CommonType!(Object, void*) == void)); |  | ||||||
|  |  | ||||||
|     class A |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
|     static assert(is(CommonType!(A, Object) == Object)); |  | ||||||
|     static assert(is(CommonType!(const(A)*, Object*) == const(Object)*)); |  | ||||||
|     static assert(is(CommonType!(A, typeof(null)) == A)); |  | ||||||
|  |  | ||||||
|     class B : A |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
|     class C : A |  | ||||||
|     { |  | ||||||
|     } |  | ||||||
|     static assert(is(CommonType!(B, C) == A)); |  | ||||||
|  |  | ||||||
|     static struct S |  | ||||||
|     { |  | ||||||
|         int opCast(T : int)() |  | ||||||
|         { |  | ||||||
|             return 1; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     static assert(is(CommonType!(S, int) == void)); |  | ||||||
|     static assert(is(CommonType!(const S, S) == const S)); |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user