Reduce template instantiations when importing std.bitmanip

This commit is contained in:
Andrei Alexandrescu 2021-05-07 19:47:28 -04:00 committed by Mathias LANG
parent f04cbc612f
commit 3c45f08ab6

View file

@ -786,7 +786,7 @@ if (is(T == class))
/** /**
Allows manipulating the fraction, exponent, and sign parts of a Allows manipulating the fraction, exponent, and sign parts of a
$(D_PARAM float) separately. The definition is: `float` separately. The definition is:
---- ----
struct FloatRep struct FloatRep
@ -803,17 +803,52 @@ struct FloatRep
} }
---- ----
*/ */
struct FloatRep alias FloatRep = FloatingPointRepresentation!float;
/**
Allows manipulating the fraction, exponent, and sign parts of a
`double` separately. The definition is:
----
struct DoubleRep
{ {
union union
{ {
float value; double value;
mixin(bitfields!( mixin(bitfields!(
uint, "fraction", 23, ulong, "fraction", 52,
ubyte, "exponent", 8, ushort, "exponent", 11,
bool, "sign", 1)); bool, "sign", 1));
}
enum uint bias = 1023, signBits = 1, fractionBits = 52, exponentBits = 11;
}
----
*/
alias DoubleRep = FloatingPointRepresentation!double;
private struct FloatingPointRepresentation(T)
{
static if (is(T == float))
{
enum uint bias = 127, fractionBits = 23, exponentBits = 8, signBits = 1;
alias FractionType = uint;
alias ExponentType = ubyte;
}
else
{
enum uint bias = 1023, fractionBits = 52, exponentBits = 11, signBits = 1;
alias FractionType = ulong;
alias ExponentType = ushort;
}
union
{
T value;
mixin(bitfields!(
FractionType, "fraction", fractionBits,
ExponentType, "exponent", exponentBits,
bool, "sign", signBits));
} }
enum uint bias = 127, fractionBits = 23, exponentBits = 8, signBits = 1;
} }
/// ///
@ -864,39 +899,6 @@ struct FloatRep
assert(rep.sign); assert(rep.sign);
} }
/**
Allows manipulating the fraction, exponent, and sign parts of a
$(D_PARAM double) separately. The definition is:
----
struct DoubleRep
{
union
{
double value;
mixin(bitfields!(
ulong, "fraction", 52,
ushort, "exponent", 11,
bool, "sign", 1));
}
enum uint bias = 1023, signBits = 1, fractionBits = 52, exponentBits = 11;
}
----
*/
struct DoubleRep
{
union
{
double value;
mixin(bitfields!(
ulong, "fraction", 52,
ushort, "exponent", 11,
bool, "sign", 1));
}
enum uint bias = 1023, signBits = 1, fractionBits = 52, exponentBits = 11;
}
/// ///
@safe unittest @safe unittest
{ {