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

This commit is contained in:
2025-08-06 03:16:31 -04:00
parent af0c428934
commit 23f82a705c
3 changed files with 45 additions and 26 deletions

View File

@ -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.

View File

@ -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 ();
// 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);
}
// ------------------------

View File

@ -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);