#pragma once #include "NetObjID.hpp" #include #include namespace NetworkingObjects { class NetObjManager; template class NetObjPtr { public: NetObjPtr(); NetObjPtr(const NetObjPtr& other); NetObjPtr& operator=(const NetObjPtr& other); ~NetObjPtr(); template NetObjPtr cast() const; NetObjManager* get_obj_man() const; NetObjID get_net_id() const; T* get() const; std::add_lvalue_reference_t operator*() const requires(!std::is_void_v); T* operator->() const; operator bool() const; std::strong_ordering operator<=>(const NetObjPtr& rhs) const; void send_client_update(const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const; void send_server_update_to_all_clients(const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const; void send_update_to_all(const std::string& channel, std::function&, cereal::PortableBinaryOutputArchive&)> sendUpdateFunc) const; void write_create_message(cereal::PortableBinaryOutputArchive& a) const; private: friend class NetObjManager; template friend class NetObjPtr; template friend class NetObjWeakPtr; NetObjPtr(NetObjManager* initObjMan, NetObjID initID, const std::shared_ptr& initPtr); NetObjManager* objMan; NetObjID id; std::shared_ptr sharedPtr; }; }