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_
|
#define __LOUT_CONTAINER_HH_
|
||||||
|
|
||||||
#include "object.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 {
|
namespace lout {
|
||||||
|
|
||||||
@ -39,6 +48,21 @@ namespace lout {
|
|||||||
*/
|
*/
|
||||||
namespace container {
|
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
|
* \brief The container classes defined here contain instances of
|
||||||
* object::Object.
|
* object::Object.
|
||||||
|
@ -30,30 +30,27 @@ using namespace container::typed;
|
|||||||
// Emitter
|
// Emitter
|
||||||
// ------------
|
// ------------
|
||||||
|
|
||||||
Emitter::Emitter ()
|
Emitter::Emitter()= default;
|
||||||
{
|
|
||||||
receivers = new List <Receiver> (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
Emitter::~Emitter ()
|
Emitter::~Emitter ()
|
||||||
{
|
{
|
||||||
for (Iterator<Receiver> it = receivers->iterator (); it.hasNext (); ) {
|
// TODO: RAII this?
|
||||||
Receiver *receiver = it.getNext ();
|
for( Receiver *receiver: receivers )
|
||||||
receiver->unconnectFrom (this);
|
{
|
||||||
|
receiver->unconnectFrom( this );
|
||||||
}
|
}
|
||||||
delete receivers;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Emitter::intoStringBuffer(misc::StringBuffer *sb)
|
void Emitter::intoStringBuffer(misc::StringBuffer *sb)
|
||||||
{
|
{
|
||||||
sb->append ("<emitter: ");
|
sb->append ("<emitter: ");
|
||||||
receivers->intoStringBuffer (sb);
|
container::intoStringBuffer( receivers, sb );
|
||||||
sb->append (">");
|
sb->append (">");
|
||||||
}
|
}
|
||||||
|
|
||||||
void Emitter::unconnect (Receiver *receiver)
|
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)
|
void Emitter::connect (Receiver *receiver)
|
||||||
{
|
{
|
||||||
receivers->append (receiver);
|
receivers.push_back( receiver );
|
||||||
receiver->connectTo (this);
|
receiver->connectTo (this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,8 +73,8 @@ void Emitter::connect (Receiver *receiver)
|
|||||||
*/
|
*/
|
||||||
void Emitter::emitVoid (int signalNo, int argc, Object **argv)
|
void Emitter::emitVoid (int signalNo, int argc, Object **argv)
|
||||||
{
|
{
|
||||||
for (Iterator <Receiver> it = receivers->iterator (); it.hasNext (); ) {
|
for( Receiver *receiver: receivers )
|
||||||
Receiver *receiver = it.getNext();
|
{
|
||||||
emitToReceiver (receiver, signalNo, argc, argv);
|
emitToReceiver (receiver, signalNo, argc, argv);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,8 +89,8 @@ bool Emitter::emitBool (int signalNo, int argc, Object **argv)
|
|||||||
{
|
{
|
||||||
bool b = false, bt;
|
bool b = false, bt;
|
||||||
|
|
||||||
for (Iterator <Receiver> it = receivers->iterator (); it.hasNext (); ) {
|
for( Receiver *receiver: receivers )
|
||||||
Receiver *receiver = it.getNext();
|
{
|
||||||
// Note: All receivers are called, even if one returns true.
|
// Note: All receivers are called, even if one returns true.
|
||||||
// Therefore, something like
|
// Therefore, something like
|
||||||
// b = b || emitToReceiver (receiver, signalNo, argc, argv);
|
// b = b || emitToReceiver (receiver, signalNo, argc, argv);
|
||||||
@ -110,18 +107,14 @@ bool Emitter::emitBool (int signalNo, int argc, Object **argv)
|
|||||||
// Receiver
|
// Receiver
|
||||||
// --------------
|
// --------------
|
||||||
|
|
||||||
Receiver::Receiver()
|
Receiver::Receiver()= default;
|
||||||
{
|
|
||||||
emitters = new List <Emitter> (false);
|
|
||||||
}
|
|
||||||
|
|
||||||
Receiver::~Receiver()
|
Receiver::~Receiver()
|
||||||
{
|
{
|
||||||
for (Iterator<Emitter> it = emitters->iterator(); it.hasNext(); ) {
|
for( Emitter *emitter: emitters )
|
||||||
Emitter *emitter = it.getNext();
|
{
|
||||||
emitter->unconnect (this);
|
emitter->unconnect (this);
|
||||||
}
|
}
|
||||||
delete emitters;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Receiver::intoStringBuffer(misc::StringBuffer *sb)
|
void Receiver::intoStringBuffer(misc::StringBuffer *sb)
|
||||||
@ -132,12 +125,12 @@ void Receiver::intoStringBuffer(misc::StringBuffer *sb)
|
|||||||
|
|
||||||
void Receiver::connectTo(Emitter *emitter)
|
void Receiver::connectTo(Emitter *emitter)
|
||||||
{
|
{
|
||||||
emitters->append (emitter);
|
emitters.push_back( emitter );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Receiver::unconnectFrom(Emitter *emitter)
|
void Receiver::unconnectFrom(Emitter *emitter)
|
||||||
{
|
{
|
||||||
emitters->removeRef (emitter);
|
emitters.remove( emitter);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
#ifndef __LOUT_SIGNALS_HH__
|
#ifndef __LOUT_SIGNALS_HH__
|
||||||
#define __LOUT_SIGNALS_HH__
|
#define __LOUT_SIGNALS_HH__
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
#include "object.hh"
|
#include "object.hh"
|
||||||
#include "container.hh"
|
#include "container.hh"
|
||||||
|
|
||||||
@ -214,7 +216,7 @@ class Emitter: public object::Object
|
|||||||
friend class Receiver;
|
friend class Receiver;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
container::typed::List <Receiver> *receivers;
|
std::list< Receiver * > receivers;
|
||||||
|
|
||||||
void unconnect (Receiver *receiver);
|
void unconnect (Receiver *receiver);
|
||||||
|
|
||||||
@ -255,7 +257,7 @@ class Receiver: public object::Object
|
|||||||
friend class Emitter;
|
friend class Emitter;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
container::typed::List<Emitter> *emitters;
|
std::list< Emitter * > emitters;
|
||||||
|
|
||||||
void connectTo(Emitter *emitter);
|
void connectTo(Emitter *emitter);
|
||||||
void unconnectFrom(Emitter *emitter);
|
void unconnectFrom(Emitter *emitter);
|
||||||
|
Reference in New Issue
Block a user