#pragma once #include "EpistmoolServer/Connection.hpp" #include #include #include #include namespace Epistmool::Server { struct SessionId { int index; static SessionId makeInvalid(); bool isInvalid() const; bool operator==(const SessionId&) const = default; }; class Session { friend class SessionManager; private: std::vector mConnections; SessionId mSessionId; public: explicit Session(SessionId id); SessionId getSessionId() const; const std::vector& getConnections() const; }; class SessionManager : public QObject { Q_OBJECT friend class Session; private: // Use this intead of QHash for 1. pointer stability 2. Session is a move-only type std::unordered_map mSessions; QMultiHash mConnection2SessionMap; int mNextIndex; public: explicit SessionManager(QObject* parent = nullptr); Session* findOrCreateSession(SessionId id); Session* findSession(SessionId id); void addConnection(SessionId id, ConnectionId connId); public slots: void dropConnection(Epistmool::Server::ConnectionId connId); }; } // namespace Epistmool::Server