diff --git a/lout/container.hh b/lout/container.hh index 9185082..83940e6 100644 --- a/lout/container.hh +++ b/lout/container.hh @@ -22,6 +22,15 @@ #define __LOUT_CONTAINER_HH_ #include "object.hh" +#include + +// TODO: Over time I'll have to retire the Java-like containers here. +// For now, a few of the "niceties" they offer should be wrapped and/or +// adapted. +#include +#include +#include +#include namespace lout { @@ -39,6 +48,21 @@ namespace lout { */ namespace container { +template< Alepha::DerivedFrom< object::Object > T > +void +intoStringBuffer( const std::list< T * > &container, misc::StringBuffer *const sb ) +{ + sb->append("{ "); + bool first= true; + for( auto *object: container ) + { + if( not first ) sb->append(", "); + object->intoStringBuffer(sb); + first = false; + } + sb->append(" }"); +} + /** * \brief The container classes defined here contain instances of * object::Object. diff --git a/lout/signal.cc b/lout/signal.cc index 20a3895..c9092a9 100644 --- a/lout/signal.cc +++ b/lout/signal.cc @@ -30,30 +30,27 @@ using namespace container::typed; // Emitter // ------------ -Emitter::Emitter () -{ - receivers = new List (false); -} +Emitter::Emitter()= default; Emitter::~Emitter () { - for (Iterator it = receivers->iterator (); it.hasNext (); ) { - Receiver *receiver = it.getNext (); - receiver->unconnectFrom (this); + // TODO: RAII this? + for( Receiver *receiver: receivers ) + { + receiver->unconnectFrom( this ); } - delete receivers; } void Emitter::intoStringBuffer(misc::StringBuffer *sb) { sb->append ("intoStringBuffer (sb); + container::intoStringBuffer( receivers, sb ); sb->append (">"); } void Emitter::unconnect (Receiver *receiver) { - receivers->removeRef (receiver); + receivers.remove( receiver ); } /** @@ -64,7 +61,7 @@ void Emitter::unconnect (Receiver *receiver) */ void Emitter::connect (Receiver *receiver) { - receivers->append (receiver); + receivers.push_back( receiver ); receiver->connectTo (this); } @@ -76,8 +73,8 @@ void Emitter::connect (Receiver *receiver) */ void Emitter::emitVoid (int signalNo, int argc, Object **argv) { - for (Iterator it = receivers->iterator (); it.hasNext (); ) { - Receiver *receiver = it.getNext(); + for( Receiver *receiver: receivers ) + { emitToReceiver (receiver, signalNo, argc, argv); } } @@ -92,8 +89,8 @@ bool Emitter::emitBool (int signalNo, int argc, Object **argv) { bool b = false, bt; - for (Iterator it = receivers->iterator (); it.hasNext (); ) { - Receiver *receiver = it.getNext(); + for( Receiver *receiver: receivers ) + { // Note: All receivers are called, even if one returns true. // Therefore, something like // b = b || emitToReceiver (receiver, signalNo, argc, argv); @@ -110,18 +107,14 @@ bool Emitter::emitBool (int signalNo, int argc, Object **argv) // Receiver // -------------- -Receiver::Receiver() -{ - emitters = new List (false); -} +Receiver::Receiver()= default; Receiver::~Receiver() { - for (Iterator it = emitters->iterator(); it.hasNext(); ) { - Emitter *emitter = it.getNext(); + for( Emitter *emitter: emitters ) + { emitter->unconnect (this); } - delete emitters; } void Receiver::intoStringBuffer(misc::StringBuffer *sb) @@ -132,12 +125,12 @@ void Receiver::intoStringBuffer(misc::StringBuffer *sb) void Receiver::connectTo(Emitter *emitter) { - emitters->append (emitter); + emitters.push_back( emitter ); } void Receiver::unconnectFrom(Emitter *emitter) { - emitters->removeRef (emitter); + emitters.remove( emitter); } // ------------------------ diff --git a/lout/signal.hh b/lout/signal.hh index bc62d8d..014cada 100644 --- a/lout/signal.hh +++ b/lout/signal.hh @@ -1,6 +1,8 @@ #ifndef __LOUT_SIGNALS_HH__ #define __LOUT_SIGNALS_HH__ +#include + #include "object.hh" #include "container.hh" @@ -214,7 +216,7 @@ class Emitter: public object::Object friend class Receiver; private: - container::typed::List *receivers; + std::list< Receiver * > receivers; void unconnect (Receiver *receiver); @@ -255,7 +257,7 @@ class Receiver: public object::Object friend class Emitter; private: - container::typed::List *emitters; + std::list< Emitter * > emitters; void connectTo(Emitter *emitter); void unconnectFrom(Emitter *emitter);