#pragma once namespace saw { template<> struct remote_address { private: remote* ctx_; our> device_; SAW_FORBID_COPY(remote_address); SAW_FORBID_MOVE(remote_address); public: remote_address(remote& r_ctx, our> d_ctx): ctx_{&r_ctx}, device_{std::move(d_ctx)} {} our> copy_device_reference() const { return device_; } device& get_device(){ return *device_; } }; template<> class remote { private: SAW_FORBID_COPY(remote); SAW_FORBID_MOVE(remote); public: /** * Default constructor */ remote(){} /** * For now we don't need to specify the location since * we just create a default. */ conveyor>> resolve_address(){ auto dev = std::make_shared>(); return heap>(*this, std::move(dev)); } /** * Parse address, but don't resolve it. */ error_or>> parse_address(){ auto dev = std::make_shared>(); return heap>(*this, std::move(dev)); } /** * Spin up a rpc server */ template rpc_server listen(remote_address& dev, typename rpc_server::InterfaceT iface){ //using RpcServerT = rpc_server; //using InterfaceT = typename RpcServerT::InterfaceT; return {dev.copy_device_reference(), std::move(iface)}; } }; }