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_ #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.

View File

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

View File

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