The following piece of code compiles without error on D1(1.072) & D2(2.057).
However the D2 version doesn't run fine. ( output below )

---------------------------->8----------------------------
abstract class Receiver(M) {
        this() { Broadcaster!(M).register(this); }
        ~this() { Broadcaster!(M).unregister(this); }
        abstract void onMessage( M message );
}

abstract class Emitter(M) {
        void emit(M message) { Broadcaster!(M).broadcast(message); }    
}

static class Broadcaster(M) {
        private static Receiver!(M)[string] mReceivers;

        public static void register( Receiver!(M) receiver ) {
                mReceivers[receiver.toString()] = receiver;
        }

        public static void unregister( Receiver!(M) receiver ) {
                mReceivers.remove(receiver.toString());

        }

        public static void broadcast( M message ) {
                foreach( ref receiver; mReceivers ) {
                        receiver.onMessage( message );
                }
                delete message;
        }
}
//================================================== import std.stdio;
void main() {
        class TestMessage {
                this( string m ) { stringAttribute = m; }
                string stringAttribute;
        }

        class TestReceiver1: Receiver!(TestMessage) {
                this() { super(); }
                override void onMessage( TestMessage m ) {
                        writefln( "receiver 1 :", m.stringAttribute );
                }
        }


        class TestReceiver2: Receiver!(TestMessage) {
                this() { super(); }
                override void onMessage( TestMessage m ) {
                        writefln( "receiver 2 :", m.stringAttribute );
                }
        }


        class TestEmitter: Emitter!(TestMessage) {
                void send() {
                        emit( new TestMessage("Hey") );
                }
        }

        auto e = new TestEmitter;
        auto r1 = new TestReceiver1;
        auto r2 = new TestReceiver2;

        e.send;
        delete r2;
        e.send;
}
----------------------------8<----------------------------

* Output of the D1 version :
receiver 1 :Hey
receiver 2 :Hey
receiver 1 :Hey


* Output of the D2 version :
receiver 1 :
receiver 2 :
receiver 1 :


Is this a bug or something stupid on my part ?


Reply via email to