#pragma once #include #include #include #include #include #include "NetObjOwnerPtr.decl.hpp" #include "NetObjTemporaryPtr.hpp" #include "NetObjManager.hpp" namespace NetworkingObjects { template NetObjOwnerPtr::NetObjOwnerPtr(): objMan(nullptr), rawPtr(nullptr) {} template NetObjOwnerPtr::NetObjOwnerPtr(NetObjOwnerPtr&& other): objMan(other.objMan), id(other.id), rawPtr(other.rawPtr) { other.objMan = nullptr; other.rawPtr = nullptr; } template NetObjOwnerPtr& NetObjOwnerPtr::operator=(NetObjOwnerPtr&& other) { objMan = other.objMan; id = other.id; rawPtr = other.rawPtr; other.objMan = nullptr; other.rawPtr = nullptr; return *this; } template NetObjOwnerPtr::~NetObjOwnerPtr() { if(objMan && rawPtr) { auto it = objMan->objectData.find(id); delete static_cast(it->second.p); objMan->objectData.erase(it); } } template void NetObjOwnerPtr::reassign_ids() { if(objMan && rawPtr) { constexpr bool hasReassignNetObjIds = requires(T& t) { t.reassign_netobj_ids_call(); }; auto it = objMan->objectData.find(id); NetObjManager::SingleObjectData objData = it->second; objData.p = rawPtr; objMan->objectData.erase(it); id = NetObjID::random_gen(); objMan->objectData.emplace(id, objData); if constexpr(hasReassignNetObjIds) rawPtr->reassign_netobj_ids_call(); } } template NetObjManager* NetObjOwnerPtr::get_obj_man() const { return objMan; } template NetObjID NetObjOwnerPtr::get_net_id() const { return id; } template T* NetObjOwnerPtr::get() const { return rawPtr; } template std::add_lvalue_reference_t NetObjOwnerPtr::operator*() const requires(!std::is_void_v) { return *rawPtr; } template T* NetObjOwnerPtr::operator->() const { return rawPtr; } template NetObjOwnerPtr::operator bool() const { return rawPtr; } template bool NetObjOwnerPtr::operator!=(const NetObjOwnerPtr& rhs) const { return rawPtr != rhs.rawPtr; } template bool NetObjOwnerPtr::operator==(const NetObjOwnerPtr& rhs) const { return rawPtr == rhs.rawPtr; } template bool NetObjOwnerPtr::operator!=(const NetObjTemporaryPtr& rhs) const { return rawPtr != rhs.get(); } template bool NetObjOwnerPtr::operator==(const NetObjTemporaryPtr& rhs) const { return rawPtr == rhs.get(); } template void NetObjOwnerPtr::send_client_update(const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const { NetObjManager::send_client_update(NetObjTemporaryPtr(*this), channel, sendUpdateFunc); } template void NetObjOwnerPtr::send_server_update_to_all_clients(const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const { NetObjManager::send_server_update_to_all_clients(NetObjTemporaryPtr(*this), channel, sendUpdateFunc); } template void NetObjOwnerPtr::send_server_update_to_client(const std::shared_ptr& clientToSendTo, const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const { NetObjManager::send_server_update_to_client(NetObjTemporaryPtr(*this), clientToSendTo, channel, sendUpdateFunc); } template void NetObjOwnerPtr::send_server_update_to_all_clients_except(const std::shared_ptr& clientToNotSendTo, const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const { NetObjManager::send_server_update_to_all_clients_except(NetObjTemporaryPtr(*this), clientToNotSendTo, channel, sendUpdateFunc); } template void NetObjOwnerPtr::send_update_to_all(const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const { NetObjManager::send_update_to_all(NetObjTemporaryPtr(*this), channel, sendUpdateFunc); } template void NetObjOwnerPtr::write_create_message(cereal::PortableBinaryOutputArchive& a) const { NetObjManager::write_create_message(NetObjTemporaryPtr(*this), a); } template NetObjOwnerPtr::NetObjOwnerPtr(NetObjManager* initObjMan, NetObjID initID, T* initRawPtr): objMan(initObjMan), id(initID), rawPtr(initRawPtr) {} }