summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorEugen Wissner <belka@caraus.de>2017-10-24 11:50:32 +0200
committerEugen Wissner <belka@caraus.de>2017-10-24 11:50:32 +0200
commit0d69c7fc79b639fae010226cf6a0462a8aed1096 (patch)
tree3010b15ff58fc6401ed49e542a1bafdfb51f0056 /source
parentb023146cb301842612f50a1e9d0b7b5c7ca10eaa (diff)
downloadtanya-0d69c7fc79b639fae010226cf6a0462a8aed1096.tar.gz
Make math.mp.Integer pure
Diffstat (limited to 'source')
-rw-r--r--source/tanya/math/mp.d87
1 files changed, 47 insertions, 40 deletions
diff --git a/source/tanya/math/mp.d b/source/tanya/math/mp.d
index 0ffab1b..f7d4b76 100644
--- a/source/tanya/math/mp.d
+++ b/source/tanya/math/mp.d
@@ -104,7 +104,7 @@ struct Integer
}
/// ditto
- this(shared Allocator allocator) pure nothrow @safe @nogc
+ this(shared Allocator allocator) @nogc nothrow pure @safe
in
{
assert(allocator !is null);
@@ -156,7 +156,7 @@ struct Integer
}
///
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
ubyte[8] range = [ 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xdd, 0xee ];
auto integer = Integer(Sign.positive, range[]);
@@ -187,7 +187,7 @@ struct Integer
}
///
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
{
ubyte[8] range = [ 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xdd, 0xee ];
@@ -204,7 +204,7 @@ struct Integer
/**
* Copies the integer.
*/
- this(this) nothrow @trusted @nogc
+ this(this) @nogc nothrow pure @safe
{
auto tmp = allocator.resize!digit(null, this.size);
this.rep[0 .. this.size].copy(tmp);
@@ -214,7 +214,7 @@ struct Integer
/**
* Destroys the integer.
*/
- ~this() nothrow @trusted @nogc
+ ~this() @nogc nothrow pure @safe
{
allocator.resize(this.rep, 0);
}
@@ -224,7 +224,7 @@ struct Integer
];
// Counts the number of LSBs before the first non-zero bit.
- private ptrdiff_t countLSBs() const pure nothrow @safe @nogc
+ private ptrdiff_t countLSBs() const @nogc nothrow pure @safe
{
if (this.size == 0)
{
@@ -256,7 +256,7 @@ struct Integer
/**
* Returns: Number of bytes in the two's complement representation.
*/
- @property size_t length() const pure nothrow @safe @nogc
+ @property size_t length() const @nogc nothrow pure @safe
{
if (this.sign)
{
@@ -280,7 +280,7 @@ struct Integer
}
///
- private nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
{
Integer i;
@@ -336,7 +336,7 @@ struct Integer
}
/// ditto
- ref Integer opAssign(T)(ref T value) @trusted
+ ref Integer opAssign(T)(ref T value)
if (is(Unqual!T == Integer))
{
this.rep = allocator.resize(this.rep, value.size);
@@ -348,7 +348,7 @@ struct Integer
}
/// ditto
- ref Integer opAssign(T)(T value) nothrow @safe @nogc
+ ref Integer opAssign(T)(T value)
if (is(T == Integer))
{
swap(this.rep, value.rep);
@@ -393,7 +393,7 @@ struct Integer
}
///
- @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto integer = Integer(79);
assert(cast(ushort) integer == 79);
@@ -424,7 +424,7 @@ struct Integer
* Typically very fast. Also fixes the sign if there
* are no more leading digits
*/
- void contract() nothrow @safe @nogc
+ void contract() @nogc nothrow pure @safe
{
/* decrease size while the most significant digit is
* zero.
@@ -441,7 +441,7 @@ struct Integer
}
}
- private void grow(const size_t size) nothrow @trusted @nogc
+ private void grow(const size_t size) @nogc nothrow pure @safe
{
if (this.rep.length >= size)
{
@@ -452,7 +452,7 @@ struct Integer
this.rep[oldLength .. $].fill(digit.init);
}
- private size_t countBits() const pure nothrow @safe @nogc
+ private size_t countBits() const @nogc nothrow pure @safe
{
if (this.size == 0)
{
@@ -470,7 +470,7 @@ struct Integer
}
private void add(ref const Integer summand, ref Integer sum)
- const nothrow @safe @nogc
+ const @nogc nothrow pure @safe
{
const(digit)[] max, min;
@@ -521,7 +521,7 @@ struct Integer
}
private void add(const digit summand, ref Integer sum)
- const nothrow @safe @nogc
+ const @nogc nothrow pure @safe
{
sum.grow(this.size + 2);
@@ -547,7 +547,7 @@ struct Integer
}
private void subtract(ref const Integer subtrahend, ref Integer difference)
- const nothrow @safe @nogc
+ const @nogc nothrow pure @safe
{
difference.grow(this.size);
@@ -583,7 +583,7 @@ struct Integer
}
private void subtract(const digit subtrahend, ref Integer difference)
- const nothrow @safe @nogc
+ const @nogc nothrow pure @safe
{
difference.grow(this.size);
@@ -612,7 +612,7 @@ struct Integer
}
// Compare the magnitude.
- private int compare(ref const Integer that) const pure nothrow @safe @nogc
+ private int compare(ref const Integer that) const @nogc nothrow pure @safe
{
if (this.size > that.size)
{
@@ -661,7 +661,7 @@ struct Integer
}
///
- @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto integer1 = Integer(1019);
auto integer2 = Integer(1019);
@@ -707,7 +707,7 @@ struct Integer
}
///
- @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto integer = Integer(1019);
@@ -731,7 +731,7 @@ struct Integer
}
///
- @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto integer = Integer(1019);
@@ -767,7 +767,7 @@ struct Integer
}
///
- unittest
+ @nogc nothrow pure @safe unittest
{
{
auto h1 = Integer(1019);
@@ -809,7 +809,7 @@ struct Integer
}
///
- unittest
+ @nogc nothrow pure @safe unittest
{
{
auto h1 = Integer(3);
@@ -853,7 +853,7 @@ struct Integer
}
///
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto h1 = Integer(123);
auto h2 = Integer(456);
@@ -885,7 +885,7 @@ struct Integer
return this;
}
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto h1 = Integer(18);
auto h2 = Integer(4);
@@ -937,7 +937,7 @@ struct Integer
}
///
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto integer = Integer(4294967294);
integer >>= 10;
@@ -1005,7 +1005,7 @@ struct Integer
}
///
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto integer = Integer(4294967295);
integer <<= 1;
@@ -1049,7 +1049,7 @@ struct Integer
}
//
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
auto h1 = Integer(79);
Integer h2;
@@ -1102,7 +1102,7 @@ struct Integer
}
///
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
Integer integer;
@@ -1172,7 +1172,7 @@ struct Integer
}
// Shift right a certain amount of digits.
- private void shiftRight(const size_t operand) nothrow @safe @nogc
+ private void shiftRight(const size_t operand) @nogc nothrow pure @safe
{
if (operand == 0)
{
@@ -1191,7 +1191,7 @@ struct Integer
}
// Shift left a certain amount of digits.
- private void shiftLeft(const size_t operand) nothrow @safe @nogc
+ private void shiftLeft(const size_t operand) @nogc nothrow pure @safe
{
if (operand == 0)
{
@@ -1213,7 +1213,7 @@ struct Integer
}
private void multiply(const digit factor, ref Integer product)
- const nothrow @safe @nogc
+ const @nogc nothrow pure @safe
{
product.grow(this.size + 1);
product.sign = this.sign;
@@ -1239,7 +1239,7 @@ struct Integer
private void multiply(ref const Integer factor,
ref Integer product,
- const size_t digits) const nothrow @safe @nogc
+ const size_t digits) const @nogc nothrow pure @safe
{
Integer intermediate;
intermediate.grow(digits);
@@ -1270,8 +1270,7 @@ struct Integer
private void divide(Q, ARGS...)(ref const Integer divisor,
auto ref Q quotient,
- ref ARGS args)
- const nothrow @safe @nogc
+ ref ARGS args) const
if ((is(Q : typeof(null))
|| (is(Q : Integer) && __traits(isRef, quotient)))
&& (ARGS.length == 0 || (ARGS.length == 1 && is(ARGS[0] : Integer))))
@@ -1404,7 +1403,7 @@ struct Integer
}
}
- private Integer square() nothrow @safe @nogc
+ private Integer square() @nogc nothrow pure @safe
{
Integer result;
const resultSize = 2 * this.size + 1;
@@ -1444,7 +1443,7 @@ struct Integer
}
// Returns 2^^n.
- private Integer exp2(size_t n) const nothrow @safe @nogc
+ private Integer exp2(size_t n) const @nogc nothrow pure @safe
{
auto ret = Integer(allocator);
const bytes = n / digitBitCount;
@@ -1459,7 +1458,7 @@ struct Integer
/**
* Returns: Two's complement representation of the integer.
*/
- Array!ubyte toArray() const nothrow @safe @nogc
+ Array!ubyte toArray() const @nogc nothrow pure @safe
out (array)
{
assert(array.length == length);
@@ -1512,7 +1511,7 @@ struct Integer
}
///
- nothrow @safe @nogc unittest
+ @nogc nothrow pure @safe unittest
{
{
auto integer = Integer(0x66778899aabbddee);
@@ -1521,6 +1520,14 @@ struct Integer
auto array = integer.toArray();
assert(equal(array[], expected[]));
}
+ }
+
+ @nogc nothrow pure @safe unittest
+ {
+ {
+ Integer integer;
+ assert(integer.toArray().length == 0);
+ }
{
auto integer = Integer(0x03);
ubyte[1] expected = [ 0x03 ];