Better casts?
Mehrdad
wfunction at hotmail.com
Wed Jun 6 20:41:51 PDT 2012
I've made a bunch of new casts and templates that IMHO should be
added to traits.d.
What do people think?
ref auto Mutable!(T) mutable(T)(ref auto T v) { return
cast(typeof(return))v; }
unittest
{
int x = 5;
static assert(is(typeof(mutable(x)) == typeof(x)));
static assert(is(typeof(mutable(cast(immutable)x)) ==
typeof(x)));
static assert(is(typeof(mutable(cast(shared)x)) ==
shared(typeof(x))));
static assert(is(typeof(mutable(x) = x) == typeof(x)));
}
ref auto Unconst!(T) unconst(T)(ref auto T v) { return
cast(typeof(return))v; }
unittest
{
int x = 5;
static assert(is(typeof(unconst(x)) == typeof(x)));
static assert(is(typeof(unconst(cast(const)x)) == typeof(x)));
static assert(is(typeof(unconst(cast(immutable)x)) ==
immutable(typeof(x))));
static assert(is(typeof(unconst(x) = x) == typeof(x)));
}
ref auto Unshared!(T) unshared(T)(ref auto T v) { return
cast(typeof(return))v; }
unittest
{
int x = 5;
static assert(is(typeof(unshared(x)) == typeof(x)));
static assert(is(typeof(unshared(cast(shared)x)) == typeof(x)));
static assert(is(typeof(unshared(cast(immutable)x)) ==
immutable(typeof(x))));
static assert(is(typeof(unshared(x) = x) == typeof(x)));
}
template Unconst(T)
{
static if (is(T U == const U)) { alias U Unconst; }
else { alias T Unconst; }
}
unittest
{
static assert(is(Unconst!(const(int*)) == const(int)*));
}
template Unshared(T)
{
static if (is(T U == shared U)) { alias U Unshared; }
else { alias T Unshared; }
}
unittest
{
static assert(is(Unshared!(shared(int*)) == shared(int)*));
}
template Mutable(T)
{
static if (is(T U == immutable U)) { alias U Mutable; }
else { alias T Mutable; }
}
unittest
{
static assert(is(Mutable!(immutable(int*)) == immutable(int)*));
static assert(is(Mutable!(const(shared(int))) ==
const(shared(int))));
}
template WithQual(T, F)
{
static if (is(F U == const U) && !is(T == const T)) { alias
WithQual!(const T, F) WithQual; }
else static if (is(F U == shared U) && !is(T == shared T)) {
alias WithQual!(shared T, F) WithQual; }
else static if (is(F U == immutable U) && !is(T == immutable T))
{ alias WithQual!(immutable T, F) WithQual; }
else { alias T WithQual; }
}
unittest
{
static assert(is(WithQual!(int, const int) == const int));
static assert(is(WithQual!(int, shared int) == shared int));
static assert(is(WithQual!(int, immutable int) == immutable
int));
}
More information about the Digitalmars-d
mailing list