⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 variant_stream.hpp

📁 LINUX下
💻 HPP
📖 第 1 页 / 共 2 页
字号:
		std::size_t operator()(boost::blank) const      { return 0; }      Mutable_Buffers const& buffers;      asio::error_code& ec;  };// -------------- async_write_some -----------  template <class Const_Buffers, class Handler>  struct async_write_some_visitor    : boost::static_visitor<>  {      async_write_some_visitor(Const_Buffers const& buffers, Handler const& handler)        : buffers(buffers)        , handler(handler)      {}      template <class T>      void operator()(T* p) const      {          p->async_write_some(buffers, handler);      }      void operator()(boost::blank) const      {}      Const_Buffers const& buffers;      Handler const& handler;  };// -------------- in_avail -----------  struct in_avail_visitor_ec    : boost::static_visitor<std::size_t>  {      in_avail_visitor_ec(asio::error_code& ec_)        : ec(ec_)      {}      template <class T>      std::size_t operator()(T* p) const      {          return p->in_avail(ec);      }      std::size_t operator()(boost::blank) const      {          return 0;      }		asio::error_code& ec;  };  struct in_avail_visitor    : boost::static_visitor<std::size_t>  {      template <class T>      std::size_t operator()(T* p) const      {          return p->in_avail();      }      void operator()(boost::blank) const      {}  };// -------------- io_service -----------  template <class IOService>  struct io_service_visitor    : boost::static_visitor<IOService&>  {      template <class T>      IOService& operator()(T* p) const      {          return p->io_service();      }      IOService& operator()(boost::blank) const      {          return *(IOService*)0;      }  };// -------------- lowest_layer -----------  template <class LowestLayer>  struct lowest_layer_visitor    : boost::static_visitor<LowestLayer&>  {      template <class T>      LowestLayer& operator()(T* p) const      {          return p->lowest_layer();      }      LowestLayer& operator()(boost::blank) const      {          return *(LowestLayer*)0;      }  };} // namespace auxtemplate <    BOOST_PP_ENUM_BINARY_PARAMS(        NETWORK_VARIANT_STREAM_LIMIT, class S, = boost::mpl::void_ BOOST_PP_INTERCEPT    )>class variant_stream : boost::noncopyable{public:    typedef BOOST_PP_CAT(boost::mpl::vector, NETWORK_VARIANT_STREAM_LIMIT)<        BOOST_PP_ENUM_PARAMS(NETWORK_VARIANT_STREAM_LIMIT, S)    > types0;    typedef typename boost::mpl::remove<types0, boost::mpl::void_>::type types;    typedef typename boost::make_variant_over<        typename boost::mpl::push_back<            typename boost::mpl::transform<                types              , boost::add_pointer<boost::mpl::_>            >::type          , boost::blank        >::type    >::type variant_type;    typedef typename S0::lowest_layer_type lowest_layer_type;    typedef typename S0::endpoint_type endpoint_type;    typedef typename S0::protocol_type protocol_type;    explicit variant_stream() : m_variant(boost::blank()) {}    template <class S>    void instantiate(asio::io_service& ios)    {        std::auto_ptr<S> owned(new S(ios));        boost::apply_visitor(aux::delete_visitor(), m_variant);        m_variant = owned.get();        owned.release();    }    template <class S>    S& get()    {	     return *boost::get<S*>(m_variant);    }    bool instantiated() const    {        return m_variant.which() != boost::mpl::size<types>::value;    }    ~variant_stream()    {        boost::apply_visitor(aux::delete_visitor(), m_variant);    }    template <class Mutable_Buffers>    std::size_t read_some(Mutable_Buffers const& buffers, asio::error_code& ec)    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(            aux::read_some_visitor_ec<Mutable_Buffers>(buffers, ec)          , m_variant        );    }    template <class Mutable_Buffers>    std::size_t read_some(Mutable_Buffers const& buffers)    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(            aux::read_some_visitor<Mutable_Buffers>(buffers)          , m_variant        );    }    template <class Mutable_Buffers, class Handler>    void async_read_some(Mutable_Buffers const& buffers, Handler const& handler)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(            aux::async_read_some_visitor<Mutable_Buffers, Handler>(buffers, handler)          , m_variant        );    }    template <class Const_Buffers, class Handler>    void async_write_some(Const_Buffers const& buffers, Handler const& handler)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(            aux::async_write_some_visitor<Const_Buffers, Handler>(buffers, handler)          , m_variant        );    }    template <class Handler>    void async_connect(endpoint_type const& endpoint, Handler const& handler)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(            aux::async_connect_visitor<endpoint_type, Handler>(endpoint, handler), m_variant        );    }    template <class IO_Control_Command>    void io_control(IO_Control_Command& ioc)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(            aux::io_control_visitor<IO_Control_Command>(ioc), m_variant        );    }    template <class IO_Control_Command>    void io_control(IO_Control_Command& ioc, asio::error_code& ec)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(            aux::io_control_visitor_ec<IO_Control_Command>(ioc, ec)            , m_variant        );    }    void bind(endpoint_type const& endpoint)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(aux::bind_visitor<endpoint_type>(endpoint), m_variant);    }    void bind(endpoint_type const& endpoint, asio::error_code& ec)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(            aux::bind_visitor_ec<endpoint_type>(endpoint, ec), m_variant        );    }    void open(protocol_type const& p)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(aux::open_visitor<protocol_type>(p), m_variant);    }    void open(protocol_type const& p, asio::error_code& ec)    {        TORRENT_ASSERT(instantiated());        boost::apply_visitor(            aux::open_visitor_ec<protocol_type>(p, ec), m_variant        );    }    void close()    {        if (!instantiated()) return;        boost::apply_visitor(aux::close_visitor(), m_variant);    }    void close(asio::error_code& ec)    {        if (!instantiated()) return;        boost::apply_visitor(            aux::close_visitor_ec(ec), m_variant        );    }    std::size_t in_avail()    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(aux::in_avail_visitor(), m_variant);    }    std::size_t in_avail(asio::error_code& ec)    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(            aux::in_avail_visitor_ec(ec), m_variant        );    }    endpoint_type remote_endpoint()    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(aux::remote_endpoint_visitor<endpoint_type>(), m_variant);    }    endpoint_type remote_endpoint(asio::error_code& ec)    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(            aux::remote_endpoint_visitor_ec<endpoint_type>(ec), m_variant        );    }    endpoint_type local_endpoint()    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(aux::local_endpoint_visitor<endpoint_type>(), m_variant);    }    endpoint_type local_endpoint(asio::error_code& ec)    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(            aux::local_endpoint_visitor_ec<endpoint_type>(ec), m_variant        );    }	 asio::io_service& io_service()    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(            aux::io_service_visitor<asio::io_service>(), m_variant        );    }    lowest_layer_type& lowest_layer()    {        TORRENT_ASSERT(instantiated());        return boost::apply_visitor(            aux::lowest_layer_visitor<lowest_layer_type>(), m_variant        );    }private:    variant_type m_variant;};} // namespace libtorrent#endif // VARIANT_STREAM_070211_HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -