On 03/03/2011 05:56 AM, Peter Lundgren wrote:
Where can I go to learn about parameterized structs? I can't seem to find any
literature on the subject. In particular, what are you allowed to use as a
parameter? I would like to define a struct like so:

struct MyStruct(T, T[] a) {
     ...
}

but I receive the following error:

Error: arithmetic/string type expected for value-parameter, not T[]

Are arrays not allowed?

Finally managed to do it, I guess :-)

============================
bool[E] set (E : E[]) (E[] elements) {
    bool[E] set;
    foreach (element ; elements)
        set[element] = true;
    return set;
}

struct String (C : C[], alias characters) {
    alias typeof(characters) S;
//~     alias ElementType!S C;  // BUG! returns dchar
    bool[C] klass = null;
    private C[] s;

    this (S s) {
        this.klass = set!S(characters);
        this.def(s);
    }
    void def (S s = null) {
        if (s.length == 0) {
            this.s = s;
            return;
        }
        foreach (ch ; s) {
            if (ch !in this.klass) {
                auto message = format(
                    "'%s' not in allowed class of characters"
                    , ch);
                throw new Exception(message);
            }
        }
        this.s = s;
    }

    string toString () {
        return format("String!(%s,\"%s\")(\"%s\")",
            S.stringof, characters, this.s);
    }
}

unittest {
    auto s = String!(string, "abcde")("");
    writeln(s);
    s.def("eca");
    writeln(s);
    s = String!(string, "abcde")("ace");
    writeln(s);
    s = String!(string, "abcde")("fgh");    // --> error
    writeln(s);
}
============================

Some notes:

* set is here to speed up character lookup among allowed klass (else, O(N) in array).

* C: C[] in struct template is redondant, since C[] is typeof(characters). It is only needed to declare the set 'klass', because of a bug: ElementType!string returns dchar!!! Thus, it is would not be possible, I guess, to declare klass's type in the struct definition.

* You must pass an init string (even if "") to call this() and construct klass. Because of another bug: there cannot be parameter-less constructors for structs. Also, set cannot be defined on toplevel of the struct def
    auto klass = set!S(characters);
because it's not a constant according to dmd. (It is, in fact). Thus, I guess we must construct it inside this().

Denis
--
_________________
vita es estrany
spir.wikidot.com

Reply via email to