Rename ModifyTypePreservingSTC to ModifyTypePreservingTQ and make it public.

This commit is contained in:
Hackerpilot 2015-06-03 16:10:35 -07:00
parent 8ce2f3498d
commit 0b1e29cfa1
2 changed files with 107 additions and 64 deletions

View file

@ -2039,7 +2039,7 @@ auto representation(Char)(Char[] s) @safe pure nothrow @nogc
if (isSomeChar!Char) if (isSomeChar!Char)
{ {
alias ToRepType(T) = TypeTuple!(ubyte, ushort, uint)[T.sizeof / 2]; alias ToRepType(T) = TypeTuple!(ubyte, ushort, uint)[T.sizeof / 2];
return cast(ModifyTypePreservingSTC!(ToRepType, Char)[])s; return cast(ModifyTypePreservingTQ!(ToRepType, Char)[])s;
} }
/// ///
@ -6182,7 +6182,7 @@ auto assumeUTF(T)(T[] arr) pure
{ {
import std.utf : validate; import std.utf : validate;
alias ToUTFType(U) = TypeTuple!(char, wchar, dchar)[U.sizeof / 2]; alias ToUTFType(U) = TypeTuple!(char, wchar, dchar)[U.sizeof / 2];
auto asUTF = cast(ModifyTypePreservingSTC!(ToUTFType, T)[])arr; auto asUTF = cast(ModifyTypePreservingTQ!(ToUTFType, T)[])arr;
debug validate(asUTF); debug validate(asUTF);
return asUTF; return asUTF;
} }

View file

