On Friday, 23 September 2016 at 09:21:56 UTC, Claude wrote:
...

// Maybe you can try using std.variant?

import std.variant;
alias Component = Variant;

class Entity
{
    void register (Component v) { components ~= v; }
    void unregister (T) () {
        foreach (i, c; components) if (c.type == typeid(T))
            components = components[0..i] ~ components[i+1 .. $];
    }
    Component getComponent (T) () {
        foreach (i, c; components) if (c.type == typeid(T))
            return components[i];
    }
    Component[] components;
    // iterating over the components
    alias components this;

    // or you can provide an inputRange interface by implementing
    //
    // bool empty () {}
    // Component front () {}
    // void popFront () {}
    //
// to support whatever type of backing data structure you have.
    // (see http://ddili.org/ders/d.en/ranges.html)
}

unittest
{
    import std.stdio;
    Entity e = new Entity();
    e.register(Component(42));
    e.register(Component("loire"));
    e.register(Component(3.14));
foreach (c; e) write(c, " "); writeln; // Prints 42 "loire" 3.14
    e.unregister!string;
    foreach (c; e) write(c, " "); writeln;  // Prints 42 3.14
    e.unregister!double;
    foreach (c; e) write(c, " "); writeln;  // Prints 42
    e.unregister!int;
    assert(e.components.length == 0);
}

Reply via email to