summaryrefslogtreecommitdiffhomepage
path: root/connectionregistry.h
diff options
context:
space:
mode:
Diffstat (limited to 'connectionregistry.h')
-rw-r--r--connectionregistry.h55
1 files changed, 55 insertions, 0 deletions
diff --git a/connectionregistry.h b/connectionregistry.h
new file mode 100644
index 0000000..c3c6884
--- /dev/null
+++ b/connectionregistry.h
@@ -0,0 +1,55 @@
+#pragma once
+
+#include <algorithm>
+#include <memory>
+#include <unordered_map>
+#include <unordered_set>
+
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/beast/websocket.hpp>
+
+class ConnectionRegistry
+{
+public:
+ using connection = std::shared_ptr<boost::beast::websocket::stream<boost::asio::ip::tcp::socket>>;
+
+ ConnectionRegistry() = default;
+ ~ConnectionRegistry() = default;
+
+ void setId(connection c, const std::string& id);
+
+ // used via RegistryGuard
+ void addConnection(connection c);
+ void delConnection(connection c);
+
+ // iterate over all connections associated with a certain id
+ std::unordered_set<connection>::iterator begin(const std::string& id);
+ std::unordered_set<connection>::iterator end(const std::string& id);
+
+ // iterate over all connections
+ std::unordered_map<connection, std::string>::iterator begin();
+ std::unordered_map<connection, std::string>::iterator end();
+
+ void dump() const;
+
+ size_t number_of_connections() const;
+
+private:
+ // map connection to id
+ std::unordered_map<connection, std::string> m_connections;
+ // map id to list of related connections, used for iteration over connections to notify about changes
+ std::unordered_map<std::string, std::unordered_set<connection>> m_ids;
+
+public:
+ class RegistryGuard
+ {
+ public:
+ RegistryGuard(ConnectionRegistry& registry, connection c);
+ ~RegistryGuard();
+ private:
+ ConnectionRegistry& m_registry;
+ connection m_connection;
+ };
+
+};
+