#include namespace td { namespace server { void FakeSocket::SendPeer(PeerID a_Peer, const protocol::PacketBase& a_Packet) { auto socket = m_Clients.at(a_Peer); assert(socket.has_value()); socket.value()->OnReceive(a_Packet); } void FakeSocket::ReceiveFromFakePeer(PeerID a_Peer, const protocol::PacketBase& a_Packet) { OnReceivePeer(a_Peer, a_Packet); } PeerID FakeSocket::ConnectFakePeer(const std::shared_ptr& a_Socket) { int peerId = GetNextFreeId(); if (peerId == -1) { peerId = m_Clients.size(); m_Clients.push_back(a_Socket); } else { m_Clients.emplace(m_Clients.begin() + peerId, a_Socket); } a_Socket->OnConnect(); OnConnectPeer(peerId); return peerId; } void FakeSocket::DisconnectFakePeer(PeerID a_Peer) { auto socket = m_Clients.at(a_Peer); assert(socket.has_value()); socket.value()->OnDisconnect(); OnDisconnectPeer(a_Peer); } int FakeSocket::GetNextFreeId() { auto it = std::find_if(m_Clients.begin(), m_Clients.end(), [](const auto& a_Value) { return !a_Value.has_value(); }); if (it == m_Clients.end()) return -1; return std::distance(m_Clients.begin(), it); } } // namespace server } // namespace td