#pragma once #include #include #include #include namespace erebos { class Server { public: Server(const Identity &, std::vector> &&); ~Server(); template S & svc(); class PeerList & peerList() const; struct Peer; private: Service & svcHelper(const std::type_info &); struct Priv; const std::shared_ptr p; }; template S & Server::svc() { return dynamic_cast(svcHelper(typeid(S))); } class Peer { public: struct Priv; Peer(const std::shared_ptr & p); ~Peer(); std::string name() const; std::optional identity() const; bool hasChannel() const; bool send(UUID, const Ref &) const; private: std::shared_ptr p; }; class PeerList { public: struct Priv; PeerList(); PeerList(const std::shared_ptr & p); ~PeerList(); size_t size() const; Peer at(size_t n) const; void onUpdate(std::function); private: friend Server; const std::shared_ptr p; }; }