Fix #247
Assigning RefCounted to RefCounted fails at compile time. https://issues.caraus.io/issues/247
This commit is contained in:
parent
7d5dda1cba
commit
ede0107fd7
@ -1,3 +1,4 @@
|
||||
ignore:
|
||||
- "source/tanya/async/event/iocp.d"
|
||||
- "source/tanya/async/iocp.d"
|
||||
- "source/tanya/memory/types.d"
|
||||
|
@ -38,7 +38,7 @@ package final class RefCountedStore(T)
|
||||
size_t counter = 1;
|
||||
|
||||
size_t opUnary(string op)()
|
||||
if (op == "--" || op == "++")
|
||||
if (op == "--" || op == "++")
|
||||
in
|
||||
{
|
||||
assert(counter > 0);
|
||||
@ -63,6 +63,15 @@ package final class RefCountedStore(T)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
private unittest
|
||||
{
|
||||
auto rcs = defaultAllocator.make!(RefCountedStore!int);
|
||||
assert(rcs >= 1);
|
||||
assert(rcs > 0);
|
||||
assert(!(rcs > 2));
|
||||
defaultAllocator.dispose(rcs);
|
||||
}
|
||||
}
|
||||
|
||||
package void separateDeleter(T)(RefCountedStore!T storage,
|
||||
@ -180,7 +189,7 @@ struct RefCounted(T)
|
||||
*
|
||||
* Returns: $(D_KEYWORD this).
|
||||
*/
|
||||
ref typeof(this) opAssign()(auto ref Payload!T rhs)
|
||||
ref typeof(this) opAssign(Payload!T rhs)
|
||||
{
|
||||
if (this.storage is null)
|
||||
{
|
||||
@ -198,18 +207,18 @@ struct RefCounted(T)
|
||||
finalize(this.storage.payload);
|
||||
this.storage.payload = Payload!T.init;
|
||||
}
|
||||
move(rhs, this.storage.payload);
|
||||
this.storage.payload = rhs;
|
||||
return this;
|
||||
}
|
||||
|
||||
private unittest
|
||||
private @nogc unittest
|
||||
{
|
||||
auto rc = defaultAllocator.refCounted!int(5);
|
||||
rc = defaultAllocator.make!int(7);
|
||||
assert(*rc == 7);
|
||||
}
|
||||
|
||||
private unittest
|
||||
private @nogc unittest
|
||||
{
|
||||
auto rc = defaultAllocator.refCounted!int(5);
|
||||
|
||||
@ -289,12 +298,12 @@ struct RefCounted(T)
|
||||
* Returns: Reference to the pointed value.
|
||||
*/
|
||||
ref inout(T) opUnary(string op)() inout
|
||||
if (op == "*");
|
||||
if (op == "*");
|
||||
}
|
||||
else static if (isPointer!(Payload!T))
|
||||
{
|
||||
ref inout(T) opUnary(string op)() inout
|
||||
if (op == "*")
|
||||
if (op == "*")
|
||||
{
|
||||
return *this.storage.payload;
|
||||
}
|
||||
@ -340,6 +349,12 @@ unittest
|
||||
assert(*rc.storage.payload == 9);
|
||||
}
|
||||
|
||||
private unittest
|
||||
{
|
||||
RefCounted!int rc1, rc2;
|
||||
static assert(is(typeof(rc1 = rc2)));
|
||||
}
|
||||
|
||||
version (unittest)
|
||||
{
|
||||
private class A
|
||||
@ -468,8 +483,8 @@ private unittest
|
||||
* Precondition: $(D_INLINECODE allocator !is null)
|
||||
*/
|
||||
RefCounted!T refCounted(T, A...)(shared Allocator allocator, auto ref A args)
|
||||
if (!is(T == interface) && !isAbstractClass!T
|
||||
&& !isAssociativeArray!T && !isArray!T)
|
||||
if (!is(T == interface) && !isAbstractClass!T
|
||||
&& !isAssociativeArray!T && !isArray!T)
|
||||
in
|
||||
{
|
||||
assert(allocator !is null);
|
||||
@ -521,7 +536,7 @@ body
|
||||
*/
|
||||
RefCounted!T refCounted(T)(shared Allocator allocator, const size_t size)
|
||||
@trusted
|
||||
if (isArray!T)
|
||||
if (isArray!T)
|
||||
in
|
||||
{
|
||||
assert(allocator !is null);
|
||||
@ -690,11 +705,10 @@ struct Unique(T)
|
||||
*
|
||||
* Returns: $(D_KEYWORD this).
|
||||
*/
|
||||
ref typeof(this) opAssign()(auto ref Payload!T rhs)
|
||||
ref typeof(this) opAssign(Payload!T rhs)
|
||||
{
|
||||
allocator.dispose(this.payload);
|
||||
move(rhs, this.payload);
|
||||
|
||||
this.payload = rhs;
|
||||
return this;
|
||||
}
|
||||
|
||||
@ -734,12 +748,12 @@ struct Unique(T)
|
||||
* Returns: Reference to the pointed value.
|
||||
*/
|
||||
ref inout(T) opUnary(string op)() inout
|
||||
if (op == "*");
|
||||
if (op == "*");
|
||||
}
|
||||
else static if (isPointer!(Payload!T))
|
||||
{
|
||||
ref inout(T) opUnary(string op)() inout
|
||||
if (op == "*")
|
||||
if (op == "*")
|
||||
{
|
||||
return *this.payload;
|
||||
}
|
||||
@ -761,7 +775,7 @@ struct Unique(T)
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets this $(D_PARAM Unique) to its initial state.
|
||||
* Sets the internal pointer to $(D_KEYWORD). The allocator isn't changed.
|
||||
*
|
||||
* Returns: Reference to the owned object.
|
||||
*/
|
||||
@ -830,8 +844,8 @@ struct Unique(T)
|
||||
* Precondition: $(D_INLINECODE allocator !is null)
|
||||
*/
|
||||
Unique!T unique(T, A...)(shared Allocator allocator, auto ref A args)
|
||||
if (!is(T == interface) && !isAbstractClass!T
|
||||
&& !isAssociativeArray!T && !isArray!T)
|
||||
if (!is(T == interface) && !isAbstractClass!T
|
||||
&& !isAssociativeArray!T && !isArray!T)
|
||||
in
|
||||
{
|
||||
assert(allocator !is null);
|
||||
@ -858,7 +872,7 @@ body
|
||||
*/
|
||||
Unique!T unique(T)(shared Allocator allocator, const size_t size)
|
||||
@trusted
|
||||
if (isArray!T)
|
||||
if (isArray!T)
|
||||
in
|
||||
{
|
||||
assert(allocator !is null);
|
||||
|
Loading…
Reference in New Issue
Block a user