mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 21:21:48 +03:00
53 lines
1 KiB
D
53 lines
1 KiB
D
// PERMUTE_ARGS:
|
|
|
|
public struct CirBuff(T)
|
|
{
|
|
private T[] data;
|
|
private size_t head = 0;
|
|
private size_t size = 0;
|
|
public size_t length() const { return size; }
|
|
|
|
public bool opEquals(CirBuff!T d) @trusted
|
|
{
|
|
if (length != d.length)
|
|
return false;
|
|
for (size_t i=0; i!=size; ++i)
|
|
{
|
|
if (this.data[(this.head+i) % this.data.length] !=
|
|
d.data[(d.head + i) % d.data.length])
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
|
|
class Once
|
|
{
|
|
Foo!Bar _bar;
|
|
}
|
|
|
|
class Bar
|
|
{
|
|
static Once _once;
|
|
mixin(sync!(Once, "_once"));
|
|
}
|
|
|
|
class Foo(T = int)
|
|
{
|
|
CirBuff!T _buff;
|
|
}
|
|
|
|
template sync(T, string U = "this", size_t ITER = 0)
|
|
{
|
|
static if (ITER == __traits(derivedMembers, T).length)
|
|
enum sync = "";
|
|
else
|
|
{
|
|
enum string mem = __traits(derivedMembers, T)[ITER];
|
|
enum string sync =
|
|
"static if(! __traits(isVirtualMethod, " ~ U ~ "." ~ mem ~ ")) { }"
|
|
~ sync!(T, U, ITER+1);
|
|
}
|
|
}
|