conv: Use assertThrown to check ConvException is thrown
This commit is contained in:
parent
87ea1f98dc
commit
4bbc8b510a
@ -18,6 +18,11 @@ import tanya.memory;
|
|||||||
import tanya.memory.op;
|
import tanya.memory.op;
|
||||||
import tanya.meta.trait;
|
import tanya.meta.trait;
|
||||||
|
|
||||||
|
version (unittest)
|
||||||
|
{
|
||||||
|
import tanya.test.assertion;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs a new object of type $(D_PARAM T) in $(D_PARAM memory) with the
|
* Constructs a new object of type $(D_PARAM T) in $(D_PARAM memory) with the
|
||||||
* given arguments.
|
* given arguments.
|
||||||
@ -233,3 +238,308 @@ body
|
|||||||
}
|
}
|
||||||
static assert(is(typeof(emplace!F((void[]).init))));
|
static assert(is(typeof(emplace!F((void[]).init))));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Thrown if a type conversion fails.
|
||||||
|
*/
|
||||||
|
final class ConvException : Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Params:
|
||||||
|
* msg = The message for the exception.
|
||||||
|
* file = The file where the exception occurred.
|
||||||
|
* line = The line number where the exception occurred.
|
||||||
|
* next = The previous exception in the chain of exceptions, if any.
|
||||||
|
*/
|
||||||
|
this(string msg,
|
||||||
|
string file = __FILE__,
|
||||||
|
size_t line = __LINE__,
|
||||||
|
Throwable next = null) @nogc @safe pure nothrow
|
||||||
|
{
|
||||||
|
super(msg, file, line, next);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the source type $(D_PARAM From) and the target type $(D_PARAM To) are
|
||||||
|
* equal, does nothing. If $(D_PARAM From) can be implicitly converted to
|
||||||
|
* $(D_PARAM To), just returns $(D_PARAM from).
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* To = Target type.
|
||||||
|
*
|
||||||
|
* Returns: $(D_PARAM from).
|
||||||
|
*/
|
||||||
|
template to(To)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Params:
|
||||||
|
* From = Source type.
|
||||||
|
* from = Source value.
|
||||||
|
*/
|
||||||
|
ref To to(From)(ref From from)
|
||||||
|
if (is(To == From))
|
||||||
|
{
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// ditto
|
||||||
|
To to(From)(From from)
|
||||||
|
if (is(Unqual!To == Unqual!From) || (isNumeric!From && isFloatingPoint!To))
|
||||||
|
{
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
auto val = 5.to!int();
|
||||||
|
assert(val == 5);
|
||||||
|
static assert(is(typeof(val) == int));
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
int val = 5;
|
||||||
|
assert(val.to!int() == 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs checked conversion from an integral type $(D_PARAM From) to an
|
||||||
|
* integral type $(D_PARAM To).
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* From = Source type.
|
||||||
|
* To = Target type.
|
||||||
|
* from = Source value.
|
||||||
|
*
|
||||||
|
* Returns: $(D_PARAM from) converted to $(D_PARAM To).
|
||||||
|
*
|
||||||
|
* Throws: $(D_PSYMBOL ConvException) if $(D_PARAM from) is too small or too
|
||||||
|
* large to be represented by $(D_PARAM To).
|
||||||
|
*/
|
||||||
|
To to(To, From)(From from)
|
||||||
|
if (isIntegral!From
|
||||||
|
&& isIntegral!To
|
||||||
|
&& !is(Unqual!To == Unqual!From)
|
||||||
|
&& !is(To == enum))
|
||||||
|
{
|
||||||
|
static if ((isUnsigned!From && isSigned!To && From.sizeof == To.sizeof)
|
||||||
|
|| From.sizeof > To.sizeof)
|
||||||
|
{
|
||||||
|
if (from > To.max)
|
||||||
|
{
|
||||||
|
throw make!ConvException(defaultAllocator,
|
||||||
|
"Positive integer overflow");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static if (isSigned!From)
|
||||||
|
{
|
||||||
|
static if (isUnsigned!To)
|
||||||
|
{
|
||||||
|
if (from < 0)
|
||||||
|
{
|
||||||
|
throw make!ConvException(defaultAllocator,
|
||||||
|
"Negative integer overflow");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else static if (From.sizeof > To.sizeof)
|
||||||
|
{
|
||||||
|
if (from < To.min)
|
||||||
|
{
|
||||||
|
throw make!ConvException(defaultAllocator,
|
||||||
|
"Negative integer overflow");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static if (From.sizeof <= To.sizeof)
|
||||||
|
{
|
||||||
|
return from;
|
||||||
|
}
|
||||||
|
else static if (isSigned!To)
|
||||||
|
{
|
||||||
|
return cast(To) from;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return from & To.max;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
// ubyte -> ushort
|
||||||
|
assert((cast(ubyte) 0).to!ushort == 0);
|
||||||
|
assert((cast(ubyte) 1).to!ushort == 1);
|
||||||
|
assert((cast(ubyte) (ubyte.max - 1)).to!ushort == ubyte.max - 1);
|
||||||
|
assert((cast(ubyte) ubyte.max).to!ushort == ubyte.max);
|
||||||
|
|
||||||
|
// ubyte -> short
|
||||||
|
assert((cast(ubyte) 0).to!short == 0);
|
||||||
|
assert((cast(ubyte) 1).to!short == 1);
|
||||||
|
assert((cast(ubyte) (ubyte.max - 1)).to!short == ubyte.max - 1);
|
||||||
|
assert((cast(ubyte) ubyte.max).to!short == ubyte.max);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc pure @safe unittest
|
||||||
|
{
|
||||||
|
// ubyte <- ushort
|
||||||
|
assert((cast(ushort) 0).to!ubyte == 0);
|
||||||
|
assert((cast(ushort) 1).to!ubyte == 1);
|
||||||
|
assert((cast(ushort) (ubyte.max - 1)).to!ubyte == ubyte.max - 1);
|
||||||
|
assert((cast(ushort) ubyte.max).to!ubyte == ubyte.max);
|
||||||
|
|
||||||
|
// ubyte <- short
|
||||||
|
assert((cast(short) 0).to!ubyte == 0);
|
||||||
|
assert((cast(short) 1).to!ubyte == 1);
|
||||||
|
assert((cast(short) (ubyte.max - 1)).to!ubyte == ubyte.max - 1);
|
||||||
|
assert((cast(short) ubyte.max).to!ubyte == ubyte.max);
|
||||||
|
|
||||||
|
// short <-> int
|
||||||
|
assert(short.min.to!int == short.min);
|
||||||
|
assert((short.min + 1).to!int == short.min + 1);
|
||||||
|
assert((cast(short) -1).to!int == -1);
|
||||||
|
assert((cast(short) 0).to!int == 0);
|
||||||
|
assert((cast(short) 1).to!int == 1);
|
||||||
|
assert((short.max - 1).to!int == short.max - 1);
|
||||||
|
assert(short.max.to!int == short.max);
|
||||||
|
|
||||||
|
assert((cast(int) short.min).to!short == short.min);
|
||||||
|
assert((cast(int) short.min + 1).to!short == short.min + 1);
|
||||||
|
assert((cast(int) -1).to!short == -1);
|
||||||
|
assert((cast(int) 0).to!short == 0);
|
||||||
|
assert((cast(int) 1).to!short == 1);
|
||||||
|
assert((cast(int) short.max - 1).to!short == short.max - 1);
|
||||||
|
assert((cast(int) short.max).to!short == short.max);
|
||||||
|
|
||||||
|
// uint <-> int
|
||||||
|
assert((cast(uint) 0).to!int == 0);
|
||||||
|
assert((cast(uint) 1).to!int == 1);
|
||||||
|
assert((cast(uint) (int.max - 1)).to!int == int.max - 1);
|
||||||
|
assert((cast(uint) int.max).to!int == int.max);
|
||||||
|
|
||||||
|
assert((cast(int) 0).to!uint == 0);
|
||||||
|
assert((cast(int) 1).to!uint == 1);
|
||||||
|
assert((cast(int) (int.max - 1)).to!uint == int.max - 1);
|
||||||
|
assert((cast(int) int.max).to!uint == int.max);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc pure @safe unittest
|
||||||
|
{
|
||||||
|
assertThrown!ConvException(&to!(short, int), int.min);
|
||||||
|
assertThrown!ConvException(&to!(short, int), int.max);
|
||||||
|
assertThrown!ConvException(&to!(ushort, uint), uint.max);
|
||||||
|
assertThrown!ConvException(&to!(uint, int), -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
enum Test : int
|
||||||
|
{
|
||||||
|
one,
|
||||||
|
two,
|
||||||
|
}
|
||||||
|
assert(Test.one.to!int == 0);
|
||||||
|
assert(Test.two.to!int == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a floating point number to an integral type.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* From = Source type.
|
||||||
|
* To = Target type.
|
||||||
|
* from = Source value.
|
||||||
|
*
|
||||||
|
* Returns: Truncated $(D_PARAM from) (everything after the decimal point is
|
||||||
|
* dropped).
|
||||||
|
*
|
||||||
|
* Throws: $(D_PSYMBOL ConvException) if
|
||||||
|
* $(D_INLINECODE from < To.min || from > To.max).
|
||||||
|
*/
|
||||||
|
To to(To, From)(From from)
|
||||||
|
if (isFloatingPoint!From
|
||||||
|
&& isIntegral!To
|
||||||
|
&& !is(Unqual!To == Unqual!From)
|
||||||
|
&& !is(To == enum))
|
||||||
|
{
|
||||||
|
if (from > To.max)
|
||||||
|
{
|
||||||
|
throw make!ConvException(defaultAllocator,
|
||||||
|
"Positive number overflow");
|
||||||
|
}
|
||||||
|
else if (from < To.min)
|
||||||
|
{
|
||||||
|
throw make!ConvException(defaultAllocator,
|
||||||
|
"Negative number overflow");
|
||||||
|
}
|
||||||
|
return cast(To) from;
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
@nogc pure @safe unittest
|
||||||
|
{
|
||||||
|
assert(1.5.to!int == 1);
|
||||||
|
assert(2147483646.5.to!int == 2147483646);
|
||||||
|
assert((-2147483647.5).to!int == -2147483647);
|
||||||
|
assert(2147483646.5.to!uint == 2147483646);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc pure @safe unittest
|
||||||
|
{
|
||||||
|
assertThrown!ConvException(&to!(int, double), 2147483647.5);
|
||||||
|
assertThrown!ConvException(&to!(int, double), -2147483648.5);
|
||||||
|
assertThrown!ConvException(&to!(uint, double), -21474.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs checked conversion from an integral type $(D_PARAM From) to an
|
||||||
|
* $(D_KEYWORD enum).
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* From = Source type.
|
||||||
|
* To = Target type.
|
||||||
|
* from = Source value.
|
||||||
|
*
|
||||||
|
* Returns: $(D_KEYWORD enum) value.
|
||||||
|
*
|
||||||
|
* Throws: $(D_PSYMBOL ConvException) if $(D_PARAM from) is not a member of
|
||||||
|
* $(D_PSYMBOL To).
|
||||||
|
*/
|
||||||
|
To to(To, From)(From from)
|
||||||
|
if (isIntegral!From && is(To == enum))
|
||||||
|
{
|
||||||
|
foreach (m; EnumMembers!To)
|
||||||
|
{
|
||||||
|
if (from == m)
|
||||||
|
{
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw make!ConvException(defaultAllocator,
|
||||||
|
"Value not found in enum '" ~ To.stringof ~ "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
@nogc pure @safe unittest
|
||||||
|
{
|
||||||
|
enum Test : int
|
||||||
|
{
|
||||||
|
one,
|
||||||
|
two,
|
||||||
|
}
|
||||||
|
static assert(is(typeof(1.to!Test) == Test));
|
||||||
|
assert(0.to!Test == Test.one);
|
||||||
|
assert(1.to!Test == Test.two);
|
||||||
|
}
|
||||||
|
|
||||||
|
@nogc pure @safe unittest
|
||||||
|
{
|
||||||
|
enum Test : uint
|
||||||
|
{
|
||||||
|
one,
|
||||||
|
two,
|
||||||
|
}
|
||||||
|
assertThrown!ConvException(&to!(Test, int), 5);
|
||||||
|
}
|
||||||
|
@ -20,6 +20,11 @@ import tanya.memory.op;
|
|||||||
import tanya.meta.trait;
|
import tanya.meta.trait;
|
||||||
import tanya.meta.transform;
|
import tanya.meta.transform;
|
||||||
|
|
||||||
|
version (unittest)
|
||||||
|
{
|
||||||
|
import tanya.test.assertion;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Thrown if a type conversion fails.
|
* Thrown if a type conversion fails.
|
||||||
*/
|
*/
|
||||||
@ -51,6 +56,7 @@ final class ConvException : Exception
|
|||||||
*
|
*
|
||||||
* Returns: $(D_PARAM from).
|
* Returns: $(D_PARAM from).
|
||||||
*/
|
*/
|
||||||
|
deprecated("Use tanya.conv.to instead")
|
||||||
template to(To)
|
template to(To)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -72,20 +78,6 @@ template to(To)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
|
||||||
pure nothrow @safe @nogc unittest
|
|
||||||
{
|
|
||||||
auto val = 5.to!int();
|
|
||||||
assert(val == 5);
|
|
||||||
static assert(is(typeof(val) == int));
|
|
||||||
}
|
|
||||||
|
|
||||||
private pure nothrow @safe @nogc unittest
|
|
||||||
{
|
|
||||||
int val = 5;
|
|
||||||
assert(val.to!int() == 5);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs checked conversion from an integral type $(D_PARAM From) to an
|
* Performs checked conversion from an integral type $(D_PARAM From) to an
|
||||||
* integral type $(D_PARAM To).
|
* integral type $(D_PARAM To).
|
||||||
@ -100,6 +92,7 @@ private pure nothrow @safe @nogc unittest
|
|||||||
* Throws: $(D_PSYMBOL ConvException) if $(D_PARAM from) is too small or too
|
* Throws: $(D_PSYMBOL ConvException) if $(D_PARAM from) is too small or too
|
||||||
* large to be represented by $(D_PARAM To).
|
* large to be represented by $(D_PARAM To).
|
||||||
*/
|
*/
|
||||||
|
deprecated("Use tanya.conv.to instead")
|
||||||
To to(To, From)(From from)
|
To to(To, From)(From from)
|
||||||
if (isIntegral!From
|
if (isIntegral!From
|
||||||
&& isIntegral!To
|
&& isIntegral!To
|
||||||
@ -148,135 +141,6 @@ if (isIntegral!From
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private pure nothrow @safe @nogc unittest
|
|
||||||
{
|
|
||||||
// ubyte -> ushort
|
|
||||||
assert((cast(ubyte) 0).to!ushort == 0);
|
|
||||||
assert((cast(ubyte) 1).to!ushort == 1);
|
|
||||||
assert((cast(ubyte) (ubyte.max - 1)).to!ushort == ubyte.max - 1);
|
|
||||||
assert((cast(ubyte) ubyte.max).to!ushort == ubyte.max);
|
|
||||||
|
|
||||||
// ubyte -> short
|
|
||||||
assert((cast(ubyte) 0).to!short == 0);
|
|
||||||
assert((cast(ubyte) 1).to!short == 1);
|
|
||||||
assert((cast(ubyte) (ubyte.max - 1)).to!short == ubyte.max - 1);
|
|
||||||
assert((cast(ubyte) ubyte.max).to!short == ubyte.max);
|
|
||||||
}
|
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
// ubyte <- ushort
|
|
||||||
assert((cast(ushort) 0).to!ubyte == 0);
|
|
||||||
assert((cast(ushort) 1).to!ubyte == 1);
|
|
||||||
assert((cast(ushort) (ubyte.max - 1)).to!ubyte == ubyte.max - 1);
|
|
||||||
assert((cast(ushort) ubyte.max).to!ubyte == ubyte.max);
|
|
||||||
|
|
||||||
// ubyte <- short
|
|
||||||
assert((cast(short) 0).to!ubyte == 0);
|
|
||||||
assert((cast(short) 1).to!ubyte == 1);
|
|
||||||
assert((cast(short) (ubyte.max - 1)).to!ubyte == ubyte.max - 1);
|
|
||||||
assert((cast(short) ubyte.max).to!ubyte == ubyte.max);
|
|
||||||
|
|
||||||
// short <-> int
|
|
||||||
assert(short.min.to!int == short.min);
|
|
||||||
assert((short.min + 1).to!int == short.min + 1);
|
|
||||||
assert((cast(short) -1).to!int == -1);
|
|
||||||
assert((cast(short) 0).to!int == 0);
|
|
||||||
assert((cast(short) 1).to!int == 1);
|
|
||||||
assert((short.max - 1).to!int == short.max - 1);
|
|
||||||
assert(short.max.to!int == short.max);
|
|
||||||
|
|
||||||
assert((cast(int) short.min).to!short == short.min);
|
|
||||||
assert((cast(int) short.min + 1).to!short == short.min + 1);
|
|
||||||
assert((cast(int) -1).to!short == -1);
|
|
||||||
assert((cast(int) 0).to!short == 0);
|
|
||||||
assert((cast(int) 1).to!short == 1);
|
|
||||||
assert((cast(int) short.max - 1).to!short == short.max - 1);
|
|
||||||
assert((cast(int) short.max).to!short == short.max);
|
|
||||||
|
|
||||||
// uint <-> int
|
|
||||||
assert((cast(uint) 0).to!int == 0);
|
|
||||||
assert((cast(uint) 1).to!int == 1);
|
|
||||||
assert((cast(uint) (int.max - 1)).to!int == int.max - 1);
|
|
||||||
assert((cast(uint) int.max).to!int == int.max);
|
|
||||||
|
|
||||||
assert((cast(int) 0).to!uint == 0);
|
|
||||||
assert((cast(int) 1).to!uint == 1);
|
|
||||||
assert((cast(int) (int.max - 1)).to!uint == int.max - 1);
|
|
||||||
assert((cast(int) int.max).to!uint == int.max);
|
|
||||||
}
|
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert(int.min.to!short == int.min);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert(int.max.to!short == int.max);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert(uint.max.to!ushort == ushort.max);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert((-1).to!uint == -1);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private @nogc unittest
|
|
||||||
{
|
|
||||||
enum Test : int
|
|
||||||
{
|
|
||||||
one,
|
|
||||||
two,
|
|
||||||
}
|
|
||||||
assert(Test.one.to!int == 0);
|
|
||||||
assert(Test.two.to!int == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts $(D_PARAM from) to a boolean.
|
* Converts $(D_PARAM from) to a boolean.
|
||||||
*
|
*
|
||||||
@ -317,7 +181,7 @@ if (isNumeric!From && is(Unqual!To == bool) && !is(Unqual!To == Unqual!From))
|
|||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@nogc unittest
|
@nogc pure @safe unittest
|
||||||
{
|
{
|
||||||
assert(!0.0.to!bool);
|
assert(!0.0.to!bool);
|
||||||
assert(0.2.to!bool);
|
assert(0.2.to!bool);
|
||||||
@ -328,34 +192,10 @@ if (isNumeric!From && is(Unqual!To == bool) && !is(Unqual!To == Unqual!From))
|
|||||||
assert(1.to!bool);
|
assert(1.to!bool);
|
||||||
}
|
}
|
||||||
|
|
||||||
private @nogc unittest
|
@nogc pure @safe unittest
|
||||||
{
|
{
|
||||||
ConvException exception;
|
assertThrown!ConvException(&to!(bool, int), -1);
|
||||||
try
|
assertThrown!ConvException(&to!(bool, int), 2);
|
||||||
{
|
|
||||||
assert((-1).to!bool);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private @nogc unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert(2.to!bool);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ditto
|
/// ditto
|
||||||
@ -375,7 +215,7 @@ if ((is(From == String) || isSomeString!From) && is(Unqual!To == bool))
|
|||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@nogc unittest
|
@nogc pure @safe unittest
|
||||||
{
|
{
|
||||||
assert("true".to!bool);
|
assert("true".to!bool);
|
||||||
assert(!"false".to!bool);
|
assert(!"false".to!bool);
|
||||||
@ -384,19 +224,9 @@ if ((is(From == String) || isSomeString!From) && is(Unqual!To == bool))
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private @nogc unittest
|
@nogc pure @safe unittest
|
||||||
{
|
{
|
||||||
ConvException exception;
|
assertThrown!ConvException(() => "1".to!bool);
|
||||||
try
|
|
||||||
{
|
|
||||||
assert("1".to!bool);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -422,7 +252,7 @@ if (is(Unqual!From == bool) && isNumeric!To && !is(Unqual!To == Unqual!From))
|
|||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
pure nothrow @safe @nogc unittest
|
@nogc nothrow pure @safe unittest
|
||||||
{
|
{
|
||||||
assert(true.to!float == 1.0);
|
assert(true.to!float == 1.0);
|
||||||
assert(true.to!double == 1.0);
|
assert(true.to!double == 1.0);
|
||||||
@ -451,13 +281,13 @@ if (is(Unqual!From == bool) && is(Unqual!To == String))
|
|||||||
}
|
}
|
||||||
|
|
||||||
///
|
///
|
||||||
@nogc unittest
|
@nogc nothrow pure @safe unittest
|
||||||
{
|
{
|
||||||
assert(true.to!String == "true");
|
assert(true.to!String == "true");
|
||||||
assert(false.to!String == "false");
|
assert(false.to!String == "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
private @nogc unittest
|
@nogc nothrow pure @safe unittest
|
||||||
{
|
{
|
||||||
static assert(is(typeof((const String("true")).to!bool)));
|
static assert(is(typeof((const String("true")).to!bool)));
|
||||||
static assert(is(typeof(false.to!(const String) == "false")));
|
static assert(is(typeof(false.to!(const String) == "false")));
|
||||||
@ -477,6 +307,7 @@ private @nogc unittest
|
|||||||
* Throws: $(D_PSYMBOL ConvException) if
|
* Throws: $(D_PSYMBOL ConvException) if
|
||||||
* $(D_INLINECODE from < To.min || from > To.max).
|
* $(D_INLINECODE from < To.min || from > To.max).
|
||||||
*/
|
*/
|
||||||
|
deprecated("Use tanya.conv.to instead")
|
||||||
To to(To, From)(From from)
|
To to(To, From)(From from)
|
||||||
if (isFloatingPoint!From
|
if (isFloatingPoint!From
|
||||||
&& isIntegral!To
|
&& isIntegral!To
|
||||||
@ -496,60 +327,6 @@ if (isFloatingPoint!From
|
|||||||
return cast(To) from;
|
return cast(To) from;
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
|
||||||
@nogc unittest
|
|
||||||
{
|
|
||||||
assert(1.5.to!int == 1);
|
|
||||||
assert(2147483646.5.to!int == 2147483646);
|
|
||||||
assert((-2147483647.5).to!int == -2147483647);
|
|
||||||
assert(2147483646.5.to!uint == 2147483646);
|
|
||||||
}
|
|
||||||
|
|
||||||
private @nogc unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert(2147483647.5.to!int == 2147483647);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private @nogc unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert((-2147483648.5).to!int == -2147483648);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
private @nogc unittest
|
|
||||||
{
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert((-21474.5).to!uint == -21474);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs checked conversion from an integral type $(D_PARAM From) to an
|
* Performs checked conversion from an integral type $(D_PARAM From) to an
|
||||||
* $(D_KEYWORD enum).
|
* $(D_KEYWORD enum).
|
||||||
@ -564,6 +341,7 @@ private @nogc unittest
|
|||||||
* Throws: $(D_PSYMBOL ConvException) if $(D_PARAM from) is not a member of
|
* Throws: $(D_PSYMBOL ConvException) if $(D_PARAM from) is not a member of
|
||||||
* $(D_PSYMBOL To).
|
* $(D_PSYMBOL To).
|
||||||
*/
|
*/
|
||||||
|
deprecated("Use tanya.conv.to instead")
|
||||||
To to(To, From)(From from)
|
To to(To, From)(From from)
|
||||||
if (isIntegral!From && is(To == enum))
|
if (isIntegral!From && is(To == enum))
|
||||||
{
|
{
|
||||||
@ -578,40 +356,6 @@ if (isIntegral!From && is(To == enum))
|
|||||||
"Value not found in enum '" ~ To.stringof ~ "'");
|
"Value not found in enum '" ~ To.stringof ~ "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
///
|
|
||||||
@nogc unittest
|
|
||||||
{
|
|
||||||
enum Test : int
|
|
||||||
{
|
|
||||||
one,
|
|
||||||
two,
|
|
||||||
}
|
|
||||||
static assert(is(typeof(1.to!Test) == Test));
|
|
||||||
assert(0.to!Test == Test.one);
|
|
||||||
assert(1.to!Test == Test.two);
|
|
||||||
}
|
|
||||||
|
|
||||||
private @nogc unittest
|
|
||||||
{
|
|
||||||
enum Test : uint
|
|
||||||
{
|
|
||||||
one,
|
|
||||||
two,
|
|
||||||
}
|
|
||||||
|
|
||||||
ConvException exception;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
assert(5.to!Test == Test.one);
|
|
||||||
}
|
|
||||||
catch (ConvException e)
|
|
||||||
{
|
|
||||||
exception = e;
|
|
||||||
}
|
|
||||||
assert(exception !is null);
|
|
||||||
defaultAllocator.dispose(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the last part of buffer with converted number.
|
// Returns the last part of buffer with converted number.
|
||||||
package(tanya) char[] number2String(T)(const T number,
|
package(tanya) char[] number2String(T)(const T number,
|
||||||
return ref char[21] buffer)
|
return ref char[21] buffer)
|
||||||
@ -679,7 +423,7 @@ if (isIntegral!T)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Converting an integer to string.
|
// Converting an integer to string.
|
||||||
private pure nothrow @system @nogc unittest
|
@nogc nothrow pure @system unittest
|
||||||
{
|
{
|
||||||
char[21] buf;
|
char[21] buf;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user