On Friday, 31 July 2015 at 16:28:30 UTC, jmh530 wrote:
Looking at the PR also resolved my earlier question. Running the code as below (do not import std.range) will tell you exactly what isn't implemented from isInputRange (in this case, I commented out popFront). Very cool.

template satisfies(alias Constraint, R) {
    enum check = "check" ~ Constraint.stringof[2..$-3] ~ "!(R)";
    enum assert_ = "static assert("~ check ~ ");";
mixin(assert_); //mixes in "static assert(checkInputRange!R)"
}

template isInputRange(R)
{
    enum bool isInputRange = is(typeof(checkInputRange!R));
}

bool checkInputRange(R)(inout int = 0)
{
    if (__ctfe)
    {
        R r = R.init;     // can define a range object
        if (r.empty) {}   // can test for empty
        r.popFront();     // can invoke popFront()
        auto h = r.front; // can get the front of the range
    }
    return true;
}

@satisfies!(isInputRange, Zeroes)
struct Zeroes {
    enum empty = false;
    //void popFront() {}
    @property int front() { return 0; }
}

void main()
{
        Zeroes Z;
}

Nice. Here are the actual error messages for the record:

/d125/f236.d(18): Error: no property 'popFront' for type 'Zeroes'
/d125/f236.d(24): Error: template instance f236.satisfies!(isInputRange, Zeroes) error instantiating

Piotrek



Reply via email to