Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-08-17 08:39:20

0001 //
0002 // Copyright (c) 2024 Klemens Morgenstern (klemens.morgenstern@gmx.net)
0003 //
0004 // Distributed under the Boost Software License, Version 1.0. (See accompanying
0005 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
0006 //
0007 
0008 #ifndef BOOST_COBALT_IOSEQ_PACKET_SOCKET_HPP
0009 #define BOOST_COBALT_IOSEQ_PACKET_SOCKET_HPP
0010 
0011 #include <boost/cobalt/io/detail/config.hpp>
0012 #include <boost/cobalt/io/endpoint.hpp>
0013 #include <boost/cobalt/io/socket.hpp>
0014 
0015 #include <boost/asio/generic/datagram_protocol.hpp>
0016 #include <boost/asio/basic_seq_packet_socket.hpp>
0017 
0018 namespace boost::cobalt::io
0019 {
0020 
0021 struct BOOST_SYMBOL_VISIBLE seq_packet_socket final : socket
0022 {
0023   BOOST_COBALT_IO_DECL seq_packet_socket(const cobalt::executor & executor = this_thread::get_executor());
0024   BOOST_COBALT_IO_DECL seq_packet_socket(seq_packet_socket && lhs);
0025   BOOST_COBALT_IO_DECL seq_packet_socket(native_handle_type h, protocol_type protocol = protocol_type(),
0026                                          const executor & executor = this_thread::get_executor());
0027   BOOST_COBALT_IO_DECL seq_packet_socket(endpoint ep,
0028                                          const executor & executor = this_thread::get_executor());
0029 
0030 
0031   struct BOOST_COBALT_IO_DECL send_op final : op<system::error_code, std::size_t>
0032   {
0033     message_flags in_flags;
0034     const_buffer_sequence buffer;
0035 
0036     send_op(message_flags in_flags, const_buffer_sequence buffer,
0037             asio::basic_seq_packet_socket<protocol_type, executor> & seq_packet_socket)
0038             : in_flags(in_flags), buffer(buffer), socket_(seq_packet_socket) {}
0039 
0040     void initiate(completion_handler<system::error_code, std::size_t> handler) final;
0041     ~send_op() = default;
0042    private:
0043     asio::basic_seq_packet_socket<protocol_type, executor> & socket_;
0044   };
0045 
0046   struct BOOST_COBALT_IO_DECL receive_op final : op<system::error_code, std::size_t>
0047   {
0048     message_flags in_flags, *out_flags;
0049     mutable_buffer_sequence buffer;
0050 
0051     receive_op(message_flags in_flags, message_flags * out_flags,
0052                mutable_buffer_sequence buffer, asio::basic_seq_packet_socket<protocol_type, executor> & seq_packet_socket)
0053     : in_flags(in_flags), out_flags(out_flags), buffer(buffer), socket_(seq_packet_socket) {}
0054 
0055     void initiate(completion_handler<system::error_code, std::size_t> handler) final;
0056     ~receive_op() = default;
0057    private:
0058     asio::basic_seq_packet_socket<protocol_type, executor> & socket_;
0059   };
0060 
0061   [[nodiscard]] receive_op receive(message_flags in_flags, message_flags& out_flags, mutable_buffer_sequence buffer)
0062   {
0063     return receive_op{in_flags, &out_flags, buffer, seq_packet_socket_};
0064   }
0065 
0066   [[nodiscard]] send_op send(message_flags in_flags, const_buffer_sequence buffer)
0067   {
0068     return send_op{in_flags, buffer, seq_packet_socket_};
0069   }
0070   [[nodiscard]] receive_op receive(message_flags in_flags, mutable_buffer_sequence buffer)
0071   {
0072     return receive_op{in_flags, nullptr, buffer, seq_packet_socket_};
0073   }
0074 
0075  public:
0076   BOOST_COBALT_IO_DECL void adopt_endpoint_(endpoint & ep) override;
0077 
0078   asio::basic_seq_packet_socket<protocol_type, executor> seq_packet_socket_;
0079 };
0080 
0081 
0082 inline system::result<std::pair<seq_packet_socket, seq_packet_socket>> make_pair(decltype(local_seqpacket) protocol)
0083 {
0084   std::pair<seq_packet_socket, seq_packet_socket> res;
0085   auto c = connect_pair(protocol, res.first, res.second);
0086   if (c)
0087     return res;
0088   else
0089     return c.error();
0090 }
0091 
0092 }
0093 
0094 #endif //BOOST_COBALT_IOSEQ_PACKET_SOCKET_HPP