| // https://issues.dlang.org/show_bug.cgi?id=22859 |
| private struct __InoutWorkaroundStruct {} |
| @property T rvalueOf(T)(T val) { return val; } |
| @property T rvalueOf(T)(inout __InoutWorkaroundStruct = __InoutWorkaroundStruct.init); |
| @property ref T lvalueOf(T)(inout __InoutWorkaroundStruct = __InoutWorkaroundStruct.init); |
| |
| // taken from std.traits.isAssignable |
| template isAssignable(Lhs, Rhs = Lhs) |
| { |
| enum isAssignable = __traits(compiles, lvalueOf!Lhs = rvalueOf!Rhs) && __traits(compiles, lvalueOf!Lhs = lvalueOf!Rhs); |
| } |
| |
| // taken from std.meta.allSatisfy |
| template allSatisfy(alias F, T...) |
| { |
| static foreach (Ti; T) |
| { |
| static if (!is(typeof(allSatisfy) == bool) && // not yet defined |
| !F!(Ti)) |
| { |
| enum allSatisfy = false; |
| } |
| } |
| static if (!is(typeof(allSatisfy) == bool)) // if not yet defined |
| { |
| enum allSatisfy = true; |
| } |
| } |
| |
| struct None{} |
| |
| class C1 |
| { |
| static if(allSatisfy!(isAssignable, None, C2)) {} |
| } |
| |
| class C2 |
| { |
| static if(allSatisfy!(isAssignable, None, C1, C2)) {} |
| } |