Start moving away from the Java-like containers.
Some checks failed
CI / ubuntu-latest-html-tests (push) Has been cancelled
CI / alpine-mbedtls-3_6_0 (push) Has been cancelled
CI / ubuntu-latest-no-tls (push) Has been cancelled
CI / ubuntu-latest-mbedtls2 (push) Has been cancelled
CI / ubuntu-latest-openssl-3 (push) Has been cancelled
CI / ubuntu-latest-with-old-std (push) Has been cancelled
CI / ubuntu-20-04-openssl-1-1 (push) Has been cancelled
CI / macOS-13-openssl-1-1 (push) Has been cancelled
CI / macOS-13-openssl-3 (push) Has been cancelled
CI / freebsd-14-openssl-3 (push) Has been cancelled
CI / windows-mbedtls (push) Has been cancelled
Some checks failed
CI / ubuntu-latest-html-tests (push) Has been cancelled
CI / alpine-mbedtls-3_6_0 (push) Has been cancelled
CI / ubuntu-latest-no-tls (push) Has been cancelled
CI / ubuntu-latest-mbedtls2 (push) Has been cancelled
CI / ubuntu-latest-openssl-3 (push) Has been cancelled
CI / ubuntu-latest-with-old-std (push) Has been cancelled
CI / ubuntu-20-04-openssl-1-1 (push) Has been cancelled
CI / macOS-13-openssl-1-1 (push) Has been cancelled
CI / macOS-13-openssl-3 (push) Has been cancelled
CI / freebsd-14-openssl-3 (push) Has been cancelled
CI / windows-mbedtls (push) Has been cancelled
This commit is contained in:
@ -22,6 +22,15 @@
|
||||
#define __LOUT_CONTAINER_HH_
|
||||
|
||||
#include "object.hh"
|
||||
#include <Alepha/Concepts.h>
|
||||
|
||||
// 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 <list>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
|
||||
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.
|
||||
|
@ -30,30 +30,27 @@ using namespace container::typed;
|
||||
// Emitter
|
||||
// ------------
|
||||
|
||||
Emitter::Emitter ()
|
||||
{
|
||||
receivers = new List <Receiver> (false);
|
||||
}
|
||||
Emitter::Emitter()= default;
|
||||
|
||||
Emitter::~Emitter ()
|
||||
{
|
||||
for (Iterator<Receiver> 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 ("<emitter: ");
|
||||
receivers->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 <Receiver> 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 <Receiver> 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 <Emitter> (false);
|
||||
}
|
||||
Receiver::Receiver()= default;
|
||||
|
||||
Receiver::~Receiver()
|
||||
{
|
||||
for (Iterator<Emitter> 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);
|
||||
}
|
||||
|
||||
// ------------------------
|
||||
|
@ -1,6 +1,8 @@
|
||||
#ifndef __LOUT_SIGNALS_HH__
|
||||
#define __LOUT_SIGNALS_HH__
|
||||
|
||||
#include <list>
|
||||
|
||||
#include "object.hh"
|
||||
#include "container.hh"
|
||||
|
||||
@ -214,7 +216,7 @@ class Emitter: public object::Object
|
||||
friend class Receiver;
|
||||
|
||||
private:
|
||||
container::typed::List <Receiver> *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<Emitter> *emitters;
|
||||
std::list< Emitter * > emitters;
|
||||
|
||||
void connectTo(Emitter *emitter);
|
||||
void unconnectFrom(Emitter *emitter);
|
||||
|
Reference in New Issue
Block a user