@ -54,6 +54,7 @@
* $(TR $(TD Type Conversion) $(TD * $(TR $(TD Type Conversion) $(TD
* $(LREF CommonType) * $(LREF CommonType)
* $(LREF ImplicitConversionTargets) * $(LREF ImplicitConversionTargets)
* $(LREF CopyTypeQualifiers)
* $(LREF isAssignable) * $(LREF isAssignable)
* $(LREF isCovariantWith) * $(LREF isCovariantWith)
* $(LREF isImplicitlyConvertible) * $(LREF isImplicitlyConvertible)
@ -257,50 +258,58 @@ private
alias NumericTypeList = TypeTuple!(IntegralTypeList, FloatingPointTypeList); alias NumericTypeList = TypeTuple!(IntegralTypeList, FloatingPointTypeList);
alias CharTypeList = TypeTuple!(char, wchar, dchar); alias CharTypeList = TypeTuple!(char, wchar, dchar);
} }
package package
{ {
// Add specific qualifier to the given type T /// Add specific qualifier to the given type T.
template MutableOf(T) { alias MutableOf = T ; } template MutableOf(T) { alias MutableOf = T ; }
template InoutOf(T) { alias InoutOf = inout(T) ; } }
template ConstOf(T) { alias ConstOf = const(T) ; }
template SharedOf(T) { alias SharedOf = shared(T) ; }
template SharedInoutOf(T) { alias SharedInoutOf = shared(inout(T)); }
template SharedConstOf(T) { alias SharedConstOf = shared(const(T)); }
template ImmutableOf(T) { alias ImmutableOf = immutable(T) ; }
unittest /// Add specific qualifier to the given type T.
{ template InoutOf(T) { alias InoutOf = inout(T) ; }
static assert(is( MutableOf!int == int)); /// ditto.
static assert(is( InoutOf!int == inout int)); template ConstOf(T) { alias ConstOf = const(T) ; }
static assert(is( ConstOf!int == const int)); /// ditto.
static assert(is( SharedOf!int == shared int)); template SharedOf(T) { alias SharedOf = shared(T) ; }
static assert(is(SharedInoutOf!int == shared inout int)); /// ditto.
static assert(is(SharedConstOf!int == shared const int)); template SharedInoutOf(T) { alias SharedInoutOf = shared(inout(T)); }
static assert(is( ImmutableOf!int == immutable int)); /// ditto.
} template SharedConstOf(T) { alias SharedConstOf = shared(const(T)); }
/// ditto.
template ImmutableOf(T) { alias ImmutableOf = immutable(T) ; }
// Get qualifier template from the given type T unittest
template QualifierOf(T) {
{ static assert(is( MutableOf!int == int));
static if (is(T == shared(const U), U)) alias QualifierOf = SharedConstOf; static assert(is( InoutOf!int == inout int));
else static if (is(T == const U , U)) alias QualifierOf = ConstOf; static assert(is( ConstOf!int == const int));
else static if (is(T == shared(inout U), U)) alias QualifierOf = SharedInoutOf; static assert(is( SharedOf!int == shared int));
else static if (is(T == inout U , U)) alias QualifierOf = InoutOf; static assert(is(SharedInoutOf!int == shared inout int));
else static if (is(T == immutable U , U)) alias QualifierOf = ImmutableOf; static assert(is(SharedConstOf!int == shared const int));
else static if (is(T == shared U , U)) alias QualifierOf = SharedOf; static assert(is( ImmutableOf!int == immutable int));
else alias QualifierOf = MutableOf; }
}
unittest // Get qualifier template from the given type T
{ template QualifierOf(T)
alias Qual1 = QualifierOf!( int); static assert(is(Qual1!long == long)); {
alias Qual2 = QualifierOf!( inout int); static assert(is(Qual2!long == inout long)); static if (is(T == shared(const U), U)) alias QualifierOf = SharedConstOf;
alias Qual3 = QualifierOf!( const int); static assert(is(Qual3!long == const long)); else static if (is(T == const U , U)) alias QualifierOf = ConstOf;
alias Qual4 = QualifierOf!(shared int); static assert(is(Qual4!long == shared long)); else static if (is(T == shared(inout U), U)) alias QualifierOf = SharedInoutOf;
alias Qual5 = QualifierOf!(shared inout int); static assert(is(Qual5!long == shared inout long)); else static if (is(T == inout U , U)) alias QualifierOf = InoutOf;
alias Qual6 = QualifierOf!(shared const int); static assert(is(Qual6!long == shared const long)); else static if (is(T == immutable U , U)) alias QualifierOf = ImmutableOf;
alias Qual7 = QualifierOf!( immutable int); static assert(is(Qual7!long == immutable long)); else static if (is(T == shared U , U)) alias QualifierOf = SharedOf;
} else alias QualifierOf = MutableOf;
}
unittest
{
alias Qual1 = QualifierOf!( int); static assert(is(Qual1!long == long));
alias Qual2 = QualifierOf!( inout int); static assert(is(Qual2!long == inout long));
alias Qual3 = QualifierOf!( const int); static assert(is(Qual3!long == const long));
alias Qual4 = QualifierOf!(shared int); static assert(is(Qual4!long == shared long));
alias Qual5 = QualifierOf!(shared inout int); static assert(is(Qual5!long == shared inout long));
alias Qual6 = QualifierOf!(shared const int); static assert(is(Qual6!long == shared const long));
alias Qual7 = QualifierOf!( immutable int); static assert(is(Qual7!long == immutable long));
} }
version(unittest) version(unittest)
@ -4305,8 +4314,8 @@ private template isStorageClassImplicitlyConvertible(From, To)
alias Pointify(T) = void*; alias Pointify(T) = void*;
enum isStorageClassImplicitlyConvertible = isImplicitlyConvertible!( enum isStorageClassImplicitlyConvertible = isImplicitlyConvertible!(
ModifyTypePreservingSTC!(Pointify, From), ModifyTypePreservingTQ!(Pointify, From),
ModifyTypePreservingSTC!(Pointify, To) ); ModifyTypePreservingTQ!(Pointify, To) );
} }
unittest unittest
@ -5944,31 +5953,65 @@ unittest
} }
// [For internal use] // [For internal use]
package template ModifyTypePreservingSTC(alias Modifier, T) package template ModifyTypePreservingTQ(alias Modifier, T)
{ {
static if (is(T U == immutable U)) alias ModifyTypePreservingSTC = immutable Modifier!U; static if (is(T U == immutable U)) alias ModifyTypePreservingTQ = immutable Modifier!U;
else static if (is(T U == shared inout const U)) alias ModifyTypePreservingSTC = shared inout const Modifier!U; else static if (is(T U == shared inout const U)) alias ModifyTypePreservingTQ = shared inout const Modifier!U;
else static if (is(T U == shared inout U)) alias ModifyTypePreservingSTC = shared inout Modifier!U; else static if (is(T U == shared inout U)) alias ModifyTypePreservingTQ = shared inout Modifier!U;
else static if (is(T U == shared const U)) alias ModifyTypePreservingSTC = shared const Modifier!U; else static if (is(T U == shared const U)) alias ModifyTypePreservingTQ = shared const Modifier!U;
else static if (is(T U == shared U)) alias ModifyTypePreservingSTC = shared Modifier!U; else static if (is(T U == shared U)) alias ModifyTypePreservingTQ = shared Modifier!U;
else static if (is(T U == inout const U)) alias ModifyTypePreservingSTC = inout const Modifier!U; else static if (is(T U == inout const U)) alias ModifyTypePreservingTQ = inout const Modifier!U;
else static if (is(T U == inout U)) alias ModifyTypePreservingSTC = inout Modifier!U; else static if (is(T U == inout U)) alias ModifyTypePreservingTQ = inout Modifier!U;
else static if (is(T U == const U)) alias ModifyTypePreservingSTC = const Modifier!U; else static if (is(T U == const U)) alias ModifyTypePreservingTQ = const Modifier!U;
else alias ModifyTypePreservingSTC = Modifier!T; else alias ModifyTypePreservingTQ = Modifier!T;
} }
unittest unittest
{ {
alias Intify(T) = int; alias Intify(T) = int;
static assert(is(ModifyTypePreservingSTC!(Intify, real) == int)); static assert(is(ModifyTypePreservingTQ!(Intify, real) == int));
static assert(is(ModifyTypePreservingSTC!(Intify, const real) == const int)); static assert(is(ModifyTypePreservingTQ!(Intify, const real) == const int));
static assert(is(ModifyTypePreservingSTC!(Intify, inout real) == inout int)); static assert(is(ModifyTypePreservingTQ!(Intify, inout real) == inout int));
static assert(is(ModifyTypePreservingSTC!(Intify, inout const real) == inout const int)); static assert(is(ModifyTypePreservingTQ!(Intify, inout const real) == inout const int));
static assert(is(ModifyTypePreservingSTC!(Intify, shared real) == shared int)); static assert(is(ModifyTypePreservingTQ!(Intify, shared real) == shared int));
static assert(is(ModifyTypePreservingSTC!(Intify, shared const real) == shared const int)); static assert(is(ModifyTypePreservingTQ!(Intify, shared const real) == shared const int));
static assert(is(ModifyTypePreservingSTC!(Intify, shared inout real) == shared inout int)); static assert(is(ModifyTypePreservingTQ!(Intify, shared inout real) == shared inout int));
static assert(is(ModifyTypePreservingSTC!(Intify, shared inout const real) == shared inout const int)); static assert(is(ModifyTypePreservingTQ!(Intify, shared inout const real) == shared inout const int));
static assert(is(ModifyTypePreservingSTC!(Intify, immutable real) == immutable int)); static assert(is(ModifyTypePreservingTQ!(Intify, immutable real) == immutable int));
}
/**
* Copies type qualifiers from $(D FromType) to $(D ToType).
*
* Supported type qualifiers:
* $(UL
* $(LI $(D const))
* $(LI $(D inout))
* $(LI $(D immutable))
* $(LI $(D shared))
* )
* Examples:
* ---
* static assert(is(CopyTypeQualifiers!(inout const real, int) == inout const int));
* ---
*/
template CopyTypeQualifiers(FromType, ToType)
{
alias T(U) = ToType;
alias CopyTypeQualifiers = ModifyTypePreservingTQ!(T, FromType);
}
unittest
{
static assert(is(CopyTypeQualifiers!( real, int) == int));
static assert(is(CopyTypeQualifiers!( const real, int) == const int));
static assert(is(CopyTypeQualifiers!( inout real, int) == inout int));
static assert(is(CopyTypeQualifiers!( inout const real, int) == inout const int));
static assert(is(CopyTypeQualifiers!(shared real, int) == shared int));
static assert(is(CopyTypeQualifiers!(shared const real, int) == shared const int));
static assert(is(CopyTypeQualifiers!(shared inout real, int) == shared inout int));
static assert(is(CopyTypeQualifiers!(shared inout const real, int) == shared inout const int));
static assert(is(CopyTypeQualifiers!( immutable real, int) == immutable int));
} }
/** /**
@ -6012,7 +6055,7 @@ template OriginalType(T)
else alias Impl = T; else alias Impl = T;
} }
alias OriginalType = ModifyTypePreservingSTC!(Impl, T); alias OriginalType = ModifyTypePreservingTQ!(Impl, T);
} }
/// ///
@ -6083,7 +6126,7 @@ template Unsigned(T)
" does not have an Unsigned counterpart"); " does not have an Unsigned counterpart");
} }
alias Unsigned = ModifyTypePreservingSTC!(Impl, OriginalType!T); alias Unsigned = ModifyTypePreservingTQ!(Impl, OriginalType!T);
} }
unittest unittest
@ -6179,7 +6222,7 @@ template Signed(T)
" does not have an Signed counterpart"); " does not have an Signed counterpart");
} }
alias Signed = ModifyTypePreservingSTC!(Impl, OriginalType!T); alias Signed = ModifyTypePreservingTQ!(Impl, OriginalType!T);
} }
/// ///