From 4af0482819b9353fc9d780ac6c6361beecd268c7 Mon Sep 17 00:00:00 2001 From: Ruixiang Du Date: Tue, 28 Jul 2020 18:47:18 +0800 Subject: [PATCH] updated pkg to use wrp_sdk, removed scout_webots_sim --- README.md | 1 - readme_zh.md | 3 +- scout_base/CMakeLists.txt | 4 +- .../include/scout_base/scout_messenger.hpp | 6 +- scout_base/package.xml | 4 +- scout_base/src/imu_broadcast_node.cpp | 72 - scout_base/src/scout_base_node.cpp | 4 +- scout_base/src/scout_messenger.cpp | 4 +- scout_sdk/CHANGELOG.md | 26 - scout_sdk/CMakeLists.txt | 156 - scout_sdk/README.md | 99 - scout_sdk/asio/asio.hpp | 152 - scout_sdk/asio/asio/associated_allocator.hpp | 131 - scout_sdk/asio/asio/associated_executor.hpp | 149 - scout_sdk/asio/asio/async_result.hpp | 221 - scout_sdk/asio/asio/basic_datagram_socket.hpp | 1040 ----- scout_sdk/asio/asio/basic_deadline_timer.hpp | 628 --- scout_sdk/asio/asio/basic_io_object.hpp | 290 -- scout_sdk/asio/asio/basic_raw_socket.hpp | 1030 ----- .../asio/asio/basic_seq_packet_socket.hpp | 618 --- scout_sdk/asio/asio/basic_serial_port.hpp | 688 ---- scout_sdk/asio/asio/basic_signal_set.hpp | 391 -- scout_sdk/asio/asio/basic_socket.hpp | 1757 -------- scout_sdk/asio/asio/basic_socket_acceptor.hpp | 1986 --------- scout_sdk/asio/asio/basic_socket_iostream.hpp | 430 -- .../asio/asio/basic_socket_streambuf.hpp | 707 ---- scout_sdk/asio/asio/basic_stream_socket.hpp | 921 ----- scout_sdk/asio/asio/basic_streambuf.hpp | 452 --- scout_sdk/asio/asio/basic_streambuf_fwd.hpp | 36 - scout_sdk/asio/asio/basic_waitable_timer.hpp | 705 ---- scout_sdk/asio/asio/bind_executor.hpp | 611 --- scout_sdk/asio/asio/buffer.hpp | 2162 ---------- scout_sdk/asio/asio/buffered_read_stream.hpp | 257 -- .../asio/asio/buffered_read_stream_fwd.hpp | 25 - scout_sdk/asio/asio/buffered_stream.hpp | 278 -- scout_sdk/asio/asio/buffered_stream_fwd.hpp | 25 - scout_sdk/asio/asio/buffered_write_stream.hpp | 249 -- .../asio/asio/buffered_write_stream_fwd.hpp | 25 - scout_sdk/asio/asio/buffers_iterator.hpp | 521 --- scout_sdk/asio/asio/completion_condition.hpp | 218 - scout_sdk/asio/asio/connect.hpp | 1059 ----- scout_sdk/asio/asio/coroutine.hpp | 328 -- .../asio/asio/datagram_socket_service.hpp | 466 --- scout_sdk/asio/asio/deadline_timer.hpp | 38 - .../asio/asio/deadline_timer_service.hpp | 173 - scout_sdk/asio/asio/defer.hpp | 107 - scout_sdk/asio/asio/detail/array.hpp | 38 - scout_sdk/asio/asio/detail/array_fwd.hpp | 34 - scout_sdk/asio/asio/detail/assert.hpp | 32 - scout_sdk/asio/asio/detail/atomic_count.hpp | 45 - .../asio/detail/base_from_completion_cond.hpp | 68 - scout_sdk/asio/asio/detail/bind_handler.hpp | 816 ---- .../asio/asio/detail/buffer_resize_guard.hpp | 66 - .../asio/detail/buffer_sequence_adapter.hpp | 544 --- .../asio/detail/buffered_stream_storage.hpp | 126 - scout_sdk/asio/asio/detail/call_stack.hpp | 125 - scout_sdk/asio/asio/detail/chrono.hpp | 66 - .../asio/asio/detail/chrono_time_traits.hpp | 190 - .../asio/asio/detail/completion_handler.hpp | 83 - .../asio/asio/detail/concurrency_hint.hpp | 94 - .../detail/conditionally_enabled_event.hpp | 112 - .../detail/conditionally_enabled_mutex.hpp | 149 - scout_sdk/asio/asio/detail/config.hpp | 1437 ------- .../asio/asio/detail/consuming_buffers.hpp | 414 -- scout_sdk/asio/asio/detail/cstddef.hpp | 31 - scout_sdk/asio/asio/detail/cstdint.hpp | 60 - scout_sdk/asio/asio/detail/date_time_fwd.hpp | 34 - .../asio/detail/deadline_timer_service.hpp | 278 -- scout_sdk/asio/asio/detail/dependent_type.hpp | 36 - scout_sdk/asio/asio/detail/descriptor_ops.hpp | 121 - .../asio/asio/detail/descriptor_read_op.hpp | 128 - .../asio/asio/detail/descriptor_write_op.hpp | 128 - .../asio/asio/detail/dev_poll_reactor.hpp | 218 - scout_sdk/asio/asio/detail/epoll_reactor.hpp | 266 -- scout_sdk/asio/asio/detail/event.hpp | 48 - .../detail/eventfd_select_interrupter.hpp | 83 - scout_sdk/asio/asio/detail/executor_op.hpp | 84 - scout_sdk/asio/asio/detail/fd_set_adapter.hpp | 39 - scout_sdk/asio/asio/detail/fenced_block.hpp | 80 - scout_sdk/asio/asio/detail/functional.hpp | 38 - .../asio/asio/detail/gcc_arm_fenced_block.hpp | 91 - .../asio/detail/gcc_hppa_fenced_block.hpp | 68 - .../asio/detail/gcc_sync_fenced_block.hpp | 65 - .../asio/asio/detail/gcc_x86_fenced_block.hpp | 99 - scout_sdk/asio/asio/detail/global.hpp | 52 - .../asio/detail/handler_alloc_helpers.hpp | 235 -- .../asio/asio/detail/handler_cont_helpers.hpp | 45 - .../asio/detail/handler_invoke_helpers.hpp | 57 - .../asio/asio/detail/handler_tracking.hpp | 238 -- .../asio/detail/handler_type_requirements.hpp | 556 --- scout_sdk/asio/asio/detail/handler_work.hpp | 95 - scout_sdk/asio/asio/detail/hash_map.hpp | 331 -- .../detail/impl/buffer_sequence_adapter.ipp | 118 - .../asio/asio/detail/impl/descriptor_ops.ipp | 474 --- .../asio/detail/impl/dev_poll_reactor.hpp | 91 - .../asio/detail/impl/dev_poll_reactor.ipp | 446 -- .../asio/asio/detail/impl/epoll_reactor.hpp | 89 - .../asio/asio/detail/impl/epoll_reactor.ipp | 787 ---- .../impl/eventfd_select_interrupter.ipp | 165 - .../asio/detail/impl/handler_tracking.ipp | 358 -- .../asio/asio/detail/impl/kqueue_reactor.hpp | 93 - .../asio/asio/detail/impl/kqueue_reactor.ipp | 566 --- .../asio/asio/detail/impl/null_event.ipp | 74 - .../detail/impl/pipe_select_interrupter.ipp | 124 - .../asio/asio/detail/impl/posix_event.ipp | 59 - .../asio/asio/detail/impl/posix_mutex.ipp | 46 - .../asio/asio/detail/impl/posix_thread.ipp | 84 - .../asio/asio/detail/impl/posix_tss_ptr.ipp | 46 - .../impl/reactive_descriptor_service.ipp | 222 - .../impl/reactive_serial_port_service.ipp | 152 - .../impl/reactive_socket_service_base.ipp | 300 -- .../detail/impl/resolver_service_base.ipp | 154 - scout_sdk/asio/asio/detail/impl/scheduler.ipp | 571 --- .../asio/asio/detail/impl/select_reactor.hpp | 100 - .../asio/asio/detail/impl/select_reactor.ipp | 333 -- .../asio/detail/impl/service_registry.hpp | 94 - .../asio/detail/impl/service_registry.ipp | 197 - .../asio/detail/impl/signal_set_service.ipp | 669 --- .../asio/asio/detail/impl/socket_ops.ipp | 3571 ----------------- .../detail/impl/socket_select_interrupter.ipp | 176 - .../detail/impl/strand_executor_service.hpp | 179 - .../detail/impl/strand_executor_service.ipp | 134 - .../asio/asio/detail/impl/strand_service.hpp | 118 - .../asio/asio/detail/impl/strand_service.ipp | 177 - .../asio/asio/detail/impl/throw_error.ipp | 60 - .../asio/detail/impl/timer_queue_ptime.ipp | 91 - .../asio/asio/detail/impl/timer_queue_set.ipp | 101 - scout_sdk/asio/asio/detail/impl/win_event.ipp | 76 - .../detail/impl/win_iocp_handle_service.ipp | 525 --- .../asio/detail/impl/win_iocp_io_context.hpp | 103 - .../asio/detail/impl/win_iocp_io_context.ipp | 554 --- .../impl/win_iocp_serial_port_service.ipp | 181 - .../impl/win_iocp_socket_service_base.ipp | 799 ---- scout_sdk/asio/asio/detail/impl/win_mutex.ipp | 84 - .../detail/impl/win_object_handle_service.ipp | 449 --- .../asio/detail/impl/win_static_mutex.ipp | 136 - .../asio/asio/detail/impl/win_thread.ipp | 150 - .../asio/asio/detail/impl/win_tss_ptr.ipp | 57 - .../impl/winrt_ssocket_service_base.ipp | 629 --- .../detail/impl/winrt_timer_scheduler.hpp | 92 - .../detail/impl/winrt_timer_scheduler.ipp | 122 - .../asio/asio/detail/impl/winsock_init.ipp | 82 - scout_sdk/asio/asio/detail/io_control.hpp | 84 - .../asio/asio/detail/is_buffer_sequence.hpp | 239 -- scout_sdk/asio/asio/detail/is_executor.hpp | 126 - .../asio/asio/detail/keyword_tss_ptr.hpp | 70 - scout_sdk/asio/asio/detail/kqueue_reactor.hpp | 242 -- scout_sdk/asio/asio/detail/limits.hpp | 26 - .../asio/detail/local_free_on_block_exit.hpp | 59 - .../asio/asio/detail/macos_fenced_block.hpp | 62 - scout_sdk/asio/asio/detail/memory.hpp | 70 - scout_sdk/asio/asio/detail/mutex.hpp | 48 - scout_sdk/asio/asio/detail/noncopyable.hpp | 43 - scout_sdk/asio/asio/detail/null_event.hpp | 100 - .../asio/asio/detail/null_fenced_block.hpp | 47 - scout_sdk/asio/asio/detail/null_global.hpp | 59 - scout_sdk/asio/asio/detail/null_mutex.hpp | 64 - scout_sdk/asio/asio/detail/null_reactor.hpp | 68 - .../asio/asio/detail/null_signal_blocker.hpp | 69 - .../asio/asio/detail/null_socket_service.hpp | 508 --- .../asio/asio/detail/null_static_mutex.hpp | 60 - scout_sdk/asio/asio/detail/null_thread.hpp | 67 - scout_sdk/asio/asio/detail/null_tss_ptr.hpp | 68 - scout_sdk/asio/asio/detail/object_pool.hpp | 171 - .../asio/asio/detail/old_win_sdk_compat.hpp | 214 - scout_sdk/asio/asio/detail/op_queue.hpp | 162 - scout_sdk/asio/asio/detail/operation.hpp | 38 - .../asio/detail/pipe_select_interrupter.hpp | 89 - scout_sdk/asio/asio/detail/pop_options.hpp | 135 - scout_sdk/asio/asio/detail/posix_event.hpp | 162 - .../asio/asio/detail/posix_fd_set_adapter.hpp | 118 - scout_sdk/asio/asio/detail/posix_global.hpp | 80 - scout_sdk/asio/asio/detail/posix_mutex.hpp | 76 - .../asio/asio/detail/posix_signal_blocker.hpp | 85 - .../asio/asio/detail/posix_static_mutex.hpp | 64 - scout_sdk/asio/asio/detail/posix_thread.hpp | 109 - scout_sdk/asio/asio/detail/posix_tss_ptr.hpp | 79 - scout_sdk/asio/asio/detail/push_options.hpp | 175 - .../detail/reactive_descriptor_service.hpp | 388 -- .../asio/detail/reactive_null_buffers_op.hpp | 90 - .../detail/reactive_serial_port_service.hpp | 236 -- .../asio/detail/reactive_socket_accept_op.hpp | 217 - .../detail/reactive_socket_connect_op.hpp | 113 - .../asio/detail/reactive_socket_recv_op.hpp | 135 - .../detail/reactive_socket_recvfrom_op.hpp | 138 - .../detail/reactive_socket_recvmsg_op.hpp | 132 - .../asio/detail/reactive_socket_send_op.hpp | 134 - .../asio/detail/reactive_socket_sendto_op.hpp | 130 - .../asio/detail/reactive_socket_service.hpp | 526 --- .../detail/reactive_socket_service_base.hpp | 511 --- .../asio/asio/detail/reactive_wait_op.hpp | 90 - scout_sdk/asio/asio/detail/reactor.hpp | 32 - scout_sdk/asio/asio/detail/reactor_fwd.hpp | 40 - scout_sdk/asio/asio/detail/reactor_op.hpp | 65 - .../asio/asio/detail/reactor_op_queue.hpp | 168 - .../asio/asio/detail/recycling_allocator.hpp | 104 - scout_sdk/asio/asio/detail/regex_fwd.hpp | 35 - .../asio/asio/detail/resolve_endpoint_op.hpp | 122 - scout_sdk/asio/asio/detail/resolve_op.hpp | 45 - .../asio/asio/detail/resolve_query_op.hpp | 134 - .../asio/asio/detail/resolver_service.hpp | 145 - .../asio/detail/resolver_service_base.hpp | 140 - scout_sdk/asio/asio/detail/scheduler.hpp | 213 - .../asio/asio/detail/scheduler_operation.hpp | 78 - .../asio/detail/scheduler_thread_info.hpp | 40 - scout_sdk/asio/asio/detail/scoped_lock.hpp | 101 - scout_sdk/asio/asio/detail/scoped_ptr.hpp | 87 - .../asio/asio/detail/select_interrupter.hpp | 46 - scout_sdk/asio/asio/detail/select_reactor.hpp | 238 -- .../asio/asio/detail/service_registry.hpp | 164 - scout_sdk/asio/asio/detail/signal_blocker.hpp | 44 - scout_sdk/asio/asio/detail/signal_handler.hpp | 86 - scout_sdk/asio/asio/detail/signal_init.hpp | 47 - scout_sdk/asio/asio/detail/signal_op.hpp | 49 - .../asio/asio/detail/signal_set_service.hpp | 217 - scout_sdk/asio/asio/detail/socket_holder.hpp | 98 - scout_sdk/asio/asio/detail/socket_ops.hpp | 337 -- scout_sdk/asio/asio/detail/socket_option.hpp | 316 -- .../asio/detail/socket_select_interrupter.hpp | 91 - scout_sdk/asio/asio/detail/socket_types.hpp | 416 -- .../asio/asio/detail/solaris_fenced_block.hpp | 62 - scout_sdk/asio/asio/detail/static_mutex.hpp | 52 - scout_sdk/asio/asio/detail/std_event.hpp | 176 - .../asio/asio/detail/std_fenced_block.hpp | 62 - scout_sdk/asio/asio/detail/std_global.hpp | 70 - scout_sdk/asio/asio/detail/std_mutex.hpp | 73 - .../asio/asio/detail/std_static_mutex.hpp | 81 - scout_sdk/asio/asio/detail/std_thread.hpp | 71 - .../asio/detail/strand_executor_service.hpp | 142 - scout_sdk/asio/asio/detail/strand_service.hpp | 142 - scout_sdk/asio/asio/detail/string_view.hpp | 47 - scout_sdk/asio/asio/detail/thread.hpp | 60 - scout_sdk/asio/asio/detail/thread_context.hpp | 42 - scout_sdk/asio/asio/detail/thread_group.hpp | 89 - .../asio/asio/detail/thread_info_base.hpp | 121 - scout_sdk/asio/asio/detail/throw_error.hpp | 53 - .../asio/asio/detail/throw_exception.hpp | 51 - scout_sdk/asio/asio/detail/timer_queue.hpp | 358 -- .../asio/asio/detail/timer_queue_base.hpp | 68 - .../asio/asio/detail/timer_queue_ptime.hpp | 99 - .../asio/asio/detail/timer_queue_set.hpp | 66 - .../asio/asio/detail/timer_scheduler.hpp | 35 - .../asio/asio/detail/timer_scheduler_fwd.hpp | 40 - scout_sdk/asio/asio/detail/tss_ptr.hpp | 69 - scout_sdk/asio/asio/detail/type_traits.hpp | 86 - .../asio/asio/detail/variadic_templates.hpp | 119 - scout_sdk/asio/asio/detail/wait_handler.hpp | 85 - scout_sdk/asio/asio/detail/wait_op.hpp | 45 - scout_sdk/asio/asio/detail/win_event.hpp | 151 - .../asio/asio/detail/win_fd_set_adapter.hpp | 149 - .../asio/asio/detail/win_fenced_block.hpp | 90 - scout_sdk/asio/asio/detail/win_global.hpp | 73 - .../asio/detail/win_iocp_handle_read_op.hpp | 111 - .../asio/detail/win_iocp_handle_service.hpp | 323 -- .../asio/detail/win_iocp_handle_write_op.hpp | 103 - .../asio/asio/detail/win_iocp_io_context.hpp | 328 -- .../asio/detail/win_iocp_null_buffers_op.hpp | 121 - .../asio/asio/detail/win_iocp_operation.hpp | 96 - .../asio/detail/win_iocp_overlapped_op.hpp | 90 - .../asio/detail/win_iocp_overlapped_ptr.hpp | 143 - .../detail/win_iocp_serial_port_service.hpp | 230 -- .../asio/detail/win_iocp_socket_accept_op.hpp | 297 -- .../detail/win_iocp_socket_connect_op.hpp | 127 - .../asio/detail/win_iocp_socket_recv_op.hpp | 117 - .../detail/win_iocp_socket_recvfrom_op.hpp | 125 - .../detail/win_iocp_socket_recvmsg_op.hpp | 118 - .../asio/detail/win_iocp_socket_send_op.hpp | 111 - .../asio/detail/win_iocp_socket_service.hpp | 599 --- .../detail/win_iocp_socket_service_base.hpp | 591 --- .../asio/asio/detail/win_iocp_thread_info.hpp | 34 - .../asio/asio/detail/win_iocp_wait_op.hpp | 121 - scout_sdk/asio/asio/detail/win_mutex.hpp | 78 - .../asio/detail/win_object_handle_service.hpp | 184 - .../asio/asio/detail/win_static_mutex.hpp | 74 - scout_sdk/asio/asio/detail/win_thread.hpp | 147 - scout_sdk/asio/asio/detail/win_tss_ptr.hpp | 79 - scout_sdk/asio/asio/detail/winapp_thread.hpp | 124 - scout_sdk/asio/asio/detail/wince_thread.hpp | 124 - .../asio/asio/detail/winrt_async_manager.hpp | 294 -- scout_sdk/asio/asio/detail/winrt_async_op.hpp | 65 - .../asio/asio/detail/winrt_resolve_op.hpp | 118 - .../asio/detail/winrt_resolver_service.hpp | 198 - .../asio/detail/winrt_socket_connect_op.hpp | 92 - .../asio/asio/detail/winrt_socket_recv_op.hpp | 112 - .../asio/asio/detail/winrt_socket_send_op.hpp | 103 - .../asio/detail/winrt_ssocket_service.hpp | 241 -- .../detail/winrt_ssocket_service_base.hpp | 359 -- .../asio/detail/winrt_timer_scheduler.hpp | 137 - scout_sdk/asio/asio/detail/winrt_utils.hpp | 106 - scout_sdk/asio/asio/detail/winsock_init.hpp | 128 - .../asio/asio/detail/work_dispatcher.hpp | 72 - .../asio/asio/detail/wrapped_handler.hpp | 291 -- scout_sdk/asio/asio/dispatch.hpp | 108 - scout_sdk/asio/asio/error.hpp | 356 -- scout_sdk/asio/asio/error_code.hpp | 202 - scout_sdk/asio/asio/execution_context.hpp | 411 -- scout_sdk/asio/asio/executor.hpp | 341 -- scout_sdk/asio/asio/executor_work_guard.hpp | 170 - scout_sdk/asio/asio/experimental.hpp | 22 - scout_sdk/asio/asio/experimental/co_spawn.hpp | 226 -- scout_sdk/asio/asio/experimental/detached.hpp | 65 - .../asio/asio/experimental/impl/co_spawn.hpp | 876 ---- .../asio/asio/experimental/impl/detached.hpp | 91 - .../asio/experimental/impl/redirect_error.hpp | 294 -- .../asio/asio/experimental/redirect_error.hpp | 67 - .../asio/asio/generic/basic_endpoint.hpp | 193 - .../asio/asio/generic/datagram_protocol.hpp | 123 - .../asio/asio/generic/detail/endpoint.hpp | 133 - .../asio/generic/detail/impl/endpoint.ipp | 110 - scout_sdk/asio/asio/generic/raw_protocol.hpp | 121 - .../asio/asio/generic/seq_packet_protocol.hpp | 122 - .../asio/asio/generic/stream_protocol.hpp | 127 - scout_sdk/asio/asio/handler_alloc_hook.hpp | 81 - .../asio/asio/handler_continuation_hook.hpp | 54 - scout_sdk/asio/asio/handler_invoke_hook.hpp | 85 - scout_sdk/asio/asio/handler_type.hpp | 50 - scout_sdk/asio/asio/high_resolution_timer.hpp | 44 - .../asio/asio/impl/buffered_read_stream.hpp | 429 -- .../asio/asio/impl/buffered_write_stream.hpp | 411 -- scout_sdk/asio/asio/impl/connect.hpp | 860 ---- scout_sdk/asio/asio/impl/defer.hpp | 77 - scout_sdk/asio/asio/impl/dispatch.hpp | 78 - scout_sdk/asio/asio/impl/error.ipp | 128 - scout_sdk/asio/asio/impl/error_code.ipp | 206 - .../asio/asio/impl/execution_context.hpp | 107 - .../asio/asio/impl/execution_context.ipp | 82 - scout_sdk/asio/asio/impl/executor.hpp | 386 -- scout_sdk/asio/asio/impl/executor.ipp | 38 - .../asio/asio/impl/handler_alloc_hook.ipp | 52 - scout_sdk/asio/asio/impl/io_context.hpp | 343 -- scout_sdk/asio/asio/impl/io_context.ipp | 174 - scout_sdk/asio/asio/impl/post.hpp | 77 - scout_sdk/asio/asio/impl/read.hpp | 715 ---- scout_sdk/asio/asio/impl/read_at.hpp | 640 --- scout_sdk/asio/asio/impl/read_until.hpp | 1500 ------- scout_sdk/asio/asio/impl/serial_port_base.hpp | 59 - scout_sdk/asio/asio/impl/serial_port_base.ipp | 554 --- scout_sdk/asio/asio/impl/spawn.hpp | 535 --- scout_sdk/asio/asio/impl/src.cpp | 25 - scout_sdk/asio/asio/impl/src.hpp | 82 - scout_sdk/asio/asio/impl/system_context.hpp | 34 - scout_sdk/asio/asio/impl/system_context.ipp | 73 - scout_sdk/asio/asio/impl/system_executor.hpp | 85 - scout_sdk/asio/asio/impl/thread_pool.hpp | 127 - scout_sdk/asio/asio/impl/thread_pool.ipp | 76 - scout_sdk/asio/asio/impl/use_future.hpp | 938 ----- scout_sdk/asio/asio/impl/write.hpp | 674 ---- scout_sdk/asio/asio/impl/write_at.hpp | 572 --- scout_sdk/asio/asio/io_context.hpp | 876 ---- scout_sdk/asio/asio/io_context_strand.hpp | 384 -- scout_sdk/asio/asio/io_service.hpp | 33 - scout_sdk/asio/asio/io_service_strand.hpp | 20 - scout_sdk/asio/asio/ip/address.hpp | 260 -- scout_sdk/asio/asio/ip/address_v4.hpp | 329 -- .../asio/asio/ip/address_v4_iterator.hpp | 162 - scout_sdk/asio/asio/ip/address_v4_range.hpp | 134 - scout_sdk/asio/asio/ip/address_v6.hpp | 336 -- .../asio/asio/ip/address_v6_iterator.hpp | 183 - scout_sdk/asio/asio/ip/address_v6_range.hpp | 129 - scout_sdk/asio/asio/ip/bad_address_cast.hpp | 48 - scout_sdk/asio/asio/ip/basic_endpoint.hpp | 263 -- scout_sdk/asio/asio/ip/basic_resolver.hpp | 1018 ----- .../asio/asio/ip/basic_resolver_entry.hpp | 113 - .../asio/asio/ip/basic_resolver_iterator.hpp | 192 - .../asio/asio/ip/basic_resolver_query.hpp | 244 -- .../asio/asio/ip/basic_resolver_results.hpp | 311 -- scout_sdk/asio/asio/ip/detail/endpoint.hpp | 139 - .../asio/asio/ip/detail/impl/endpoint.ipp | 199 - .../asio/asio/ip/detail/socket_option.hpp | 566 --- scout_sdk/asio/asio/ip/host_name.hpp | 42 - scout_sdk/asio/asio/ip/icmp.hpp | 115 - scout_sdk/asio/asio/ip/impl/address.hpp | 67 - scout_sdk/asio/asio/ip/impl/address.ipp | 234 -- scout_sdk/asio/asio/ip/impl/address_v4.hpp | 67 - scout_sdk/asio/asio/ip/impl/address_v4.ipp | 210 - scout_sdk/asio/asio/ip/impl/address_v6.hpp | 67 - scout_sdk/asio/asio/ip/impl/address_v6.ipp | 350 -- .../asio/asio/ip/impl/basic_endpoint.hpp | 43 - scout_sdk/asio/asio/ip/impl/host_name.ipp | 54 - scout_sdk/asio/asio/ip/impl/network_v4.hpp | 54 - scout_sdk/asio/asio/ip/impl/network_v4.ipp | 216 - scout_sdk/asio/asio/ip/impl/network_v6.hpp | 53 - scout_sdk/asio/asio/ip/impl/network_v6.ipp | 185 - scout_sdk/asio/asio/ip/multicast.hpp | 191 - scout_sdk/asio/asio/ip/network_v4.hpp | 261 -- scout_sdk/asio/asio/ip/network_v6.hpp | 235 -- scout_sdk/asio/asio/ip/resolver_base.hpp | 129 - .../asio/asio/ip/resolver_query_base.hpp | 43 - scout_sdk/asio/asio/ip/resolver_service.hpp | 200 - scout_sdk/asio/asio/ip/tcp.hpp | 155 - scout_sdk/asio/asio/ip/udp.hpp | 111 - scout_sdk/asio/asio/ip/unicast.hpp | 70 - scout_sdk/asio/asio/ip/v6_only.hpp | 69 - scout_sdk/asio/asio/is_executor.hpp | 46 - scout_sdk/asio/asio/is_read_buffered.hpp | 59 - scout_sdk/asio/asio/is_write_buffered.hpp | 59 - scout_sdk/asio/asio/local/basic_endpoint.hpp | 239 -- scout_sdk/asio/asio/local/connect_pair.hpp | 106 - .../asio/asio/local/datagram_protocol.hpp | 80 - scout_sdk/asio/asio/local/detail/endpoint.hpp | 133 - .../asio/asio/local/detail/impl/endpoint.ipp | 129 - scout_sdk/asio/asio/local/stream_protocol.hpp | 90 - scout_sdk/asio/asio/packaged_task.hpp | 126 - scout_sdk/asio/asio/placeholders.hpp | 151 - .../asio/asio/posix/basic_descriptor.hpp | 582 --- .../asio/posix/basic_stream_descriptor.hpp | 362 -- scout_sdk/asio/asio/posix/descriptor.hpp | 644 --- scout_sdk/asio/asio/posix/descriptor_base.hpp | 90 - .../asio/asio/posix/stream_descriptor.hpp | 360 -- .../asio/posix/stream_descriptor_service.hpp | 279 -- scout_sdk/asio/asio/post.hpp | 107 - scout_sdk/asio/asio/raw_socket_service.hpp | 466 --- scout_sdk/asio/asio/read.hpp | 947 ----- scout_sdk/asio/asio/read_at.hpp | 671 ---- scout_sdk/asio/asio/read_until.hpp | 1824 --------- .../asio/asio/seq_packet_socket_service.hpp | 416 -- scout_sdk/asio/asio/serial_port.hpp | 769 ---- scout_sdk/asio/asio/serial_port_base.hpp | 167 - scout_sdk/asio/asio/serial_port_service.hpp | 249 -- scout_sdk/asio/asio/signal_set.hpp | 447 --- scout_sdk/asio/asio/signal_set_service.hpp | 142 - .../asio/asio/socket_acceptor_service.hpp | 372 -- scout_sdk/asio/asio/socket_base.hpp | 559 --- scout_sdk/asio/asio/spawn.hpp | 336 -- scout_sdk/asio/asio/ssl.hpp | 27 - scout_sdk/asio/asio/ssl/context.hpp | 758 ---- scout_sdk/asio/asio/ssl/context_base.hpp | 192 - .../asio/ssl/detail/buffered_handshake_op.hpp | 114 - scout_sdk/asio/asio/ssl/detail/engine.hpp | 160 - .../asio/asio/ssl/detail/handshake_op.hpp | 62 - .../asio/asio/ssl/detail/impl/engine.ipp | 322 -- .../asio/ssl/detail/impl/openssl_init.ipp | 165 - scout_sdk/asio/asio/ssl/detail/io.hpp | 372 -- .../asio/asio/ssl/detail/openssl_init.hpp | 101 - .../asio/asio/ssl/detail/openssl_types.hpp | 30 - .../asio/ssl/detail/password_callback.hpp | 66 - scout_sdk/asio/asio/ssl/detail/read_op.hpp | 67 - .../asio/asio/ssl/detail/shutdown_op.hpp | 54 - .../asio/asio/ssl/detail/stream_core.hpp | 134 - .../asio/asio/ssl/detail/verify_callback.hpp | 62 - scout_sdk/asio/asio/ssl/detail/write_op.hpp | 67 - scout_sdk/asio/asio/ssl/error.hpp | 111 - scout_sdk/asio/asio/ssl/impl/context.hpp | 67 - scout_sdk/asio/asio/ssl/impl/context.ipp | 1159 ------ scout_sdk/asio/asio/ssl/impl/error.ipp | 100 - .../asio/ssl/impl/rfc2818_verification.ipp | 160 - scout_sdk/asio/asio/ssl/impl/src.hpp | 28 - .../asio/asio/ssl/rfc2818_verification.hpp | 94 - scout_sdk/asio/asio/ssl/stream.hpp | 761 ---- scout_sdk/asio/asio/ssl/stream_base.hpp | 52 - scout_sdk/asio/asio/ssl/verify_context.hpp | 67 - scout_sdk/asio/asio/ssl/verify_mode.hpp | 63 - scout_sdk/asio/asio/steady_timer.hpp | 42 - scout_sdk/asio/asio/strand.hpp | 286 -- scout_sdk/asio/asio/stream_socket_service.hpp | 412 -- scout_sdk/asio/asio/streambuf.hpp | 33 - scout_sdk/asio/asio/system_context.hpp | 78 - scout_sdk/asio/asio/system_error.hpp | 131 - scout_sdk/asio/asio/system_executor.hpp | 129 - scout_sdk/asio/asio/system_timer.hpp | 42 - scout_sdk/asio/asio/thread.hpp | 92 - scout_sdk/asio/asio/thread_pool.hpp | 232 -- scout_sdk/asio/asio/time_traits.hpp | 86 - scout_sdk/asio/asio/ts/buffer.hpp | 24 - scout_sdk/asio/asio/ts/executor.hpp | 35 - scout_sdk/asio/asio/ts/internet.hpp | 40 - scout_sdk/asio/asio/ts/io_context.hpp | 20 - scout_sdk/asio/asio/ts/net.hpp | 26 - scout_sdk/asio/asio/ts/netfwd.hpp | 197 - scout_sdk/asio/asio/ts/socket.hpp | 27 - scout_sdk/asio/asio/ts/timer.hpp | 26 - scout_sdk/asio/asio/unyield.hpp | 21 - scout_sdk/asio/asio/use_future.hpp | 159 - scout_sdk/asio/asio/uses_executor.hpp | 71 - scout_sdk/asio/asio/version.hpp | 23 - scout_sdk/asio/asio/wait_traits.hpp | 56 - .../asio/asio/waitable_timer_service.hpp | 210 - scout_sdk/asio/asio/windows/basic_handle.hpp | 273 -- .../asio/asio/windows/basic_object_handle.hpp | 182 - .../windows/basic_random_access_handle.hpp | 376 -- .../asio/asio/windows/basic_stream_handle.hpp | 359 -- scout_sdk/asio/asio/windows/object_handle.hpp | 381 -- .../asio/windows/object_handle_service.hpp | 183 - .../asio/asio/windows/overlapped_handle.hpp | 331 -- .../asio/asio/windows/overlapped_ptr.hpp | 116 - .../asio/windows/random_access_handle.hpp | 378 -- .../windows/random_access_handle_service.hpp | 214 - scout_sdk/asio/asio/windows/stream_handle.hpp | 362 -- .../asio/windows/stream_handle_service.hpp | 210 - scout_sdk/asio/asio/write.hpp | 927 ----- scout_sdk/asio/asio/write_at.hpp | 677 ---- scout_sdk/asio/asio/yield.hpp | 23 - scout_sdk/docs/SCOUT_UserManual_v1.2.10_S.pdf | Bin 2103003 -> 0 bytes .../docs/misc/SCOUT_UserManual_v1.2.8_CN.pdf | Bin 2023612 -> 0 bytes .../docs/misc/beaglebone_black_can_cape.md | 23 - scout_sdk/docs/misc/beaglebone_ros_install.md | 51 - scout_sdk/docs/misc/can_msg.txt | 2248 ----------- scout_sdk/docs/misc/check_endianness.md | 36 - scout_sdk/docs/misc/commands.md | 55 - scout_sdk/docs/misc/jetson_tx2_can.md | 12 - scout_sdk/docs/misc/release_checklist.md | 1 - scout_sdk/docs/misc/scout_interface.png | Bin 54516 -> 0 bytes scout_sdk/docs/misc/scout_monitor_tool.gif | Bin 552447 -> 0 bytes scout_sdk/docs/misc/test_can_msg.txt | 7 - .../include/scout_sdk/async_io/async_can.hpp | 138 - .../scout_sdk/async_io/async_serial.hpp | 153 - .../scout_sdk/async_io/device_error.hpp | 57 - .../include/scout_sdk/async_io/msg_buffer.hpp | 69 - scout_sdk/include/scout_sdk/scout_base.hpp | 110 - .../scout_protocol/scout_can_parser.h | 48 - .../scout_sdk/scout_protocol/scout_protocol.h | 283 -- .../scout_protocol/scout_uart_parser.h | 38 - scout_sdk/include/scout_sdk/scout_types.hpp | 111 - scout_sdk/package.xml | 65 - scout_sdk/scripts/bringup_can2usb.bash | 4 - scout_sdk/scripts/setup_can2usb.bash | 10 - scout_sdk/src/async_io/async_can.cpp | 202 - scout_sdk/src/async_io/async_serial.cpp | 342 -- scout_sdk/src/async_io/asyncio_utils.cpp | 82 - scout_sdk/src/async_io/asyncio_utils.hpp | 63 - scout_sdk/src/scout_base.cpp | 391 -- .../src/scout_protocol/scout_can_parser.c | 197 - .../src/scout_protocol/scout_uart_parser.c | 640 --- scout_webots_sim/CMakeLists.txt | 219 - scout_webots_sim/README.md | 15 - .../scout_webots_sim/scout_sim_params.hpp | 36 - .../scout_webots_interface.hpp | 41 - scout_webots_sim/launch/scout_base.launch | 23 - scout_webots_sim/launch/webots.launch | 7 - scout_webots_sim/package.xml | 85 - .../src/scout_webots_interface.cpp | 129 - scout_webots_sim/src/scout_webots_node.cpp | 119 - .../urdf/agilex_scout_webots.urdf | 72 - scout_webots_sim/worlds/scout_base.wbt | 541 --- 534 files changed, 12 insertions(+), 117058 deletions(-) delete mode 100644 scout_base/src/imu_broadcast_node.cpp delete mode 100644 scout_sdk/CHANGELOG.md delete mode 100644 scout_sdk/CMakeLists.txt delete mode 100755 scout_sdk/README.md delete mode 100644 scout_sdk/asio/asio.hpp delete mode 100644 scout_sdk/asio/asio/associated_allocator.hpp delete mode 100644 scout_sdk/asio/asio/associated_executor.hpp delete mode 100644 scout_sdk/asio/asio/async_result.hpp delete mode 100644 scout_sdk/asio/asio/basic_datagram_socket.hpp delete mode 100644 scout_sdk/asio/asio/basic_deadline_timer.hpp delete mode 100644 scout_sdk/asio/asio/basic_io_object.hpp delete mode 100644 scout_sdk/asio/asio/basic_raw_socket.hpp delete mode 100644 scout_sdk/asio/asio/basic_seq_packet_socket.hpp delete mode 100644 scout_sdk/asio/asio/basic_serial_port.hpp delete mode 100644 scout_sdk/asio/asio/basic_signal_set.hpp delete mode 100644 scout_sdk/asio/asio/basic_socket.hpp delete mode 100644 scout_sdk/asio/asio/basic_socket_acceptor.hpp delete mode 100644 scout_sdk/asio/asio/basic_socket_iostream.hpp delete mode 100644 scout_sdk/asio/asio/basic_socket_streambuf.hpp delete mode 100644 scout_sdk/asio/asio/basic_stream_socket.hpp delete mode 100644 scout_sdk/asio/asio/basic_streambuf.hpp delete mode 100644 scout_sdk/asio/asio/basic_streambuf_fwd.hpp delete mode 100644 scout_sdk/asio/asio/basic_waitable_timer.hpp delete mode 100644 scout_sdk/asio/asio/bind_executor.hpp delete mode 100644 scout_sdk/asio/asio/buffer.hpp delete mode 100644 scout_sdk/asio/asio/buffered_read_stream.hpp delete mode 100644 scout_sdk/asio/asio/buffered_read_stream_fwd.hpp delete mode 100644 scout_sdk/asio/asio/buffered_stream.hpp delete mode 100644 scout_sdk/asio/asio/buffered_stream_fwd.hpp delete mode 100644 scout_sdk/asio/asio/buffered_write_stream.hpp delete mode 100644 scout_sdk/asio/asio/buffered_write_stream_fwd.hpp delete mode 100644 scout_sdk/asio/asio/buffers_iterator.hpp delete mode 100644 scout_sdk/asio/asio/completion_condition.hpp delete mode 100644 scout_sdk/asio/asio/connect.hpp delete mode 100644 scout_sdk/asio/asio/coroutine.hpp delete mode 100644 scout_sdk/asio/asio/datagram_socket_service.hpp delete mode 100644 scout_sdk/asio/asio/deadline_timer.hpp delete mode 100644 scout_sdk/asio/asio/deadline_timer_service.hpp delete mode 100644 scout_sdk/asio/asio/defer.hpp delete mode 100644 scout_sdk/asio/asio/detail/array.hpp delete mode 100644 scout_sdk/asio/asio/detail/array_fwd.hpp delete mode 100644 scout_sdk/asio/asio/detail/assert.hpp delete mode 100644 scout_sdk/asio/asio/detail/atomic_count.hpp delete mode 100644 scout_sdk/asio/asio/detail/base_from_completion_cond.hpp delete mode 100644 scout_sdk/asio/asio/detail/bind_handler.hpp delete mode 100644 scout_sdk/asio/asio/detail/buffer_resize_guard.hpp delete mode 100644 scout_sdk/asio/asio/detail/buffer_sequence_adapter.hpp delete mode 100644 scout_sdk/asio/asio/detail/buffered_stream_storage.hpp delete mode 100644 scout_sdk/asio/asio/detail/call_stack.hpp delete mode 100644 scout_sdk/asio/asio/detail/chrono.hpp delete mode 100644 scout_sdk/asio/asio/detail/chrono_time_traits.hpp delete mode 100644 scout_sdk/asio/asio/detail/completion_handler.hpp delete mode 100644 scout_sdk/asio/asio/detail/concurrency_hint.hpp delete mode 100644 scout_sdk/asio/asio/detail/conditionally_enabled_event.hpp delete mode 100644 scout_sdk/asio/asio/detail/conditionally_enabled_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/config.hpp delete mode 100644 scout_sdk/asio/asio/detail/consuming_buffers.hpp delete mode 100644 scout_sdk/asio/asio/detail/cstddef.hpp delete mode 100644 scout_sdk/asio/asio/detail/cstdint.hpp delete mode 100644 scout_sdk/asio/asio/detail/date_time_fwd.hpp delete mode 100644 scout_sdk/asio/asio/detail/deadline_timer_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/dependent_type.hpp delete mode 100644 scout_sdk/asio/asio/detail/descriptor_ops.hpp delete mode 100644 scout_sdk/asio/asio/detail/descriptor_read_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/descriptor_write_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/dev_poll_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/epoll_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/event.hpp delete mode 100644 scout_sdk/asio/asio/detail/eventfd_select_interrupter.hpp delete mode 100644 scout_sdk/asio/asio/detail/executor_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/fd_set_adapter.hpp delete mode 100644 scout_sdk/asio/asio/detail/fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/functional.hpp delete mode 100644 scout_sdk/asio/asio/detail/gcc_arm_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/gcc_hppa_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/gcc_sync_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/gcc_x86_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/global.hpp delete mode 100644 scout_sdk/asio/asio/detail/handler_alloc_helpers.hpp delete mode 100644 scout_sdk/asio/asio/detail/handler_cont_helpers.hpp delete mode 100644 scout_sdk/asio/asio/detail/handler_invoke_helpers.hpp delete mode 100644 scout_sdk/asio/asio/detail/handler_tracking.hpp delete mode 100644 scout_sdk/asio/asio/detail/handler_type_requirements.hpp delete mode 100644 scout_sdk/asio/asio/detail/handler_work.hpp delete mode 100644 scout_sdk/asio/asio/detail/hash_map.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/buffer_sequence_adapter.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/descriptor_ops.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/dev_poll_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/dev_poll_reactor.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/epoll_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/epoll_reactor.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/eventfd_select_interrupter.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/handler_tracking.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/kqueue_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/kqueue_reactor.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/null_event.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/pipe_select_interrupter.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/posix_event.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/posix_mutex.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/posix_thread.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/posix_tss_ptr.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/reactive_descriptor_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/reactive_serial_port_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/reactive_socket_service_base.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/resolver_service_base.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/scheduler.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/select_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/select_reactor.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/service_registry.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/service_registry.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/signal_set_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/socket_ops.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/socket_select_interrupter.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/strand_executor_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/strand_executor_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/strand_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/strand_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/throw_error.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/timer_queue_ptime.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/timer_queue_set.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_event.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_iocp_handle_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_iocp_io_context.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_iocp_io_context.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_iocp_serial_port_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_iocp_socket_service_base.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_mutex.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_object_handle_service.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_static_mutex.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_thread.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/win_tss_ptr.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/winrt_ssocket_service_base.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.hpp delete mode 100644 scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.ipp delete mode 100644 scout_sdk/asio/asio/detail/impl/winsock_init.ipp delete mode 100644 scout_sdk/asio/asio/detail/io_control.hpp delete mode 100644 scout_sdk/asio/asio/detail/is_buffer_sequence.hpp delete mode 100644 scout_sdk/asio/asio/detail/is_executor.hpp delete mode 100644 scout_sdk/asio/asio/detail/keyword_tss_ptr.hpp delete mode 100644 scout_sdk/asio/asio/detail/kqueue_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/limits.hpp delete mode 100644 scout_sdk/asio/asio/detail/local_free_on_block_exit.hpp delete mode 100644 scout_sdk/asio/asio/detail/macos_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/memory.hpp delete mode 100644 scout_sdk/asio/asio/detail/mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/noncopyable.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_event.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_global.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_signal_blocker.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_socket_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_static_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_thread.hpp delete mode 100644 scout_sdk/asio/asio/detail/null_tss_ptr.hpp delete mode 100644 scout_sdk/asio/asio/detail/object_pool.hpp delete mode 100644 scout_sdk/asio/asio/detail/old_win_sdk_compat.hpp delete mode 100644 scout_sdk/asio/asio/detail/op_queue.hpp delete mode 100644 scout_sdk/asio/asio/detail/operation.hpp delete mode 100644 scout_sdk/asio/asio/detail/pipe_select_interrupter.hpp delete mode 100644 scout_sdk/asio/asio/detail/pop_options.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_event.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_fd_set_adapter.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_global.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_signal_blocker.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_static_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_thread.hpp delete mode 100644 scout_sdk/asio/asio/detail/posix_tss_ptr.hpp delete mode 100644 scout_sdk/asio/asio/detail/push_options.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_descriptor_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_null_buffers_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_serial_port_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_accept_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_connect_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_recv_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_recvfrom_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_recvmsg_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_send_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_sendto_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_socket_service_base.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactive_wait_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactor_fwd.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactor_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/reactor_op_queue.hpp delete mode 100644 scout_sdk/asio/asio/detail/recycling_allocator.hpp delete mode 100644 scout_sdk/asio/asio/detail/regex_fwd.hpp delete mode 100644 scout_sdk/asio/asio/detail/resolve_endpoint_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/resolve_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/resolve_query_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/resolver_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/resolver_service_base.hpp delete mode 100644 scout_sdk/asio/asio/detail/scheduler.hpp delete mode 100644 scout_sdk/asio/asio/detail/scheduler_operation.hpp delete mode 100644 scout_sdk/asio/asio/detail/scheduler_thread_info.hpp delete mode 100644 scout_sdk/asio/asio/detail/scoped_lock.hpp delete mode 100644 scout_sdk/asio/asio/detail/scoped_ptr.hpp delete mode 100644 scout_sdk/asio/asio/detail/select_interrupter.hpp delete mode 100644 scout_sdk/asio/asio/detail/select_reactor.hpp delete mode 100644 scout_sdk/asio/asio/detail/service_registry.hpp delete mode 100644 scout_sdk/asio/asio/detail/signal_blocker.hpp delete mode 100644 scout_sdk/asio/asio/detail/signal_handler.hpp delete mode 100644 scout_sdk/asio/asio/detail/signal_init.hpp delete mode 100644 scout_sdk/asio/asio/detail/signal_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/signal_set_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/socket_holder.hpp delete mode 100644 scout_sdk/asio/asio/detail/socket_ops.hpp delete mode 100644 scout_sdk/asio/asio/detail/socket_option.hpp delete mode 100644 scout_sdk/asio/asio/detail/socket_select_interrupter.hpp delete mode 100644 scout_sdk/asio/asio/detail/socket_types.hpp delete mode 100644 scout_sdk/asio/asio/detail/solaris_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/static_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/std_event.hpp delete mode 100644 scout_sdk/asio/asio/detail/std_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/std_global.hpp delete mode 100644 scout_sdk/asio/asio/detail/std_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/std_static_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/std_thread.hpp delete mode 100644 scout_sdk/asio/asio/detail/strand_executor_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/strand_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/string_view.hpp delete mode 100644 scout_sdk/asio/asio/detail/thread.hpp delete mode 100644 scout_sdk/asio/asio/detail/thread_context.hpp delete mode 100644 scout_sdk/asio/asio/detail/thread_group.hpp delete mode 100644 scout_sdk/asio/asio/detail/thread_info_base.hpp delete mode 100644 scout_sdk/asio/asio/detail/throw_error.hpp delete mode 100644 scout_sdk/asio/asio/detail/throw_exception.hpp delete mode 100644 scout_sdk/asio/asio/detail/timer_queue.hpp delete mode 100644 scout_sdk/asio/asio/detail/timer_queue_base.hpp delete mode 100644 scout_sdk/asio/asio/detail/timer_queue_ptime.hpp delete mode 100644 scout_sdk/asio/asio/detail/timer_queue_set.hpp delete mode 100644 scout_sdk/asio/asio/detail/timer_scheduler.hpp delete mode 100644 scout_sdk/asio/asio/detail/timer_scheduler_fwd.hpp delete mode 100644 scout_sdk/asio/asio/detail/tss_ptr.hpp delete mode 100644 scout_sdk/asio/asio/detail/type_traits.hpp delete mode 100644 scout_sdk/asio/asio/detail/variadic_templates.hpp delete mode 100644 scout_sdk/asio/asio/detail/wait_handler.hpp delete mode 100644 scout_sdk/asio/asio/detail/wait_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_event.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_fd_set_adapter.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_fenced_block.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_global.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_handle_read_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_handle_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_handle_write_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_io_context.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_null_buffers_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_operation.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_overlapped_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_overlapped_ptr.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_serial_port_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_accept_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_connect_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_recv_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_recvfrom_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_recvmsg_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_send_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_socket_service_base.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_thread_info.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_iocp_wait_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_object_handle_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_static_mutex.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_thread.hpp delete mode 100644 scout_sdk/asio/asio/detail/win_tss_ptr.hpp delete mode 100644 scout_sdk/asio/asio/detail/winapp_thread.hpp delete mode 100644 scout_sdk/asio/asio/detail/wince_thread.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_async_manager.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_async_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_resolve_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_resolver_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_socket_connect_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_socket_recv_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_socket_send_op.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_ssocket_service.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_ssocket_service_base.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_timer_scheduler.hpp delete mode 100644 scout_sdk/asio/asio/detail/winrt_utils.hpp delete mode 100644 scout_sdk/asio/asio/detail/winsock_init.hpp delete mode 100644 scout_sdk/asio/asio/detail/work_dispatcher.hpp delete mode 100644 scout_sdk/asio/asio/detail/wrapped_handler.hpp delete mode 100644 scout_sdk/asio/asio/dispatch.hpp delete mode 100644 scout_sdk/asio/asio/error.hpp delete mode 100644 scout_sdk/asio/asio/error_code.hpp delete mode 100644 scout_sdk/asio/asio/execution_context.hpp delete mode 100644 scout_sdk/asio/asio/executor.hpp delete mode 100644 scout_sdk/asio/asio/executor_work_guard.hpp delete mode 100644 scout_sdk/asio/asio/experimental.hpp delete mode 100644 scout_sdk/asio/asio/experimental/co_spawn.hpp delete mode 100644 scout_sdk/asio/asio/experimental/detached.hpp delete mode 100644 scout_sdk/asio/asio/experimental/impl/co_spawn.hpp delete mode 100644 scout_sdk/asio/asio/experimental/impl/detached.hpp delete mode 100644 scout_sdk/asio/asio/experimental/impl/redirect_error.hpp delete mode 100644 scout_sdk/asio/asio/experimental/redirect_error.hpp delete mode 100644 scout_sdk/asio/asio/generic/basic_endpoint.hpp delete mode 100644 scout_sdk/asio/asio/generic/datagram_protocol.hpp delete mode 100644 scout_sdk/asio/asio/generic/detail/endpoint.hpp delete mode 100644 scout_sdk/asio/asio/generic/detail/impl/endpoint.ipp delete mode 100644 scout_sdk/asio/asio/generic/raw_protocol.hpp delete mode 100644 scout_sdk/asio/asio/generic/seq_packet_protocol.hpp delete mode 100644 scout_sdk/asio/asio/generic/stream_protocol.hpp delete mode 100644 scout_sdk/asio/asio/handler_alloc_hook.hpp delete mode 100644 scout_sdk/asio/asio/handler_continuation_hook.hpp delete mode 100644 scout_sdk/asio/asio/handler_invoke_hook.hpp delete mode 100644 scout_sdk/asio/asio/handler_type.hpp delete mode 100644 scout_sdk/asio/asio/high_resolution_timer.hpp delete mode 100644 scout_sdk/asio/asio/impl/buffered_read_stream.hpp delete mode 100644 scout_sdk/asio/asio/impl/buffered_write_stream.hpp delete mode 100644 scout_sdk/asio/asio/impl/connect.hpp delete mode 100644 scout_sdk/asio/asio/impl/defer.hpp delete mode 100644 scout_sdk/asio/asio/impl/dispatch.hpp delete mode 100644 scout_sdk/asio/asio/impl/error.ipp delete mode 100644 scout_sdk/asio/asio/impl/error_code.ipp delete mode 100644 scout_sdk/asio/asio/impl/execution_context.hpp delete mode 100644 scout_sdk/asio/asio/impl/execution_context.ipp delete mode 100644 scout_sdk/asio/asio/impl/executor.hpp delete mode 100644 scout_sdk/asio/asio/impl/executor.ipp delete mode 100644 scout_sdk/asio/asio/impl/handler_alloc_hook.ipp delete mode 100644 scout_sdk/asio/asio/impl/io_context.hpp delete mode 100644 scout_sdk/asio/asio/impl/io_context.ipp delete mode 100644 scout_sdk/asio/asio/impl/post.hpp delete mode 100644 scout_sdk/asio/asio/impl/read.hpp delete mode 100644 scout_sdk/asio/asio/impl/read_at.hpp delete mode 100644 scout_sdk/asio/asio/impl/read_until.hpp delete mode 100644 scout_sdk/asio/asio/impl/serial_port_base.hpp delete mode 100644 scout_sdk/asio/asio/impl/serial_port_base.ipp delete mode 100644 scout_sdk/asio/asio/impl/spawn.hpp delete mode 100644 scout_sdk/asio/asio/impl/src.cpp delete mode 100644 scout_sdk/asio/asio/impl/src.hpp delete mode 100644 scout_sdk/asio/asio/impl/system_context.hpp delete mode 100644 scout_sdk/asio/asio/impl/system_context.ipp delete mode 100644 scout_sdk/asio/asio/impl/system_executor.hpp delete mode 100644 scout_sdk/asio/asio/impl/thread_pool.hpp delete mode 100644 scout_sdk/asio/asio/impl/thread_pool.ipp delete mode 100644 scout_sdk/asio/asio/impl/use_future.hpp delete mode 100644 scout_sdk/asio/asio/impl/write.hpp delete mode 100644 scout_sdk/asio/asio/impl/write_at.hpp delete mode 100644 scout_sdk/asio/asio/io_context.hpp delete mode 100644 scout_sdk/asio/asio/io_context_strand.hpp delete mode 100644 scout_sdk/asio/asio/io_service.hpp delete mode 100644 scout_sdk/asio/asio/io_service_strand.hpp delete mode 100644 scout_sdk/asio/asio/ip/address.hpp delete mode 100644 scout_sdk/asio/asio/ip/address_v4.hpp delete mode 100644 scout_sdk/asio/asio/ip/address_v4_iterator.hpp delete mode 100644 scout_sdk/asio/asio/ip/address_v4_range.hpp delete mode 100644 scout_sdk/asio/asio/ip/address_v6.hpp delete mode 100644 scout_sdk/asio/asio/ip/address_v6_iterator.hpp delete mode 100644 scout_sdk/asio/asio/ip/address_v6_range.hpp delete mode 100644 scout_sdk/asio/asio/ip/bad_address_cast.hpp delete mode 100644 scout_sdk/asio/asio/ip/basic_endpoint.hpp delete mode 100644 scout_sdk/asio/asio/ip/basic_resolver.hpp delete mode 100644 scout_sdk/asio/asio/ip/basic_resolver_entry.hpp delete mode 100644 scout_sdk/asio/asio/ip/basic_resolver_iterator.hpp delete mode 100644 scout_sdk/asio/asio/ip/basic_resolver_query.hpp delete mode 100644 scout_sdk/asio/asio/ip/basic_resolver_results.hpp delete mode 100644 scout_sdk/asio/asio/ip/detail/endpoint.hpp delete mode 100644 scout_sdk/asio/asio/ip/detail/impl/endpoint.ipp delete mode 100644 scout_sdk/asio/asio/ip/detail/socket_option.hpp delete mode 100644 scout_sdk/asio/asio/ip/host_name.hpp delete mode 100644 scout_sdk/asio/asio/ip/icmp.hpp delete mode 100644 scout_sdk/asio/asio/ip/impl/address.hpp delete mode 100644 scout_sdk/asio/asio/ip/impl/address.ipp delete mode 100644 scout_sdk/asio/asio/ip/impl/address_v4.hpp delete mode 100644 scout_sdk/asio/asio/ip/impl/address_v4.ipp delete mode 100644 scout_sdk/asio/asio/ip/impl/address_v6.hpp delete mode 100644 scout_sdk/asio/asio/ip/impl/address_v6.ipp delete mode 100644 scout_sdk/asio/asio/ip/impl/basic_endpoint.hpp delete mode 100644 scout_sdk/asio/asio/ip/impl/host_name.ipp delete mode 100644 scout_sdk/asio/asio/ip/impl/network_v4.hpp delete mode 100644 scout_sdk/asio/asio/ip/impl/network_v4.ipp delete mode 100644 scout_sdk/asio/asio/ip/impl/network_v6.hpp delete mode 100644 scout_sdk/asio/asio/ip/impl/network_v6.ipp delete mode 100644 scout_sdk/asio/asio/ip/multicast.hpp delete mode 100644 scout_sdk/asio/asio/ip/network_v4.hpp delete mode 100644 scout_sdk/asio/asio/ip/network_v6.hpp delete mode 100644 scout_sdk/asio/asio/ip/resolver_base.hpp delete mode 100644 scout_sdk/asio/asio/ip/resolver_query_base.hpp delete mode 100644 scout_sdk/asio/asio/ip/resolver_service.hpp delete mode 100644 scout_sdk/asio/asio/ip/tcp.hpp delete mode 100644 scout_sdk/asio/asio/ip/udp.hpp delete mode 100644 scout_sdk/asio/asio/ip/unicast.hpp delete mode 100644 scout_sdk/asio/asio/ip/v6_only.hpp delete mode 100644 scout_sdk/asio/asio/is_executor.hpp delete mode 100644 scout_sdk/asio/asio/is_read_buffered.hpp delete mode 100644 scout_sdk/asio/asio/is_write_buffered.hpp delete mode 100644 scout_sdk/asio/asio/local/basic_endpoint.hpp delete mode 100644 scout_sdk/asio/asio/local/connect_pair.hpp delete mode 100644 scout_sdk/asio/asio/local/datagram_protocol.hpp delete mode 100644 scout_sdk/asio/asio/local/detail/endpoint.hpp delete mode 100644 scout_sdk/asio/asio/local/detail/impl/endpoint.ipp delete mode 100644 scout_sdk/asio/asio/local/stream_protocol.hpp delete mode 100644 scout_sdk/asio/asio/packaged_task.hpp delete mode 100644 scout_sdk/asio/asio/placeholders.hpp delete mode 100644 scout_sdk/asio/asio/posix/basic_descriptor.hpp delete mode 100644 scout_sdk/asio/asio/posix/basic_stream_descriptor.hpp delete mode 100644 scout_sdk/asio/asio/posix/descriptor.hpp delete mode 100644 scout_sdk/asio/asio/posix/descriptor_base.hpp delete mode 100644 scout_sdk/asio/asio/posix/stream_descriptor.hpp delete mode 100644 scout_sdk/asio/asio/posix/stream_descriptor_service.hpp delete mode 100644 scout_sdk/asio/asio/post.hpp delete mode 100644 scout_sdk/asio/asio/raw_socket_service.hpp delete mode 100644 scout_sdk/asio/asio/read.hpp delete mode 100644 scout_sdk/asio/asio/read_at.hpp delete mode 100644 scout_sdk/asio/asio/read_until.hpp delete mode 100644 scout_sdk/asio/asio/seq_packet_socket_service.hpp delete mode 100644 scout_sdk/asio/asio/serial_port.hpp delete mode 100644 scout_sdk/asio/asio/serial_port_base.hpp delete mode 100644 scout_sdk/asio/asio/serial_port_service.hpp delete mode 100644 scout_sdk/asio/asio/signal_set.hpp delete mode 100644 scout_sdk/asio/asio/signal_set_service.hpp delete mode 100644 scout_sdk/asio/asio/socket_acceptor_service.hpp delete mode 100644 scout_sdk/asio/asio/socket_base.hpp delete mode 100644 scout_sdk/asio/asio/spawn.hpp delete mode 100644 scout_sdk/asio/asio/ssl.hpp delete mode 100644 scout_sdk/asio/asio/ssl/context.hpp delete mode 100644 scout_sdk/asio/asio/ssl/context_base.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/buffered_handshake_op.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/engine.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/handshake_op.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/impl/engine.ipp delete mode 100644 scout_sdk/asio/asio/ssl/detail/impl/openssl_init.ipp delete mode 100644 scout_sdk/asio/asio/ssl/detail/io.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/openssl_init.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/openssl_types.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/password_callback.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/read_op.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/shutdown_op.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/stream_core.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/verify_callback.hpp delete mode 100644 scout_sdk/asio/asio/ssl/detail/write_op.hpp delete mode 100644 scout_sdk/asio/asio/ssl/error.hpp delete mode 100644 scout_sdk/asio/asio/ssl/impl/context.hpp delete mode 100644 scout_sdk/asio/asio/ssl/impl/context.ipp delete mode 100644 scout_sdk/asio/asio/ssl/impl/error.ipp delete mode 100644 scout_sdk/asio/asio/ssl/impl/rfc2818_verification.ipp delete mode 100644 scout_sdk/asio/asio/ssl/impl/src.hpp delete mode 100644 scout_sdk/asio/asio/ssl/rfc2818_verification.hpp delete mode 100644 scout_sdk/asio/asio/ssl/stream.hpp delete mode 100644 scout_sdk/asio/asio/ssl/stream_base.hpp delete mode 100644 scout_sdk/asio/asio/ssl/verify_context.hpp delete mode 100644 scout_sdk/asio/asio/ssl/verify_mode.hpp delete mode 100644 scout_sdk/asio/asio/steady_timer.hpp delete mode 100644 scout_sdk/asio/asio/strand.hpp delete mode 100644 scout_sdk/asio/asio/stream_socket_service.hpp delete mode 100644 scout_sdk/asio/asio/streambuf.hpp delete mode 100644 scout_sdk/asio/asio/system_context.hpp delete mode 100644 scout_sdk/asio/asio/system_error.hpp delete mode 100644 scout_sdk/asio/asio/system_executor.hpp delete mode 100644 scout_sdk/asio/asio/system_timer.hpp delete mode 100644 scout_sdk/asio/asio/thread.hpp delete mode 100644 scout_sdk/asio/asio/thread_pool.hpp delete mode 100644 scout_sdk/asio/asio/time_traits.hpp delete mode 100644 scout_sdk/asio/asio/ts/buffer.hpp delete mode 100644 scout_sdk/asio/asio/ts/executor.hpp delete mode 100644 scout_sdk/asio/asio/ts/internet.hpp delete mode 100644 scout_sdk/asio/asio/ts/io_context.hpp delete mode 100644 scout_sdk/asio/asio/ts/net.hpp delete mode 100644 scout_sdk/asio/asio/ts/netfwd.hpp delete mode 100644 scout_sdk/asio/asio/ts/socket.hpp delete mode 100644 scout_sdk/asio/asio/ts/timer.hpp delete mode 100644 scout_sdk/asio/asio/unyield.hpp delete mode 100644 scout_sdk/asio/asio/use_future.hpp delete mode 100644 scout_sdk/asio/asio/uses_executor.hpp delete mode 100644 scout_sdk/asio/asio/version.hpp delete mode 100644 scout_sdk/asio/asio/wait_traits.hpp delete mode 100644 scout_sdk/asio/asio/waitable_timer_service.hpp delete mode 100644 scout_sdk/asio/asio/windows/basic_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/basic_object_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/basic_random_access_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/basic_stream_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/object_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/object_handle_service.hpp delete mode 100644 scout_sdk/asio/asio/windows/overlapped_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/overlapped_ptr.hpp delete mode 100644 scout_sdk/asio/asio/windows/random_access_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/random_access_handle_service.hpp delete mode 100644 scout_sdk/asio/asio/windows/stream_handle.hpp delete mode 100644 scout_sdk/asio/asio/windows/stream_handle_service.hpp delete mode 100644 scout_sdk/asio/asio/write.hpp delete mode 100644 scout_sdk/asio/asio/write_at.hpp delete mode 100644 scout_sdk/asio/asio/yield.hpp delete mode 100644 scout_sdk/docs/SCOUT_UserManual_v1.2.10_S.pdf delete mode 100644 scout_sdk/docs/misc/SCOUT_UserManual_v1.2.8_CN.pdf delete mode 100644 scout_sdk/docs/misc/beaglebone_black_can_cape.md delete mode 100644 scout_sdk/docs/misc/beaglebone_ros_install.md delete mode 100644 scout_sdk/docs/misc/can_msg.txt delete mode 100644 scout_sdk/docs/misc/check_endianness.md delete mode 100644 scout_sdk/docs/misc/commands.md delete mode 100644 scout_sdk/docs/misc/jetson_tx2_can.md delete mode 100644 scout_sdk/docs/misc/release_checklist.md delete mode 100755 scout_sdk/docs/misc/scout_interface.png delete mode 100644 scout_sdk/docs/misc/scout_monitor_tool.gif delete mode 100644 scout_sdk/docs/misc/test_can_msg.txt delete mode 100644 scout_sdk/include/scout_sdk/async_io/async_can.hpp delete mode 100644 scout_sdk/include/scout_sdk/async_io/async_serial.hpp delete mode 100644 scout_sdk/include/scout_sdk/async_io/device_error.hpp delete mode 100644 scout_sdk/include/scout_sdk/async_io/msg_buffer.hpp delete mode 100644 scout_sdk/include/scout_sdk/scout_base.hpp delete mode 100644 scout_sdk/include/scout_sdk/scout_protocol/scout_can_parser.h delete mode 100644 scout_sdk/include/scout_sdk/scout_protocol/scout_protocol.h delete mode 100644 scout_sdk/include/scout_sdk/scout_protocol/scout_uart_parser.h delete mode 100644 scout_sdk/include/scout_sdk/scout_types.hpp delete mode 100644 scout_sdk/package.xml delete mode 100755 scout_sdk/scripts/bringup_can2usb.bash delete mode 100755 scout_sdk/scripts/setup_can2usb.bash delete mode 100644 scout_sdk/src/async_io/async_can.cpp delete mode 100644 scout_sdk/src/async_io/async_serial.cpp delete mode 100644 scout_sdk/src/async_io/asyncio_utils.cpp delete mode 100644 scout_sdk/src/async_io/asyncio_utils.hpp delete mode 100644 scout_sdk/src/scout_base.cpp delete mode 100644 scout_sdk/src/scout_protocol/scout_can_parser.c delete mode 100644 scout_sdk/src/scout_protocol/scout_uart_parser.c delete mode 100644 scout_webots_sim/CMakeLists.txt delete mode 100644 scout_webots_sim/README.md delete mode 100644 scout_webots_sim/include/scout_webots_sim/scout_sim_params.hpp delete mode 100644 scout_webots_sim/include/scout_webots_sim/scout_webots_interface.hpp delete mode 100644 scout_webots_sim/launch/scout_base.launch delete mode 100644 scout_webots_sim/launch/webots.launch delete mode 100644 scout_webots_sim/package.xml delete mode 100644 scout_webots_sim/src/scout_webots_interface.cpp delete mode 100644 scout_webots_sim/src/scout_webots_node.cpp delete mode 100644 scout_webots_sim/urdf/agilex_scout_webots.urdf delete mode 100644 scout_webots_sim/worlds/scout_base.wbt diff --git a/README.md b/README.md index ebebc31..9698bfb 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ * scout_bringup: launch and configuration files to start ROS nodes * scout_base: a ROS wrapper around Scout SDK to monitor and control the robot -* scout_sdk: Scout SDK customized for ROS * scout_msgs: scout related message definitions * (scout_ros: meta package for the Scout robot ROS packages) diff --git a/readme_zh.md b/readme_zh.md index 9ae64ef..f01c68b 100644 --- a/readme_zh.md +++ b/readme_zh.md @@ -4,13 +4,12 @@ * scout_bringup: launch and configuration files to start ROS nodes * scout_base: a ROS wrapper around Scout SDK to monitor and control the robot -* scout_sdk: Scout SDK customized for ROS * scout_msgs: scout related message definitions * (scout_ros: meta package for the Scout robot ROS packages) 下图是是整个ros package的一个基本框架说明,或许它可以帮助你理解你理解整个ros package内部是如何工作的,他们之间的是相互联系的。 -其中最底层的是移动机器人底盘,它通过can或者usart实现运行在计算平台的sdK进行基本信息的获取,具体可以根据scout_sdk了解更多信息,进而对scout_sdk,仿真部分是基于Webots,构建起的仿真环境。 +其中最底层的是移动机器人底盘,它通过can或者usart实现运行在计算平台的sdk进行基本信息的获取,具体可以根据wrp_sdk了解更多信息。 仿真部分是基于Webots,构建起的仿真环境。 diff --git a/scout_base/CMakeLists.txt b/scout_base/CMakeLists.txt index 8e858e2..c68f608 100644 --- a/scout_base/CMakeLists.txt +++ b/scout_base/CMakeLists.txt @@ -15,7 +15,7 @@ find_package(catkin REQUIRED COMPONENTS std_msgs geometry_msgs scout_msgs - scout_sdk + wrp_sdk tf2 tf2_ros ) @@ -29,7 +29,7 @@ find_package(catkin REQUIRED COMPONENTS catkin_package( INCLUDE_DIRS include LIBRARIES scout_messenger - CATKIN_DEPENDS scout_msgs roscpp sensor_msgs scout_sdk + CATKIN_DEPENDS scout_msgs roscpp sensor_msgs # DEPENDS Boost ) diff --git a/scout_base/include/scout_base/scout_messenger.hpp b/scout_base/include/scout_base/scout_messenger.hpp index aaae791..498e381 100644 --- a/scout_base/include/scout_base/scout_messenger.hpp +++ b/scout_base/include/scout_base/scout_messenger.hpp @@ -18,9 +18,9 @@ #include #include "scout_msgs/ScoutLightCmd.h" -#include "scout_sdk/scout_base.hpp" +#include "wrp_sdk/platforms/scout/scout_base.hpp" -namespace wescore +namespace westonrobot { class ScoutROSMessenger { @@ -68,6 +68,6 @@ private: void LightCmdCallback(const scout_msgs::ScoutLightCmd::ConstPtr &msg); void PublishOdometryToROS(double linear, double angular, double dt); }; -} // namespace wescore +} // namespace westonrobot #endif /* SCOUT_MESSENGER_HPP */ diff --git a/scout_base/package.xml b/scout_base/package.xml index e7a1105..fa76a29 100644 --- a/scout_base/package.xml +++ b/scout_base/package.xml @@ -19,13 +19,13 @@ roslaunch roslint sensor_msgs - scout_sdk + wrp_sdk controller_manager geometry_msgs scout_msgs roscpp sensor_msgs topic_tools - scout_sdk + wrp_sdk diff --git a/scout_base/src/imu_broadcast_node.cpp b/scout_base/src/imu_broadcast_node.cpp deleted file mode 100644 index 93169fa..0000000 --- a/scout_base/src/imu_broadcast_node.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * imu_broadcast_node.cpp - * - * Created on: Oct 02, 2019 19:09 - * Description: - * - * Copyright (c) 2019 Ruixiang Du (rdu) - */ - -#include - -#include -#include "lcmtypes/wescore.hpp" - -#include -#include - -ros::Publisher imu_pub; - -struct MessageBroadcaster -{ - void IMULCMCallback(const lcm::ReceiveBuffer *rbuf, const std::string &chan, const wescore_lcm_msgs::IMU *msg) - { - static uint64_t count = 0; - // std::cout << "imu msg received" << std::endl; - sensor_msgs::Imu imu_msg; - imu_msg.header.frame_id = "imu_link"; - imu_msg.header.stamp = ros::Time::now(); - imu_msg.header.seq = count++; - - imu_msg.angular_velocity.x = msg->angular_velocity.x; - imu_msg.angular_velocity.y = msg->angular_velocity.y; - imu_msg.angular_velocity.z = msg->angular_velocity.z; - - imu_msg.linear_acceleration.x = msg->linear_acceleration.x; - imu_msg.linear_acceleration.y = msg->linear_acceleration.y; - imu_msg.linear_acceleration.z = msg->linear_acceleration.z; - - for (int i = 0; i < 9; ++i) - { - imu_msg.orientation_covariance[i] = msg->orientation_covariance[i]; - imu_msg.angular_velocity_covariance[i] = msg->angular_velocity_covariance[i]; - imu_msg.linear_acceleration_covariance[i] = msg->linear_acceleration_covariance[i]; - } - - imu_pub.publish(imu_msg); - } -}; - -int main(int argc, char **argv) -{ - // setup LCM - lcm::LCM lcm; - - if (!lcm.good()) - return 1; - MessageBroadcaster mb; - lcm.subscribe("sensor_hub_raw_imu", &MessageBroadcaster::IMULCMCallback, &mb); - - // setup ROS node - ros::init(argc, argv, "imu_broadcast_node"); - ros::NodeHandle nh; - imu_pub = nh.advertise("imu", 1000); - - ROS_INFO("Started broadcasting"); - while (ros::ok()) - { - lcm.handleTimeout(5); - } - - return 0; -} \ No newline at end of file diff --git a/scout_base/src/scout_base_node.cpp b/scout_base/src/scout_base_node.cpp index a3b7e05..c2cb104 100644 --- a/scout_base/src/scout_base_node.cpp +++ b/scout_base/src/scout_base_node.cpp @@ -5,10 +5,10 @@ #include #include -#include "scout_sdk/scout_base.hpp" +#include "wrp_sdk/platforms/scout/scout_base.hpp" #include "scout_base/scout_messenger.hpp" -using namespace wescore; +using namespace westonrobot; int main(int argc, char **argv) { diff --git a/scout_base/src/scout_messenger.cpp b/scout_base/src/scout_messenger.cpp index 585299b..02870b0 100644 --- a/scout_base/src/scout_messenger.cpp +++ b/scout_base/src/scout_messenger.cpp @@ -13,7 +13,7 @@ #include "scout_msgs/ScoutStatus.h" -namespace wescore +namespace westonrobot { ScoutROSMessenger::ScoutROSMessenger(ros::NodeHandle *nh) : scout_(nullptr), nh_(nh) { @@ -259,4 +259,4 @@ void ScoutROSMessenger::PublishOdometryToROS(double linear, double angular, doub odom_publisher_.publish(odom_msg); } -} // namespace wescore \ No newline at end of file +} // namespace westonrobot \ No newline at end of file diff --git a/scout_sdk/CHANGELOG.md b/scout_sdk/CHANGELOG.md deleted file mode 100644 index 622313a..0000000 --- a/scout_sdk/CHANGELOG.md +++ /dev/null @@ -1,26 +0,0 @@ -# Changelog for scout_sdk - -## 0.4 (2019-09-15) ------------------- -* Unified implementation of UART/CAN for firmware and SDK -* Improvements of code organization -* Contributors: Ruixiang Du - -## 0.3 (2019-08-02) ------------------- -* Added full UART support -* Contributors: Ruixiang Du - -## 0.2 (2019-06-14) ------------------- -* Deprecated initial serial interface support (new one under development) -* Added full CAN support -* Improved multi-threading implementation -* Contributors: Ruixiang Du - -## 0.1 (2019-05-07) ------------------- - -* Added basic serial communication support -* Provided C++ interface, ROS/LCM demo -* Contributors: Ruixiang Du diff --git a/scout_sdk/CMakeLists.txt b/scout_sdk/CMakeLists.txt deleted file mode 100644 index 9074470..0000000 --- a/scout_sdk/CMakeLists.txt +++ /dev/null @@ -1,156 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(scout_sdk) - -## Compile as C++11, supported in ROS Kinetic and newer -add_compile_options(-std=c++11) - -## Find catkin macros and libraries -find_package(catkin REQUIRED COMPONENTS - roscpp - std_msgs -) - -## System dependencies are found with CMake's conventions -# find_package(Boost REQUIRED COMPONENTS system) - -## Uncomment this if the package has a setup.py. This macro ensures -## modules and global scripts declared therein get installed -## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html -# catkin_python_setup() - -################################################ -## Declare ROS messages, services and actions ## -################################################ - -## To declare and build messages, services or actions from within this -## package, follow these steps: -## * Let MSG_DEP_SET be the set of packages whose message types you use in -## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). -## * In the file package.xml: -## * add a build_depend tag for "message_generation" -## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET -## * If MSG_DEP_SET isn't empty the following dependency has been pulled in -## but can be declared for certainty nonetheless: -## * add a exec_depend tag for "message_runtime" -## * In this file (CMakeLists.txt): -## * add "message_generation" and every package in MSG_DEP_SET to -## find_package(catkin REQUIRED COMPONENTS ...) -## * add "message_runtime" and every package in MSG_DEP_SET to -## catkin_package(CATKIN_DEPENDS ...) -## * uncomment the add_*_files sections below as needed -## and list every .msg/.srv/.action file to be processed -## * uncomment the generate_messages entry below -## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) - -## Generate messages in the 'msg' folder -# add_message_files( -# FILES -# Message1.msg -# Message2.msg -# ) - -## Generate services in the 'srv' folder -# add_service_files( -# FILES -# Service1.srv -# Service2.srv -# ) - -## Generate actions in the 'action' folder -# add_action_files( -# FILES -# Action1.action -# Action2.action -# ) - -## Generate added messages and services with any dependencies listed here -# generate_messages( -# DEPENDENCIES -# std_msgs -# ) - -################################################ -## Declare ROS dynamic reconfigure parameters ## -################################################ - -## To declare and build dynamic reconfigure parameters within this -## package, follow these steps: -## * In the file package.xml: -## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" -## * In this file (CMakeLists.txt): -## * add "dynamic_reconfigure" to -## find_package(catkin REQUIRED COMPONENTS ...) -## * uncomment the "generate_dynamic_reconfigure_options" section below -## and list every .cfg file to be processed - -## Generate dynamic reconfigure parameters in the 'cfg' folder -# generate_dynamic_reconfigure_options( -# cfg/DynReconf1.cfg -# cfg/DynReconf2.cfg -# ) - -################################### -## catkin specific configuration ## -################################### -## The catkin_package macro generates cmake config files for your package -## Declare things to be passed to dependent projects -## INCLUDE_DIRS: uncomment this if your package contains header files -## LIBRARIES: libraries you create in this project that dependent projects also need -## CATKIN_DEPENDS: catkin_packages dependent projects also need -## DEPENDS: system dependencies of this project that dependent projects also need -catkin_package( - INCLUDE_DIRS include - LIBRARIES scout_sdk - CATKIN_DEPENDS roscpp std_msgs -# DEPENDS system_lib -) - -########### -## Build ## -########### - -## Specify additional locations of header files -include_directories( - include - ${catkin_INCLUDE_DIRS} -) - -## Declare a C++ library -set(SCOUT_BASE_SRC - src/scout_base.cpp - src/scout_protocol/scout_can_parser.c - src/scout_protocol/scout_uart_parser.c - src/async_io/async_serial.cpp - src/async_io/async_can.cpp - src/async_io/asyncio_utils.cpp -) -add_library(scout_sdk STATIC ${SCOUT_BASE_SRC}) -set_target_properties(scout_sdk PROPERTIES POSITION_INDEPENDENT_CODE ON) -target_compile_definitions(scout_sdk PUBLIC "-DASIO_ENABLE_OLD_SERVICES -DASIO_HAS_POSIX_STREAM_DESCRIPTOR") -target_link_libraries(scout_sdk pthread ${catkin_LIBRARIES}) -target_include_directories(scout_sdk PUBLIC - $ - $ - $ - PRIVATE src) - -############# -## Install ## -############# - -install(TARGETS scout_sdk - RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} - LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} - ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}) - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}) - -install(DIRECTORY asio/asio - DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}) - -install(FILES asio/asio.hpp - DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}) - -install(DIRECTORY scripts - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}) \ No newline at end of file diff --git a/scout_sdk/README.md b/scout_sdk/README.md deleted file mode 100755 index 1e28c5c..0000000 --- a/scout_sdk/README.md +++ /dev/null @@ -1,99 +0,0 @@ -# SDK for AgileX Scout Mobile Base - -Copyright (c) 2019 [WestonRobot](https://www.westonrobot.com/) - -## Introduction - -This software packages provides a C++ interface to communicate with the Scout mobile base, for sending commands to the robot and acquiring the latest robot state. The SDK works on both x86 and ARM platforms. - -Generally, you only need to instantiate an object of "class ScoutBase", then use the object to programmatically control the robot. Internally, class ScoutBase manages two background threads, one to process CAN/UART messages of the robot state and accordingly update state variables in the ScoutState data structure, and the other to maintain a 50Hz loop and send the latest command to the robot base. User can iteratively perform tasks in the main thread and check the robot state or set control commands. - -Refer to "src/apps/scout_demo" for an example. - -## Package Structure - -* apps: demo to illustrate how to use the SDK, scout_monitor is a TUI application to monitor states of Scout -* comm/async_io: manages raw data communication with robot -* comm/scout_protocol: encoding and decoding of Scout UART/CAN protocols -* scout_base: interface to send command to robot and receive robot state -* third_party - - asio: asynchronous IO management (serial and CAN) - - googletest: for unit tests only (not required otherwise) - -## Setup CAN-To-USB adapter - -The instructions work for stm32f0-based adapter with [candleLight](https://github.com/HubertD/candleLight_fw) firmware on a host computer running Linux. (Refer to limitations listed at the bottom for more details.) - -1. Enable gs_usb kernel module - ``` - $ sudo modprobe gs_usb - ``` -2. Bringup can device - ``` - $ sudo ip link set can0 up type can bitrate 500000 - ``` -3. If no error occured during the previous steps, you should be able to see the can device now by using command - ``` - $ ifconfig -a - ``` -4. Install and use can-utils to test the hardware - ``` - $ sudo apt install can-utils - ``` -5. Testing command - ``` - # receiving data from can0 - $ candump can0 - # send data to can0 - $ cansend can0 001#1122334455667788 - ``` - -Two scripts inside the "./scripts" folder are provided for easy setup. You can run "./setup_can2usb.bash" for the first-time setup and run "./bringup_can2usb.bash" to bring up the device each time you unplug and re-plug the adapter. - -## Build SDK - -Install compile tools - -``` -$ sudo apt install build-essential cmake -``` - -If you want to build the TUI monitor tool, install libncurses - -``` -$ sudo apt install libncurses5-dev -``` - -Configure and build - -``` -$ cd scout_sdk -$ mkdir build -$ cd build -$ cmake .. -$ make -``` - -## Known Limitations - -1. The CAN interface requires the hardware to appear as a CAN device in the system. You can use the command "ifconfig" to check the interface status. For example, you may see something like - - ``` - can1: flags=193 mtu 16 - unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC) - RX packets 4751634 bytes 38013072 (36.2 MiB) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 126269 bytes 1010152 (986.4 KiB) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - device interrupt 43 - ``` - - If you use your own CAN-to-USB adapter, make sure it supports slcan or can be brought up as a native CAN device (for example, CANable https://www.canable.io/). Some adapters may use a custom-defined protocol and appear as a serial device in Linux. In such a case, you will have to translate the byte stream between CAN and UART by yourself. It would be difficult for us to provide support for them since not all manufacturers define this protocol in the same way. - - - -## Reference - -* [CAN command reference in Linux](https://wiki.rdu.im/_pages/Notes/Embedded-System/Linux/can-bus-in-linux.html) \ No newline at end of file diff --git a/scout_sdk/asio/asio.hpp b/scout_sdk/asio/asio.hpp deleted file mode 100644 index 3356df0..0000000 --- a/scout_sdk/asio/asio.hpp +++ /dev/null @@ -1,152 +0,0 @@ -// -// asio.hpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HPP -#define ASIO_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/async_result.hpp" -#include "asio/basic_datagram_socket.hpp" -#include "asio/basic_deadline_timer.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/basic_raw_socket.hpp" -#include "asio/basic_seq_packet_socket.hpp" -#include "asio/basic_serial_port.hpp" -#include "asio/basic_signal_set.hpp" -#include "asio/basic_socket_acceptor.hpp" -#include "asio/basic_socket_iostream.hpp" -#include "asio/basic_socket_streambuf.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/basic_streambuf.hpp" -#include "asio/basic_waitable_timer.hpp" -#include "asio/bind_executor.hpp" -#include "asio/buffer.hpp" -#include "asio/buffered_read_stream_fwd.hpp" -#include "asio/buffered_read_stream.hpp" -#include "asio/buffered_stream_fwd.hpp" -#include "asio/buffered_stream.hpp" -#include "asio/buffered_write_stream_fwd.hpp" -#include "asio/buffered_write_stream.hpp" -#include "asio/buffers_iterator.hpp" -#include "asio/completion_condition.hpp" -#include "asio/connect.hpp" -#include "asio/coroutine.hpp" -#include "asio/datagram_socket_service.hpp" -#include "asio/deadline_timer_service.hpp" -#include "asio/deadline_timer.hpp" -#include "asio/defer.hpp" -#include "asio/dispatch.hpp" -#include "asio/error.hpp" -#include "asio/error_code.hpp" -#include "asio/execution_context.hpp" -#include "asio/executor.hpp" -#include "asio/executor_work_guard.hpp" -#include "asio/generic/basic_endpoint.hpp" -#include "asio/generic/datagram_protocol.hpp" -#include "asio/generic/raw_protocol.hpp" -#include "asio/generic/seq_packet_protocol.hpp" -#include "asio/generic/stream_protocol.hpp" -#include "asio/handler_alloc_hook.hpp" -#include "asio/handler_continuation_hook.hpp" -#include "asio/handler_invoke_hook.hpp" -#include "asio/handler_type.hpp" -#include "asio/high_resolution_timer.hpp" -#include "asio/io_context.hpp" -#include "asio/io_context_strand.hpp" -#include "asio/io_service.hpp" -#include "asio/io_service_strand.hpp" -#include "asio/ip/address.hpp" -#include "asio/ip/address_v4.hpp" -#include "asio/ip/address_v4_iterator.hpp" -#include "asio/ip/address_v4_range.hpp" -#include "asio/ip/address_v6.hpp" -#include "asio/ip/address_v6_iterator.hpp" -#include "asio/ip/address_v6_range.hpp" -#include "asio/ip/bad_address_cast.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver.hpp" -#include "asio/ip/basic_resolver_entry.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/host_name.hpp" -#include "asio/ip/icmp.hpp" -#include "asio/ip/multicast.hpp" -#include "asio/ip/resolver_base.hpp" -#include "asio/ip/resolver_query_base.hpp" -#include "asio/ip/resolver_service.hpp" -#include "asio/ip/tcp.hpp" -#include "asio/ip/udp.hpp" -#include "asio/ip/unicast.hpp" -#include "asio/ip/v6_only.hpp" -#include "asio/is_executor.hpp" -#include "asio/is_read_buffered.hpp" -#include "asio/is_write_buffered.hpp" -#include "asio/local/basic_endpoint.hpp" -#include "asio/local/connect_pair.hpp" -#include "asio/local/datagram_protocol.hpp" -#include "asio/local/stream_protocol.hpp" -#include "asio/packaged_task.hpp" -#include "asio/placeholders.hpp" -#include "asio/posix/basic_descriptor.hpp" -#include "asio/posix/basic_stream_descriptor.hpp" -#include "asio/posix/descriptor.hpp" -#include "asio/posix/descriptor_base.hpp" -#include "asio/posix/stream_descriptor.hpp" -#include "asio/posix/stream_descriptor_service.hpp" -#include "asio/post.hpp" -#include "asio/raw_socket_service.hpp" -#include "asio/read.hpp" -#include "asio/read_at.hpp" -#include "asio/read_until.hpp" -#include "asio/seq_packet_socket_service.hpp" -#include "asio/serial_port.hpp" -#include "asio/serial_port_base.hpp" -#include "asio/serial_port_service.hpp" -#include "asio/signal_set.hpp" -#include "asio/signal_set_service.hpp" -#include "asio/socket_acceptor_service.hpp" -#include "asio/socket_base.hpp" -#include "asio/steady_timer.hpp" -#include "asio/strand.hpp" -#include "asio/stream_socket_service.hpp" -#include "asio/streambuf.hpp" -#include "asio/system_context.hpp" -#include "asio/system_error.hpp" -#include "asio/system_executor.hpp" -#include "asio/system_timer.hpp" -#include "asio/thread.hpp" -#include "asio/thread_pool.hpp" -#include "asio/time_traits.hpp" -#include "asio/use_future.hpp" -#include "asio/uses_executor.hpp" -#include "asio/version.hpp" -#include "asio/wait_traits.hpp" -#include "asio/waitable_timer_service.hpp" -#include "asio/windows/basic_handle.hpp" -#include "asio/windows/basic_object_handle.hpp" -#include "asio/windows/basic_random_access_handle.hpp" -#include "asio/windows/basic_stream_handle.hpp" -#include "asio/windows/object_handle.hpp" -#include "asio/windows/object_handle_service.hpp" -#include "asio/windows/overlapped_handle.hpp" -#include "asio/windows/overlapped_ptr.hpp" -#include "asio/windows/random_access_handle.hpp" -#include "asio/windows/random_access_handle_service.hpp" -#include "asio/windows/stream_handle.hpp" -#include "asio/windows/stream_handle_service.hpp" -#include "asio/write.hpp" -#include "asio/write_at.hpp" - -#endif // ASIO_HPP diff --git a/scout_sdk/asio/asio/associated_allocator.hpp b/scout_sdk/asio/asio/associated_allocator.hpp deleted file mode 100644 index 8b488bb..0000000 --- a/scout_sdk/asio/asio/associated_allocator.hpp +++ /dev/null @@ -1,131 +0,0 @@ -// -// associated_allocator.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ASSOCIATED_ALLOCATOR_HPP -#define ASIO_ASSOCIATED_ALLOCATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct associated_allocator_check -{ - typedef void type; -}; - -template -struct associated_allocator_impl -{ - typedef E type; - - static type get(const T&, const E& e) ASIO_NOEXCEPT - { - return e; - } -}; - -template -struct associated_allocator_impl::type> -{ - typedef typename T::allocator_type type; - - static type get(const T& t, const E&) ASIO_NOEXCEPT - { - return t.get_allocator(); - } -}; - -} // namespace detail - -/// Traits type used to obtain the allocator associated with an object. -/** - * A program may specialise this traits type if the @c T template parameter in - * the specialisation is a user-defined type. The template parameter @c - * Allocator shall be a type meeting the Allocator requirements. - * - * Specialisations shall meet the following requirements, where @c t is a const - * reference to an object of type @c T, and @c a is an object of type @c - * Allocator. - * - * @li Provide a nested typedef @c type that identifies a type meeting the - * Allocator requirements. - * - * @li Provide a noexcept static member function named @c get, callable as @c - * get(t) and with return type @c type. - * - * @li Provide a noexcept static member function named @c get, callable as @c - * get(t,a) and with return type @c type. - */ -template > -struct associated_allocator -{ - /// If @c T has a nested type @c allocator_type, T::allocator_type. - /// Otherwise @c Allocator. -#if defined(GENERATING_DOCUMENTATION) - typedef see_below type; -#else // defined(GENERATING_DOCUMENTATION) - typedef typename detail::associated_allocator_impl::type type; -#endif // defined(GENERATING_DOCUMENTATION) - - /// If @c T has a nested type @c allocator_type, returns - /// t.get_allocator(). Otherwise returns @c a. - static type get(const T& t, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return detail::associated_allocator_impl::get(t, a); - } -}; - -/// Helper function to obtain an object's associated allocator. -/** - * @returns associated_allocator::get(t) - */ -template -inline typename associated_allocator::type -get_associated_allocator(const T& t) ASIO_NOEXCEPT -{ - return associated_allocator::get(t); -} - -/// Helper function to obtain an object's associated allocator. -/** - * @returns associated_allocator::get(t, a) - */ -template -inline typename associated_allocator::type -get_associated_allocator(const T& t, const Allocator& a) ASIO_NOEXCEPT -{ - return associated_allocator::get(t, a); -} - -#if defined(ASIO_HAS_ALIAS_TEMPLATES) - -template > -using associated_allocator_t - = typename associated_allocator::type; - -#endif // defined(ASIO_HAS_ALIAS_TEMPLATES) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_ASSOCIATED_ALLOCATOR_HPP diff --git a/scout_sdk/asio/asio/associated_executor.hpp b/scout_sdk/asio/asio/associated_executor.hpp deleted file mode 100644 index 4c5c207..0000000 --- a/scout_sdk/asio/asio/associated_executor.hpp +++ /dev/null @@ -1,149 +0,0 @@ -// -// associated_executor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ASSOCIATED_EXECUTOR_HPP -#define ASIO_ASSOCIATED_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/is_executor.hpp" -#include "asio/system_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct associated_executor_check -{ - typedef void type; -}; - -template -struct associated_executor_impl -{ - typedef E type; - - static type get(const T&, const E& e) ASIO_NOEXCEPT - { - return e; - } -}; - -template -struct associated_executor_impl::type> -{ - typedef typename T::executor_type type; - - static type get(const T& t, const E&) ASIO_NOEXCEPT - { - return t.get_executor(); - } -}; - -} // namespace detail - -/// Traits type used to obtain the executor associated with an object. -/** - * A program may specialise this traits type if the @c T template parameter in - * the specialisation is a user-defined type. The template parameter @c - * Executor shall be a type meeting the Executor requirements. - * - * Specialisations shall meet the following requirements, where @c t is a const - * reference to an object of type @c T, and @c e is an object of type @c - * Executor. - * - * @li Provide a nested typedef @c type that identifies a type meeting the - * Executor requirements. - * - * @li Provide a noexcept static member function named @c get, callable as @c - * get(t) and with return type @c type. - * - * @li Provide a noexcept static member function named @c get, callable as @c - * get(t,e) and with return type @c type. - */ -template -struct associated_executor -{ - /// If @c T has a nested type @c executor_type, T::executor_type. - /// Otherwise @c Executor. -#if defined(GENERATING_DOCUMENTATION) - typedef see_below type; -#else // defined(GENERATING_DOCUMENTATION) - typedef typename detail::associated_executor_impl::type type; -#endif // defined(GENERATING_DOCUMENTATION) - - /// If @c T has a nested type @c executor_type, returns - /// t.get_executor(). Otherwise returns @c ex. - static type get(const T& t, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return detail::associated_executor_impl::get(t, ex); - } -}; - -/// Helper function to obtain an object's associated executor. -/** - * @returns associated_executor::get(t) - */ -template -inline typename associated_executor::type -get_associated_executor(const T& t) ASIO_NOEXCEPT -{ - return associated_executor::get(t); -} - -/// Helper function to obtain an object's associated executor. -/** - * @returns associated_executor::get(t, ex) - */ -template -inline typename associated_executor::type -get_associated_executor(const T& t, const Executor& ex, - typename enable_if::value>::type* = 0) ASIO_NOEXCEPT -{ - return associated_executor::get(t, ex); -} - -/// Helper function to obtain an object's associated executor. -/** - * @returns associated_executor::get(t, ctx.get_executor()) - */ -template -inline typename associated_executor::type -get_associated_executor(const T& t, ExecutionContext& ctx, - typename enable_if::value>::type* = 0) ASIO_NOEXCEPT -{ - return associated_executor::get(t, ctx.get_executor()); -} - -#if defined(ASIO_HAS_ALIAS_TEMPLATES) - -template -using associated_executor_t = typename associated_executor::type; - -#endif // defined(ASIO_HAS_ALIAS_TEMPLATES) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_ASSOCIATED_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/async_result.hpp b/scout_sdk/asio/asio/async_result.hpp deleted file mode 100644 index 18acdf2..0000000 --- a/scout_sdk/asio/asio/async_result.hpp +++ /dev/null @@ -1,221 +0,0 @@ -// -// async_result.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ASYNC_RESULT_HPP -#define ASIO_ASYNC_RESULT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/handler_type.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// An interface for customising the behaviour of an initiating function. -/** - * The async_result traits class is used for determining: - * - * @li the concrete completion handler type to be called at the end of the - * asynchronous operation; - * - * @li the initiating function return type; and - * - * @li how the return value of the initiating function is obtained. - * - * The trait allows the handler and return types to be determined at the point - * where the specific completion handler signature is known. - * - * This template may be specialised for user-defined completion token types. - * The primary template assumes that the CompletionToken is the completion - * handler. - */ -#if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) -template -#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) -template -#endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) -class async_result -{ -public: -#if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - /// The concrete completion handler type for the specific signature. - typedef CompletionToken completion_handler_type; - - /// The return type of the initiating function. - typedef void return_type; -#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - // For backward compatibility, determine the concrete completion handler type - // by using the legacy handler_type trait. - typedef typename handler_type::type - completion_handler_type; - - // For backward compatibility, determine the initiating function return type - // using the legacy single-parameter version of async_result. - typedef typename async_result::type return_type; -#endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - - /// Construct an async result from a given handler. - /** - * When using a specalised async_result, the constructor has an opportunity - * to initialise some state associated with the completion handler, which is - * then returned from the initiating function. - */ - explicit async_result(completion_handler_type& h) -#if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - // No data members to initialise. -#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - : legacy_result_(h) -#endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - { - (void)h; - } - - /// Obtain the value to be returned from the initiating function. - return_type get() - { -#if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - // Nothing to do. -#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - return legacy_result_.get(); -#endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - } - -private: - async_result(const async_result&) ASIO_DELETED; - async_result& operator=(const async_result&) ASIO_DELETED; - -#if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - // No data members. -#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - async_result legacy_result_; -#endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) -}; - -#if !defined(ASIO_NO_DEPRECATED) - -/// (Deprecated: Use two-parameter version of async_result.) An interface for -/// customising the behaviour of an initiating function. -/** - * This template may be specialised for user-defined handler types. - */ -template -class async_result -{ -public: - /// The return type of the initiating function. - typedef void type; - - /// Construct an async result from a given handler. - /** - * When using a specalised async_result, the constructor has an opportunity - * to initialise some state associated with the handler, which is then - * returned from the initiating function. - */ - explicit async_result(Handler&) - { - } - - /// Obtain the value to be returned from the initiating function. - type get() - { - } -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Helper template to deduce the handler type from a CompletionToken, capture -/// a local copy of the handler, and then create an async_result for the -/// handler. -template -struct async_completion -{ - /// The real handler type to be used for the asynchronous operation. - typedef typename asio::async_result< - typename decay::type, - Signature>::completion_handler_type completion_handler_type; - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Constructor. - /** - * The constructor creates the concrete completion handler and makes the link - * between the handler and the asynchronous result. - */ - explicit async_completion(CompletionToken& token) - : completion_handler(static_cast::value, - completion_handler_type&, CompletionToken&&>::type>(token)), - result(completion_handler) - { - } -#else // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - explicit async_completion(typename decay::type& token) - : completion_handler(token), - result(completion_handler) - { - } - - explicit async_completion(const typename decay::type& token) - : completion_handler(token), - result(completion_handler) - { - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// A copy of, or reference to, a real handler object. -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - typename conditional< - is_same::value, - completion_handler_type&, completion_handler_type>::type completion_handler; -#else // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - completion_handler_type completion_handler; -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// The result of the asynchronous operation's initiating function. - async_result::type, Signature> result; -}; - -namespace detail { - -template -struct async_result_helper - : async_result::type, Signature> -{ -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(GENERATING_DOCUMENTATION) -# define ASIO_INITFN_RESULT_TYPE(ct, sig) \ - void_or_deduced -#elif defined(_MSC_VER) && (_MSC_VER < 1500) -# define ASIO_INITFN_RESULT_TYPE(ct, sig) \ - typename ::asio::detail::async_result_helper< \ - ct, sig>::return_type -#define ASIO_HANDLER_TYPE(ct, sig) \ - typename ::asio::detail::async_result_helper< \ - ct, sig>::completion_handler_type -#else -# define ASIO_INITFN_RESULT_TYPE(ct, sig) \ - typename ::asio::async_result< \ - typename ::asio::decay::type, sig>::return_type -#define ASIO_HANDLER_TYPE(ct, sig) \ - typename ::asio::async_result< \ - typename ::asio::decay::type, sig>::completion_handler_type -#endif - -#endif // ASIO_ASYNC_RESULT_HPP diff --git a/scout_sdk/asio/asio/basic_datagram_socket.hpp b/scout_sdk/asio/asio/basic_datagram_socket.hpp deleted file mode 100644 index 346cc35..0000000 --- a/scout_sdk/asio/asio/basic_datagram_socket.hpp +++ /dev/null @@ -1,1040 +0,0 @@ -// -// basic_datagram_socket.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_DATAGRAM_SOCKET_HPP -#define ASIO_BASIC_DATAGRAM_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/basic_socket.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/datagram_socket_service.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides datagram-oriented socket functionality. -/** - * The basic_datagram_socket class template provides asynchronous and blocking - * datagram-oriented socket functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template )> -class basic_datagram_socket - : public basic_socket -{ -public: - /// The native representation of a socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename basic_socket< - Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct a basic_datagram_socket without opening it. - /** - * This constructor creates a datagram socket without opening it. The open() - * function must be called before data can be sent or received on the socket. - * - * @param io_context The io_context object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - */ - explicit basic_datagram_socket(asio::io_context& io_context) - : basic_socket(io_context) - { - } - - /// Construct and open a basic_datagram_socket. - /** - * This constructor creates and opens a datagram socket. - * - * @param io_context The io_context object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::system_error Thrown on failure. - */ - basic_datagram_socket(asio::io_context& io_context, - const protocol_type& protocol) - : basic_socket(io_context, protocol) - { - } - - /// Construct a basic_datagram_socket, opening it and binding it to the given - /// local endpoint. - /** - * This constructor creates a datagram socket and automatically opens it bound - * to the specified endpoint on the local machine. The protocol used is the - * protocol associated with the given endpoint. - * - * @param io_context The io_context object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param endpoint An endpoint on the local machine to which the datagram - * socket will be bound. - * - * @throws asio::system_error Thrown on failure. - */ - basic_datagram_socket(asio::io_context& io_context, - const endpoint_type& endpoint) - : basic_socket(io_context, endpoint) - { - } - - /// Construct a basic_datagram_socket on an existing native socket. - /** - * This constructor creates a datagram socket object to hold an existing - * native socket. - * - * @param io_context The io_context object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket The new underlying socket implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_datagram_socket(asio::io_context& io_context, - const protocol_type& protocol, const native_handle_type& native_socket) - : basic_socket( - io_context, protocol, native_socket) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_datagram_socket from another. - /** - * This constructor moves a datagram socket from one object to another. - * - * @param other The other basic_datagram_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_datagram_socket(io_context&) constructor. - */ - basic_datagram_socket(basic_datagram_socket&& other) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_datagram_socket from another. - /** - * This assignment operator moves a datagram socket from one object to - * another. - * - * @param other The other basic_datagram_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_datagram_socket(io_context&) constructor. - */ - basic_datagram_socket& operator=(basic_datagram_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } - - /// Move-construct a basic_datagram_socket from a socket of another protocol - /// type. - /** - * This constructor moves a datagram socket from one object to another. - * - * @param other The other basic_datagram_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_datagram_socket(io_context&) constructor. - */ - template - basic_datagram_socket( - basic_datagram_socket&& other, - typename enable_if::value>::type* = 0) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_datagram_socket from a socket of another protocol - /// type. - /** - * This assignment operator moves a datagram socket from one object to - * another. - * - * @param other The other basic_datagram_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_datagram_socket(io_context&) constructor. - */ - template - typename enable_if::value, - basic_datagram_socket>::type& operator=( - basic_datagram_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the socket. - /** - * This function destroys the socket, cancelling any outstanding asynchronous - * operations associated with the socket as if by calling @c cancel. - */ - ~basic_datagram_socket() - { - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One ore more data buffers to be sent on the socket. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected datagram socket. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code socket.send(asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "send"); - return s; - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One ore more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected datagram socket. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, flags, ec); - asio::detail::throw_error(ec, "send"); - return s; - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes sent. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected datagram socket. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return this->get_service().send( - this->get_implementation(), buffers, flags, ec); - } - - /// Start an asynchronous send on a connected socket. - /** - * This function is used to asynchronously send data on the datagram socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_send operation can only be used with a connected socket. - * Use the async_send_to function to send data on an unconnected datagram - * socket. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send(this->get_implementation(), - buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send(this->get_implementation(), - buffers, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous send on a connected socket. - /** - * This function is used to asynchronously send data on the datagram socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_send operation can only be used with a connected socket. - * Use the async_send_to function to send data on an unconnected datagram - * socket. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send(this->get_implementation(), - buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send(this->get_implementation(), - buffers, flags, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Send a datagram to the specified endpoint. - /** - * This function is used to send a datagram to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * asio::ip::udp::endpoint destination( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.send_to(asio::buffer(data, size), destination); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination) - { - asio::error_code ec; - std::size_t s = this->get_service().send_to( - this->get_implementation(), buffers, destination, 0, ec); - asio::detail::throw_error(ec, "send_to"); - return s; - } - - /// Send a datagram to the specified endpoint. - /** - * This function is used to send a datagram to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - */ - template - std::size_t send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().send_to( - this->get_implementation(), buffers, destination, flags, ec); - asio::detail::throw_error(ec, "send_to"); - return s; - } - - /// Send a datagram to the specified endpoint. - /** - * This function is used to send a datagram to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes sent. - */ - template - std::size_t send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - asio::error_code& ec) - { - return this->get_service().send_to(this->get_implementation(), - buffers, destination, flags, ec); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send a datagram to the specified - * remote endpoint. The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param destination The remote endpoint to which the data will be sent. - * Copies will be made of the endpoint as required. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * asio::ip::udp::endpoint destination( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.async_send_to( - * asio::buffer(data, size), destination, handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send_to( - this->get_implementation(), buffers, destination, 0, - ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send_to( - this->get_implementation(), buffers, destination, 0, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send a datagram to the specified - * remote endpoint. The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param destination The remote endpoint to which the data will be sent. - * Copies will be made of the endpoint as required. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send_to( - this->get_implementation(), buffers, destination, flags, - ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send_to( - this->get_implementation(), buffers, destination, flags, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the datagram socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected datagram - * socket. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code socket.receive(asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the datagram socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected datagram - * socket. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, flags, ec); - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the datagram socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes received. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected datagram - * socket. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return this->get_service().receive( - this->get_implementation(), buffers, flags, ec); - } - - /// Start an asynchronous receive on a connected socket. - /** - * This function is used to asynchronously receive data from the datagram - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_receive operation can only be used with a connected socket. - * Use the async_receive_from function to receive data on an unconnected - * datagram socket. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive(this->get_implementation(), - buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive(this->get_implementation(), - buffers, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous receive on a connected socket. - /** - * This function is used to asynchronously receive data from the datagram - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_receive operation can only be used with a connected socket. - * Use the async_receive_from function to receive data on an unconnected - * datagram socket. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive(this->get_implementation(), - buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive(this->get_implementation(), - buffers, flags, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Receive a datagram with the endpoint of the sender. - /** - * This function is used to receive a datagram. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * asio::ip::udp::endpoint sender_endpoint; - * socket.receive_from( - * asio::buffer(data, size), sender_endpoint); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint) - { - asio::error_code ec; - std::size_t s = this->get_service().receive_from( - this->get_implementation(), buffers, sender_endpoint, 0, ec); - asio::detail::throw_error(ec, "receive_from"); - return s; - } - - /// Receive a datagram with the endpoint of the sender. - /** - * This function is used to receive a datagram. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - */ - template - std::size_t receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().receive_from( - this->get_implementation(), buffers, sender_endpoint, flags, ec); - asio::detail::throw_error(ec, "receive_from"); - return s; - } - - /// Receive a datagram with the endpoint of the sender. - /** - * This function is used to receive a datagram. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes received. - */ - template - std::size_t receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - asio::error_code& ec) - { - return this->get_service().receive_from(this->get_implementation(), - buffers, sender_endpoint, flags, ec); - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive a datagram. The function - * call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. Ownership of the sender_endpoint object - * is retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code socket.async_receive_from( - * asio::buffer(data, size), sender_endpoint, handler); @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, 0, - ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, 0, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive a datagram. The function - * call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. Ownership of the sender_endpoint object - * is retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, flags, - ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, flags, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_DATAGRAM_SOCKET_HPP diff --git a/scout_sdk/asio/asio/basic_deadline_timer.hpp b/scout_sdk/asio/asio/basic_deadline_timer.hpp deleted file mode 100644 index 5b20066..0000000 --- a/scout_sdk/asio/asio/basic_deadline_timer.hpp +++ /dev/null @@ -1,628 +0,0 @@ -// -// basic_deadline_timer.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_DEADLINE_TIMER_HPP -#define ASIO_BASIC_DEADLINE_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/time_traits.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/deadline_timer_service.hpp" -#else // defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/detail/deadline_timer_service.hpp" -# define ASIO_SVC_T detail::deadline_timer_service -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides waitable timer functionality. -/** - * The basic_deadline_timer class template provides the ability to perform a - * blocking or asynchronous wait for a timer to expire. - * - * A deadline timer is always in one of two states: "expired" or "not expired". - * If the wait() or async_wait() function is called on an expired timer, the - * wait operation will complete immediately. - * - * Most applications will use the asio::deadline_timer typedef. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Examples - * Performing a blocking wait: - * @code - * // Construct a timer without setting an expiry time. - * asio::deadline_timer timer(io_context); - * - * // Set an expiry time relative to now. - * timer.expires_from_now(boost::posix_time::seconds(5)); - * - * // Wait for the timer to expire. - * timer.wait(); - * @endcode - * - * @par - * Performing an asynchronous wait: - * @code - * void handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Timer expired. - * } - * } - * - * ... - * - * // Construct a timer with an absolute expiry time. - * asio::deadline_timer timer(io_context, - * boost::posix_time::time_from_string("2005-12-07 23:59:59.000")); - * - * // Start an asynchronous wait. - * timer.async_wait(handler); - * @endcode - * - * @par Changing an active deadline_timer's expiry time - * - * Changing the expiry time of a timer while there are pending asynchronous - * waits causes those wait operations to be cancelled. To ensure that the action - * associated with the timer is performed only once, use something like this: - * used: - * - * @code - * void on_some_event() - * { - * if (my_timer.expires_from_now(seconds(5)) > 0) - * { - * // We managed to cancel the timer. Start new asynchronous wait. - * my_timer.async_wait(on_timeout); - * } - * else - * { - * // Too late, timer has already expired! - * } - * } - * - * void on_timeout(const asio::error_code& e) - * { - * if (e != asio::error::operation_aborted) - * { - * // Timer was not cancelled, take necessary action. - * } - * } - * @endcode - * - * @li The asio::basic_deadline_timer::expires_from_now() function - * cancels any pending asynchronous waits, and returns the number of - * asynchronous waits that were cancelled. If it returns 0 then you were too - * late and the wait handler has already been executed, or will soon be - * executed. If it returns 1 then the wait handler was successfully cancelled. - * - * @li If a wait handler is cancelled, the asio::error_code passed to - * it contains the value asio::error::operation_aborted. - */ -template - ASIO_SVC_TPARAM_DEF2(= deadline_timer_service)> -class basic_deadline_timer - : ASIO_SVC_ACCESS basic_io_object -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The time traits type. - typedef TimeTraits traits_type; - - /// The time type. - typedef typename traits_type::time_type time_type; - - /// The duration type. - typedef typename traits_type::duration_type duration_type; - - /// Constructor. - /** - * This constructor creates a timer without setting an expiry time. The - * expires_at() or expires_from_now() functions must be called to set an - * expiry time before the timer can be waited on. - * - * @param io_context The io_context object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - */ - explicit basic_deadline_timer(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Constructor to set a particular expiry time as an absolute time. - /** - * This constructor creates a timer and sets the expiry time. - * - * @param io_context The io_context object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - * - * @param expiry_time The expiry time to be used for the timer, expressed - * as an absolute time. - */ - basic_deadline_timer(asio::io_context& io_context, - const time_type& expiry_time) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().expires_at(this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_at"); - } - - /// Constructor to set a particular expiry time relative to now. - /** - * This constructor creates a timer and sets the expiry time. - * - * @param io_context The io_context object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - * - * @param expiry_time The expiry time to be used for the timer, relative to - * now. - */ - basic_deadline_timer(asio::io_context& io_context, - const duration_type& expiry_time) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().expires_from_now( - this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_from_now"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_deadline_timer from another. - /** - * This constructor moves a timer from one object to another. - * - * @param other The other basic_deadline_timer object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_deadline_timer(io_context&) constructor. - */ - basic_deadline_timer(basic_deadline_timer&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign a basic_deadline_timer from another. - /** - * This assignment operator moves a timer from one object to another. Cancels - * any outstanding asynchronous operations associated with the target object. - * - * @param other The other basic_deadline_timer object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_deadline_timer(io_context&) constructor. - */ - basic_deadline_timer& operator=(basic_deadline_timer&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the timer. - /** - * This function destroys the timer, cancelling any outstanding asynchronous - * wait operations associated with the timer as if by calling @c cancel. - */ - ~basic_deadline_timer() - { - } - -#if defined(ASIO_ENABLE_OLD_SERVICES) - // These functions are provided by basic_io_object<>. -#else // defined(ASIO_ENABLE_OLD_SERVICES) -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - - /// Cancel any asynchronous operations that are waiting on the timer. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the timer. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @return The number of asynchronous operations that were cancelled. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel() - { - asio::error_code ec; - std::size_t s = this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - return s; - } - - /// Cancel any asynchronous operations that are waiting on the timer. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the timer. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. - * - * @note If the timer has already expired when cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel(asio::error_code& ec) - { - return this->get_service().cancel(this->get_implementation(), ec); - } - - /// Cancels one asynchronous operation that is waiting on the timer. - /** - * This function forces the completion of one pending asynchronous wait - * operation against the timer. Handlers are cancelled in FIFO order. The - * handler for the cancelled operation will be invoked with the - * asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @return The number of asynchronous operations that were cancelled. That is, - * either 0 or 1. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when cancel_one() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel_one() - { - asio::error_code ec; - std::size_t s = this->get_service().cancel_one( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel_one"); - return s; - } - - /// Cancels one asynchronous operation that is waiting on the timer. - /** - * This function forces the completion of one pending asynchronous wait - * operation against the timer. Handlers are cancelled in FIFO order. The - * handler for the cancelled operation will be invoked with the - * asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. That is, - * either 0 or 1. - * - * @note If the timer has already expired when cancel_one() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel_one(asio::error_code& ec) - { - return this->get_service().cancel_one(this->get_implementation(), ec); - } - - /// Get the timer's expiry time as an absolute time. - /** - * This function may be used to obtain the timer's current expiry time. - * Whether the timer has expired or not does not affect this value. - */ - time_type expires_at() const - { - return this->get_service().expires_at(this->get_implementation()); - } - - /// Set the timer's expiry time as an absolute time. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @return The number of asynchronous operations that were cancelled. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when expires_at() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_at(const time_type& expiry_time) - { - asio::error_code ec; - std::size_t s = this->get_service().expires_at( - this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_at"); - return s; - } - - /// Set the timer's expiry time as an absolute time. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. - * - * @note If the timer has already expired when expires_at() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_at(const time_type& expiry_time, - asio::error_code& ec) - { - return this->get_service().expires_at( - this->get_implementation(), expiry_time, ec); - } - - /// Get the timer's expiry time relative to now. - /** - * This function may be used to obtain the timer's current expiry time. - * Whether the timer has expired or not does not affect this value. - */ - duration_type expires_from_now() const - { - return this->get_service().expires_from_now(this->get_implementation()); - } - - /// Set the timer's expiry time relative to now. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @return The number of asynchronous operations that were cancelled. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when expires_from_now() is called, - * then the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_from_now(const duration_type& expiry_time) - { - asio::error_code ec; - std::size_t s = this->get_service().expires_from_now( - this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_from_now"); - return s; - } - - /// Set the timer's expiry time relative to now. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. - * - * @note If the timer has already expired when expires_from_now() is called, - * then the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_from_now(const duration_type& expiry_time, - asio::error_code& ec) - { - return this->get_service().expires_from_now( - this->get_implementation(), expiry_time, ec); - } - - /// Perform a blocking wait on the timer. - /** - * This function is used to wait for the timer to expire. This function - * blocks and does not return until the timer has expired. - * - * @throws asio::system_error Thrown on failure. - */ - void wait() - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Perform a blocking wait on the timer. - /** - * This function is used to wait for the timer to expire. This function - * blocks and does not return until the timer has expired. - * - * @param ec Set to indicate what error occurred, if any. - */ - void wait(asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), ec); - } - - /// Start an asynchronous wait on the timer. - /** - * This function may be used to initiate an asynchronous wait against the - * timer. It always returns immediately. - * - * For each call to async_wait(), the supplied handler will be called exactly - * once. The handler will be called when: - * - * @li The timer has expired. - * - * @li The timer was cancelled, in which case the handler is passed the error - * code asio::error::operation_aborted. - * - * @param handler The handler to be called when the timer expires. Copies - * will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(ASIO_MOVE_ARG(WaitHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WaitHandler. - ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_wait(this->get_implementation(), - ASIO_MOVE_CAST(WaitHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_wait(this->get_implementation(), - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# undef ASIO_SVC_T -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_BASIC_DEADLINE_TIMER_HPP diff --git a/scout_sdk/asio/asio/basic_io_object.hpp b/scout_sdk/asio/asio/basic_io_object.hpp deleted file mode 100644 index 442e854..0000000 --- a/scout_sdk/asio/asio/basic_io_object.hpp +++ /dev/null @@ -1,290 +0,0 @@ -// -// basic_io_object.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_IO_OBJECT_HPP -#define ASIO_BASIC_IO_OBJECT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if defined(ASIO_HAS_MOVE) -namespace detail -{ - // Type trait used to determine whether a service supports move. - template - class service_has_move - { - private: - typedef IoObjectService service_type; - typedef typename service_type::implementation_type implementation_type; - - template - static auto asio_service_has_move_eval(T* t, U* u) - -> decltype(t->move_construct(*u, *u), char()); - static char (&asio_service_has_move_eval(...))[2]; - - public: - static const bool value = - sizeof(asio_service_has_move_eval( - static_cast(0), - static_cast(0))) == 1; - }; -} -#endif // defined(ASIO_HAS_MOVE) - -/// Base class for all I/O objects. -/** - * @note All I/O objects are non-copyable. However, when using C++0x, certain - * I/O objects do support move construction and move assignment. - */ -#if !defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) -template -#else -template ::value> -#endif -class basic_io_object -{ -public: - /// The type of the service that will be used to provide I/O operations. - typedef IoObjectService service_type; - - /// The underlying implementation type of I/O object. - typedef typename service_type::implementation_type implementation_type; - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return service_.get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return service_.get_io_context(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// The type of the executor associated with the object. - typedef asio::io_context::executor_type executor_type; - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return service_.get_io_context().get_executor(); - } - -protected: - /// Construct a basic_io_object. - /** - * Performs: - * @code get_service().construct(get_implementation()); @endcode - */ - explicit basic_io_object(asio::io_context& io_context) - : service_(asio::use_service(io_context)) - { - service_.construct(implementation_); - } - -#if defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_io_object. - /** - * Performs: - * @code get_service().move_construct( - * get_implementation(), other.get_implementation()); @endcode - * - * @note Available only for services that support movability, - */ - basic_io_object(basic_io_object&& other); - - /// Move-assign a basic_io_object. - /** - * Performs: - * @code get_service().move_assign(get_implementation(), - * other.get_service(), other.get_implementation()); @endcode - * - * @note Available only for services that support movability, - */ - basic_io_object& operator=(basic_io_object&& other); - - /// Perform a converting move-construction of a basic_io_object. - template - basic_io_object(IoObjectService1& other_service, - typename IoObjectService1::implementation_type& other_implementation); -#endif // defined(GENERATING_DOCUMENTATION) - - /// Protected destructor to prevent deletion through this type. - /** - * Performs: - * @code get_service().destroy(get_implementation()); @endcode - */ - ~basic_io_object() - { - service_.destroy(implementation_); - } - - /// Get the service associated with the I/O object. - service_type& get_service() - { - return service_; - } - - /// Get the service associated with the I/O object. - const service_type& get_service() const - { - return service_; - } - - /// Get the underlying implementation of the I/O object. - implementation_type& get_implementation() - { - return implementation_; - } - - /// Get the underlying implementation of the I/O object. - const implementation_type& get_implementation() const - { - return implementation_; - } - -private: - basic_io_object(const basic_io_object&); - basic_io_object& operator=(const basic_io_object&); - - // The service associated with the I/O object. - service_type& service_; - - /// The underlying implementation of the I/O object. - implementation_type implementation_; -}; - -#if defined(ASIO_HAS_MOVE) -// Specialisation for movable objects. -template -class basic_io_object -{ -public: - typedef IoObjectService service_type; - typedef typename service_type::implementation_type implementation_type; - -#if !defined(ASIO_NO_DEPRECATED) - asio::io_context& get_io_context() - { - return service_->get_io_context(); - } - - asio::io_context& get_io_service() - { - return service_->get_io_context(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - typedef asio::io_context::executor_type executor_type; - - executor_type get_executor() ASIO_NOEXCEPT - { - return service_->get_io_context().get_executor(); - } - -protected: - explicit basic_io_object(asio::io_context& io_context) - : service_(&asio::use_service(io_context)) - { - service_->construct(implementation_); - } - - basic_io_object(basic_io_object&& other) - : service_(&other.get_service()) - { - service_->move_construct(implementation_, other.implementation_); - } - - template - basic_io_object(IoObjectService1& other_service, - typename IoObjectService1::implementation_type& other_implementation) - : service_(&asio::use_service( - other_service.get_io_context())) - { - service_->converting_move_construct(implementation_, - other_service, other_implementation); - } - - ~basic_io_object() - { - service_->destroy(implementation_); - } - - basic_io_object& operator=(basic_io_object&& other) - { - service_->move_assign(implementation_, - *other.service_, other.implementation_); - service_ = other.service_; - return *this; - } - - service_type& get_service() - { - return *service_; - } - - const service_type& get_service() const - { - return *service_; - } - - implementation_type& get_implementation() - { - return implementation_; - } - - const implementation_type& get_implementation() const - { - return implementation_; - } - -private: - basic_io_object(const basic_io_object&); - void operator=(const basic_io_object&); - - IoObjectService* service_; - implementation_type implementation_; -}; -#endif // defined(ASIO_HAS_MOVE) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_IO_OBJECT_HPP diff --git a/scout_sdk/asio/asio/basic_raw_socket.hpp b/scout_sdk/asio/asio/basic_raw_socket.hpp deleted file mode 100644 index 0de7c77..0000000 --- a/scout_sdk/asio/asio/basic_raw_socket.hpp +++ /dev/null @@ -1,1030 +0,0 @@ -// -// basic_raw_socket.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_RAW_SOCKET_HPP -#define ASIO_BASIC_RAW_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/basic_socket.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/raw_socket_service.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides raw-oriented socket functionality. -/** - * The basic_raw_socket class template provides asynchronous and blocking - * raw-oriented socket functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template )> -class basic_raw_socket - : public basic_socket -{ -public: - /// The native representation of a socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename basic_socket< - Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct a basic_raw_socket without opening it. - /** - * This constructor creates a raw socket without opening it. The open() - * function must be called before data can be sent or received on the socket. - * - * @param io_context The io_context object that the raw socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - */ - explicit basic_raw_socket(asio::io_context& io_context) - : basic_socket(io_context) - { - } - - /// Construct and open a basic_raw_socket. - /** - * This constructor creates and opens a raw socket. - * - * @param io_context The io_context object that the raw socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::system_error Thrown on failure. - */ - basic_raw_socket(asio::io_context& io_context, - const protocol_type& protocol) - : basic_socket(io_context, protocol) - { - } - - /// Construct a basic_raw_socket, opening it and binding it to the given - /// local endpoint. - /** - * This constructor creates a raw socket and automatically opens it bound - * to the specified endpoint on the local machine. The protocol used is the - * protocol associated with the given endpoint. - * - * @param io_context The io_context object that the raw socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param endpoint An endpoint on the local machine to which the raw - * socket will be bound. - * - * @throws asio::system_error Thrown on failure. - */ - basic_raw_socket(asio::io_context& io_context, - const endpoint_type& endpoint) - : basic_socket(io_context, endpoint) - { - } - - /// Construct a basic_raw_socket on an existing native socket. - /** - * This constructor creates a raw socket object to hold an existing - * native socket. - * - * @param io_context The io_context object that the raw socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket The new underlying socket implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_raw_socket(asio::io_context& io_context, - const protocol_type& protocol, const native_handle_type& native_socket) - : basic_socket( - io_context, protocol, native_socket) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_raw_socket from another. - /** - * This constructor moves a raw socket from one object to another. - * - * @param other The other basic_raw_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_raw_socket(io_context&) constructor. - */ - basic_raw_socket(basic_raw_socket&& other) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_raw_socket from another. - /** - * This assignment operator moves a raw socket from one object to another. - * - * @param other The other basic_raw_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_raw_socket(io_context&) constructor. - */ - basic_raw_socket& operator=(basic_raw_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } - - /// Move-construct a basic_raw_socket from a socket of another protocol type. - /** - * This constructor moves a raw socket from one object to another. - * - * @param other The other basic_raw_socket object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_raw_socket(io_context&) constructor. - */ - template - basic_raw_socket(basic_raw_socket&& other, - typename enable_if::value>::type* = 0) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_raw_socket from a socket of another protocol type. - /** - * This assignment operator moves a raw socket from one object to another. - * - * @param other The other basic_raw_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_raw_socket(io_context&) constructor. - */ - template - typename enable_if::value, - basic_raw_socket>::type& operator=( - basic_raw_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the socket. - /** - * This function destroys the socket, cancelling any outstanding asynchronous - * operations associated with the socket as if by calling @c cancel. - */ - ~basic_raw_socket() - { - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the raw socket. The function call - * will block until the data has been sent successfully or an error occurs. - * - * @param buffers One ore more data buffers to be sent on the socket. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected raw socket. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code socket.send(asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "send"); - return s; - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the raw socket. The function call - * will block until the data has been sent successfully or an error occurs. - * - * @param buffers One ore more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected raw socket. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, flags, ec); - asio::detail::throw_error(ec, "send"); - return s; - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the raw socket. The function call - * will block until the data has been sent successfully or an error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes sent. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected raw socket. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return this->get_service().send( - this->get_implementation(), buffers, flags, ec); - } - - /// Start an asynchronous send on a connected socket. - /** - * This function is used to send data on the raw socket. The function call - * will block until the data has been sent successfully or an error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_send operation can only be used with a connected socket. - * Use the async_send_to function to send data on an unconnected raw - * socket. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send(this->get_implementation(), - buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send(this->get_implementation(), - buffers, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous send on a connected socket. - /** - * This function is used to send data on the raw socket. The function call - * will block until the data has been sent successfully or an error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_send operation can only be used with a connected socket. - * Use the async_send_to function to send data on an unconnected raw - * socket. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send(this->get_implementation(), - buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send(this->get_implementation(), - buffers, flags, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Send raw data to the specified endpoint. - /** - * This function is used to send raw data to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * asio::ip::udp::endpoint destination( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.send_to(asio::buffer(data, size), destination); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination) - { - asio::error_code ec; - std::size_t s = this->get_service().send_to( - this->get_implementation(), buffers, destination, 0, ec); - asio::detail::throw_error(ec, "send_to"); - return s; - } - - /// Send raw data to the specified endpoint. - /** - * This function is used to send raw data to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - */ - template - std::size_t send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().send_to( - this->get_implementation(), buffers, destination, flags, ec); - asio::detail::throw_error(ec, "send_to"); - return s; - } - - /// Send raw data to the specified endpoint. - /** - * This function is used to send raw data to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes sent. - */ - template - std::size_t send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - asio::error_code& ec) - { - return this->get_service().send_to(this->get_implementation(), - buffers, destination, flags, ec); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send raw data to the specified - * remote endpoint. The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param destination The remote endpoint to which the data will be sent. - * Copies will be made of the endpoint as required. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * asio::ip::udp::endpoint destination( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.async_send_to( - * asio::buffer(data, size), destination, handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send_to(this->get_implementation(), - buffers, destination, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send_to(this->get_implementation(), - buffers, destination, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send raw data to the specified - * remote endpoint. The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param destination The remote endpoint to which the data will be sent. - * Copies will be made of the endpoint as required. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send_to(const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send_to( - this->get_implementation(), buffers, destination, flags, - ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send_to( - this->get_implementation(), buffers, destination, flags, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the raw socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected raw - * socket. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code socket.receive(asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the raw socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected raw - * socket. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, flags, ec); - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the raw socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes received. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected raw - * socket. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return this->get_service().receive( - this->get_implementation(), buffers, flags, ec); - } - - /// Start an asynchronous receive on a connected socket. - /** - * This function is used to asynchronously receive data from the raw - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_receive operation can only be used with a connected socket. - * Use the async_receive_from function to receive data on an unconnected - * raw socket. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive(this->get_implementation(), - buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive(this->get_implementation(), - buffers, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous receive on a connected socket. - /** - * This function is used to asynchronously receive data from the raw - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The async_receive operation can only be used with a connected socket. - * Use the async_receive_from function to receive data on an unconnected - * raw socket. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive(this->get_implementation(), - buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive(this->get_implementation(), - buffers, flags, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Receive raw data with the endpoint of the sender. - /** - * This function is used to receive raw data. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the data. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * asio::ip::udp::endpoint sender_endpoint; - * socket.receive_from( - * asio::buffer(data, size), sender_endpoint); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint) - { - asio::error_code ec; - std::size_t s = this->get_service().receive_from( - this->get_implementation(), buffers, sender_endpoint, 0, ec); - asio::detail::throw_error(ec, "receive_from"); - return s; - } - - /// Receive raw data with the endpoint of the sender. - /** - * This function is used to receive raw data. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the data. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. - */ - template - std::size_t receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().receive_from( - this->get_implementation(), buffers, sender_endpoint, flags, ec); - asio::detail::throw_error(ec, "receive_from"); - return s; - } - - /// Receive raw data with the endpoint of the sender. - /** - * This function is used to receive raw data. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the data. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes received. - */ - template - std::size_t receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - asio::error_code& ec) - { - return this->get_service().receive_from(this->get_implementation(), - buffers, sender_endpoint, flags, ec); - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive raw data. The function - * call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the data. Ownership of the sender_endpoint object - * is retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code socket.async_receive_from( - * asio::buffer(data, size), 0, sender_endpoint, handler); @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, 0, - ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, 0, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive raw data. The function - * call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the data. Ownership of the sender_endpoint object - * is retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive_from(const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, flags, - ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive_from( - this->get_implementation(), buffers, sender_endpoint, flags, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_RAW_SOCKET_HPP diff --git a/scout_sdk/asio/asio/basic_seq_packet_socket.hpp b/scout_sdk/asio/asio/basic_seq_packet_socket.hpp deleted file mode 100644 index 3655d88..0000000 --- a/scout_sdk/asio/asio/basic_seq_packet_socket.hpp +++ /dev/null @@ -1,618 +0,0 @@ -// -// basic_seq_packet_socket.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SEQ_PACKET_SOCKET_HPP -#define ASIO_BASIC_SEQ_PACKET_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/basic_socket.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/seq_packet_socket_service.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides sequenced packet socket functionality. -/** - * The basic_seq_packet_socket class template provides asynchronous and blocking - * sequenced packet socket functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template )> -class basic_seq_packet_socket - : public basic_socket -{ -public: - /// The native representation of a socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename basic_socket< - Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct a basic_seq_packet_socket without opening it. - /** - * This constructor creates a sequenced packet socket without opening it. The - * socket needs to be opened and then connected or accepted before data can - * be sent or received on it. - * - * @param io_context The io_context object that the sequenced packet socket - * will use to dispatch handlers for any asynchronous operations performed on - * the socket. - */ - explicit basic_seq_packet_socket(asio::io_context& io_context) - : basic_socket(io_context) - { - } - - /// Construct and open a basic_seq_packet_socket. - /** - * This constructor creates and opens a sequenced_packet socket. The socket - * needs to be connected or accepted before data can be sent or received on - * it. - * - * @param io_context The io_context object that the sequenced packet socket - * will use to dispatch handlers for any asynchronous operations performed on - * the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::system_error Thrown on failure. - */ - basic_seq_packet_socket(asio::io_context& io_context, - const protocol_type& protocol) - : basic_socket(io_context, protocol) - { - } - - /// Construct a basic_seq_packet_socket, opening it and binding it to the - /// given local endpoint. - /** - * This constructor creates a sequenced packet socket and automatically opens - * it bound to the specified endpoint on the local machine. The protocol used - * is the protocol associated with the given endpoint. - * - * @param io_context The io_context object that the sequenced packet socket - * will use to dispatch handlers for any asynchronous operations performed on - * the socket. - * - * @param endpoint An endpoint on the local machine to which the sequenced - * packet socket will be bound. - * - * @throws asio::system_error Thrown on failure. - */ - basic_seq_packet_socket(asio::io_context& io_context, - const endpoint_type& endpoint) - : basic_socket(io_context, endpoint) - { - } - - /// Construct a basic_seq_packet_socket on an existing native socket. - /** - * This constructor creates a sequenced packet socket object to hold an - * existing native socket. - * - * @param io_context The io_context object that the sequenced packet socket - * will use to dispatch handlers for any asynchronous operations performed on - * the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket The new underlying socket implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_seq_packet_socket(asio::io_context& io_context, - const protocol_type& protocol, const native_handle_type& native_socket) - : basic_socket( - io_context, protocol, native_socket) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_seq_packet_socket from another. - /** - * This constructor moves a sequenced packet socket from one object to - * another. - * - * @param other The other basic_seq_packet_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_seq_packet_socket(io_context&) constructor. - */ - basic_seq_packet_socket(basic_seq_packet_socket&& other) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_seq_packet_socket from another. - /** - * This assignment operator moves a sequenced packet socket from one object to - * another. - * - * @param other The other basic_seq_packet_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_seq_packet_socket(io_context&) constructor. - */ - basic_seq_packet_socket& operator=(basic_seq_packet_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } - - /// Move-construct a basic_seq_packet_socket from a socket of another protocol - /// type. - /** - * This constructor moves a sequenced packet socket from one object to - * another. - * - * @param other The other basic_seq_packet_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_seq_packet_socket(io_context&) constructor. - */ - template - basic_seq_packet_socket( - basic_seq_packet_socket&& other, - typename enable_if::value>::type* = 0) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_seq_packet_socket from a socket of another protocol - /// type. - /** - * This assignment operator moves a sequenced packet socket from one object to - * another. - * - * @param other The other basic_seq_packet_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_seq_packet_socket(io_context&) constructor. - */ - template - typename enable_if::value, - basic_seq_packet_socket>::type& operator=( - basic_seq_packet_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the socket. - /** - * This function destroys the socket, cancelling any outstanding asynchronous - * operations associated with the socket as if by calling @c cancel. - */ - ~basic_seq_packet_socket() - { - } - - /// Send some data on the socket. - /** - * This function is used to send data on the sequenced packet socket. The - * function call will block until the data has been sent successfully, or an - * until error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.send(asio::buffer(data, size), 0); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, flags, ec); - asio::detail::throw_error(ec, "send"); - return s; - } - - /// Send some data on the socket. - /** - * This function is used to send data on the sequenced packet socket. The - * function call will block the data has been sent successfully, or an until - * error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes sent. Returns 0 if an error occurred. - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref write function if you need to ensure that all data - * is written before the blocking operation completes. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return this->get_service().send( - this->get_implementation(), buffers, flags, ec); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send data on the sequenced packet - * socket. The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), 0, handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send(this->get_implementation(), - buffers, flags, ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send(this->get_implementation(), - buffers, flags, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Receive some data on the socket. - /** - * This function is used to receive data on the sequenced packet socket. The - * function call will block until data has been received successfully, or - * until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param out_flags After the receive call completes, contains flags - * associated with the received data. For example, if the - * socket_base::message_end_of_record bit is set then the received data marks - * the end of a record. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.receive(asio::buffer(data, size), out_flags); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags& out_flags) - { - asio::error_code ec; -#if defined(ASIO_ENABLE_OLD_SERVICES) - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, 0, out_flags, ec); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - std::size_t s = this->get_service().receive_with_flags( - this->get_implementation(), buffers, 0, out_flags, ec); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on the socket. - /** - * This function is used to receive data on the sequenced packet socket. The - * function call will block until data has been received successfully, or - * until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param in_flags Flags specifying how the receive call is to be made. - * - * @param out_flags After the receive call completes, contains flags - * associated with the received data. For example, if the - * socket_base::message_end_of_record bit is set then the received data marks - * the end of a record. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.receive(asio::buffer(data, size), 0, out_flags); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags in_flags, - socket_base::message_flags& out_flags) - { - asio::error_code ec; -#if defined(ASIO_ENABLE_OLD_SERVICES) - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, in_flags, out_flags, ec); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - std::size_t s = this->get_service().receive_with_flags( - this->get_implementation(), buffers, in_flags, out_flags, ec); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the sequenced packet socket. The - * function call will block until data has been received successfully, or - * until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param in_flags Flags specifying how the receive call is to be made. - * - * @param out_flags After the receive call completes, contains flags - * associated with the received data. For example, if the - * socket_base::message_end_of_record bit is set then the received data marks - * the end of a record. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes received. Returns 0 if an error occurred. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, asio::error_code& ec) - { -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().receive(this->get_implementation(), - buffers, in_flags, out_flags, ec); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().receive_with_flags(this->get_implementation(), - buffers, in_flags, out_flags, ec); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive data from the sequenced - * packet socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param out_flags Once the asynchronous operation completes, contains flags - * associated with the received data. For example, if the - * socket_base::message_end_of_record bit is set then the received data marks - * the end of a record. The caller must guarantee that the referenced - * variable remains valid until the handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), out_flags, handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - socket_base::message_flags& out_flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive( - this->get_implementation(), buffers, 0, out_flags, - ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive_with_flags( - this->get_implementation(), buffers, 0, out_flags, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive data from the sequenced - * data socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param in_flags Flags specifying how the receive call is to be made. - * - * @param out_flags Once the asynchronous operation completes, contains flags - * associated with the received data. For example, if the - * socket_base::message_end_of_record bit is set then the received data marks - * the end of a record. The caller must guarantee that the referenced - * variable remains valid until the handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive( - * asio::buffer(data, size), - * 0, out_flags, handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive( - this->get_implementation(), buffers, in_flags, out_flags, - ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive_with_flags( - this->get_implementation(), buffers, in_flags, out_flags, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_SEQ_PACKET_SOCKET_HPP diff --git a/scout_sdk/asio/asio/basic_serial_port.hpp b/scout_sdk/asio/asio/basic_serial_port.hpp deleted file mode 100644 index 32262f8..0000000 --- a/scout_sdk/asio/asio/basic_serial_port.hpp +++ /dev/null @@ -1,688 +0,0 @@ -// -// basic_serial_port.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SERIAL_PORT_HPP -#define ASIO_BASIC_SERIAL_PORT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_SERIAL_PORT) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/serial_port_base.hpp" -#include "asio/serial_port_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides serial port functionality. -/** - * The basic_serial_port class template provides functionality that is common - * to all serial ports. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_serial_port - : public basic_io_object, - public serial_port_base -{ -public: - /// The native representation of a serial port. - typedef typename SerialPortService::native_handle_type native_handle_type; - - /// A basic_serial_port is always the lowest layer. - typedef basic_serial_port lowest_layer_type; - - /// Construct a basic_serial_port without opening it. - /** - * This constructor creates a serial port without opening it. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - */ - explicit basic_serial_port(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct and open a basic_serial_port. - /** - * This constructor creates and opens a serial port for the specified device - * name. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - * - * @param device The platform-specific device name for this serial - * port. - */ - explicit basic_serial_port(asio::io_context& io_context, - const char* device) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), device, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Construct and open a basic_serial_port. - /** - * This constructor creates and opens a serial port for the specified device - * name. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - * - * @param device The platform-specific device name for this serial - * port. - */ - explicit basic_serial_port(asio::io_context& io_context, - const std::string& device) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), device, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Construct a basic_serial_port on an existing native serial port. - /** - * This constructor creates a serial port object to hold an existing native - * serial port. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - * - * @param native_serial_port A native serial port. - * - * @throws asio::system_error Thrown on failure. - */ - basic_serial_port(asio::io_context& io_context, - const native_handle_type& native_serial_port) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_serial_port, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_serial_port from another. - /** - * This constructor moves a serial port from one object to another. - * - * @param other The other basic_serial_port object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_serial_port(io_context&) constructor. - */ - basic_serial_port(basic_serial_port&& other) - : basic_io_object( - ASIO_MOVE_CAST(basic_serial_port)(other)) - { - } - - /// Move-assign a basic_serial_port from another. - /** - * This assignment operator moves a serial port from one object to another. - * - * @param other The other basic_serial_port object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_serial_port(io_context&) constructor. - */ - basic_serial_port& operator=(basic_serial_port&& other) - { - basic_io_object::operator=( - ASIO_MOVE_CAST(basic_serial_port)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since a basic_serial_port cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since a basic_serial_port cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } - - /// Open the serial port using the specified device name. - /** - * This function opens the serial port for the specified device name. - * - * @param device The platform-specific device name. - * - * @throws asio::system_error Thrown on failure. - */ - void open(const std::string& device) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), device, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Open the serial port using the specified device name. - /** - * This function opens the serial port using the given platform-specific - * device name. - * - * @param device The platform-specific device name. - * - * @param ec Set the indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID open(const std::string& device, - asio::error_code& ec) - { - this->get_service().open(this->get_implementation(), device, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native serial port to the serial port. - /* - * This function opens the serial port to hold an existing native serial port. - * - * @param native_serial_port A native serial port. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const native_handle_type& native_serial_port) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_serial_port, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native serial port to the serial port. - /* - * This function opens the serial port to hold an existing native serial port. - * - * @param native_serial_port A native serial port. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const native_handle_type& native_serial_port, - asio::error_code& ec) - { - this->get_service().assign(this->get_implementation(), - native_serial_port, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the serial port is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the serial port. - /** - * This function is used to close the serial port. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the serial port. - /** - * This function is used to close the serial port. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native serial port representation. - /** - * This function may be used to obtain the underlying representation of the - * serial port. This is intended to allow access to native serial port - * functionality that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the serial port. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the serial port. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Send a break sequence to the serial port. - /** - * This function causes a break sequence of platform-specific duration to be - * sent out the serial port. - * - * @throws asio::system_error Thrown on failure. - */ - void send_break() - { - asio::error_code ec; - this->get_service().send_break(this->get_implementation(), ec); - asio::detail::throw_error(ec, "send_break"); - } - - /// Send a break sequence to the serial port. - /** - * This function causes a break sequence of platform-specific duration to be - * sent out the serial port. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID send_break(asio::error_code& ec) - { - this->get_service().send_break(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Set an option on the serial port. - /** - * This function is used to set an option on the serial port. - * - * @param option The option value to be set on the serial port. - * - * @throws asio::system_error Thrown on failure. - * - * @sa SettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - void set_option(const SettableSerialPortOption& option) - { - asio::error_code ec; - this->get_service().set_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "set_option"); - } - - /// Set an option on the serial port. - /** - * This function is used to set an option on the serial port. - * - * @param option The option value to be set on the serial port. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa SettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - ASIO_SYNC_OP_VOID set_option(const SettableSerialPortOption& option, - asio::error_code& ec) - { - this->get_service().set_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get an option from the serial port. - /** - * This function is used to get the current value of an option on the serial - * port. - * - * @param option The option value to be obtained from the serial port. - * - * @throws asio::system_error Thrown on failure. - * - * @sa GettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - void get_option(GettableSerialPortOption& option) - { - asio::error_code ec; - this->get_service().get_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "get_option"); - } - - /// Get an option from the serial port. - /** - * This function is used to get the current value of an option on the serial - * port. - * - * @param option The option value to be obtained from the serial port. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa GettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - ASIO_SYNC_OP_VOID get_option(GettableSerialPortOption& option, - asio::error_code& ec) - { - this->get_service().get_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Write some data to the serial port. - /** - * This function is used to write data to the serial port. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the serial port. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "write_some"); - return s; - } - - /// Write some data to the serial port. - /** - * This function is used to write data to the serial port. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the serial port. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().write_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the serial port. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the serial port. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - return this->get_service().async_write_some(this->get_implementation(), - buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); - } - - /// Read some data from the serial port. - /** - * This function is used to read data from the serial port. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "read_some"); - return s; - } - - /// Read some data from the serial port. - /** - * This function is used to read data from the serial port. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().read_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the serial port. - * The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - return this->get_service().async_read_some(this->get_implementation(), - buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_SERIAL_PORT) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_BASIC_SERIAL_PORT_HPP diff --git a/scout_sdk/asio/asio/basic_signal_set.hpp b/scout_sdk/asio/asio/basic_signal_set.hpp deleted file mode 100644 index cf34643..0000000 --- a/scout_sdk/asio/asio/basic_signal_set.hpp +++ /dev/null @@ -1,391 +0,0 @@ -// -// basic_signal_set.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SIGNAL_SET_HPP -#define ASIO_BASIC_SIGNAL_SET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/signal_set_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides signal functionality. -/** - * The basic_signal_set class template provides the ability to perform an - * asynchronous wait for one or more signals to occur. - * - * Most applications will use the asio::signal_set typedef. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Example - * Performing an asynchronous wait: - * @code - * void handler( - * const asio::error_code& error, - * int signal_number) - * { - * if (!error) - * { - * // A signal occurred. - * } - * } - * - * ... - * - * // Construct a signal set registered for process termination. - * asio::signal_set signals(io_context, SIGINT, SIGTERM); - * - * // Start an asynchronous wait for one of the signals to occur. - * signals.async_wait(handler); - * @endcode - * - * @par Queueing of signal notifications - * - * If a signal is registered with a signal_set, and the signal occurs when - * there are no waiting handlers, then the signal notification is queued. The - * next async_wait operation on that signal_set will dequeue the notification. - * If multiple notifications are queued, subsequent async_wait operations - * dequeue them one at a time. Signal notifications are dequeued in order of - * ascending signal number. - * - * If a signal number is removed from a signal_set (using the @c remove or @c - * erase member functions) then any queued notifications for that signal are - * discarded. - * - * @par Multiple registration of signals - * - * The same signal number may be registered with different signal_set objects. - * When the signal occurs, one handler is called for each signal_set object. - * - * Note that multiple registration only works for signals that are registered - * using Asio. The application must not also register a signal handler using - * functions such as @c signal() or @c sigaction(). - * - * @par Signal masking on POSIX platforms - * - * POSIX allows signals to be blocked using functions such as @c sigprocmask() - * and @c pthread_sigmask(). For signals to be delivered, programs must ensure - * that any signals registered using signal_set objects are unblocked in at - * least one thread. - */ -template -class basic_signal_set - : public basic_io_object -{ -public: - /// Construct a signal set without adding any signals. - /** - * This constructor creates a signal set without registering for any signals. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - */ - explicit basic_signal_set(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct a signal set and add one signal. - /** - * This constructor creates a signal set and registers for one signal. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - * - * @param signal_number_1 The signal number to be added. - * - * @note This constructor is equivalent to performing: - * @code asio::signal_set signals(io_context); - * signals.add(signal_number_1); @endcode - */ - basic_signal_set(asio::io_context& io_context, int signal_number_1) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number_1, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Construct a signal set and add two signals. - /** - * This constructor creates a signal set and registers for two signals. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - * - * @param signal_number_1 The first signal number to be added. - * - * @param signal_number_2 The second signal number to be added. - * - * @note This constructor is equivalent to performing: - * @code asio::signal_set signals(io_context); - * signals.add(signal_number_1); - * signals.add(signal_number_2); @endcode - */ - basic_signal_set(asio::io_context& io_context, int signal_number_1, - int signal_number_2) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number_1, ec); - asio::detail::throw_error(ec, "add"); - this->get_service().add(this->get_implementation(), signal_number_2, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Construct a signal set and add three signals. - /** - * This constructor creates a signal set and registers for three signals. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - * - * @param signal_number_1 The first signal number to be added. - * - * @param signal_number_2 The second signal number to be added. - * - * @param signal_number_3 The third signal number to be added. - * - * @note This constructor is equivalent to performing: - * @code asio::signal_set signals(io_context); - * signals.add(signal_number_1); - * signals.add(signal_number_2); - * signals.add(signal_number_3); @endcode - */ - basic_signal_set(asio::io_context& io_context, int signal_number_1, - int signal_number_2, int signal_number_3) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number_1, ec); - asio::detail::throw_error(ec, "add"); - this->get_service().add(this->get_implementation(), signal_number_2, ec); - asio::detail::throw_error(ec, "add"); - this->get_service().add(this->get_implementation(), signal_number_3, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Add a signal to a signal_set. - /** - * This function adds the specified signal to the set. It has no effect if the - * signal is already in the set. - * - * @param signal_number The signal to be added to the set. - * - * @throws asio::system_error Thrown on failure. - */ - void add(int signal_number) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Add a signal to a signal_set. - /** - * This function adds the specified signal to the set. It has no effect if the - * signal is already in the set. - * - * @param signal_number The signal to be added to the set. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID add(int signal_number, asio::error_code& ec) - { - this->get_service().add(this->get_implementation(), signal_number, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Remove a signal from a signal_set. - /** - * This function removes the specified signal from the set. It has no effect - * if the signal is not in the set. - * - * @param signal_number The signal to be removed from the set. - * - * @throws asio::system_error Thrown on failure. - * - * @note Removes any notifications that have been queued for the specified - * signal number. - */ - void remove(int signal_number) - { - asio::error_code ec; - this->get_service().remove(this->get_implementation(), signal_number, ec); - asio::detail::throw_error(ec, "remove"); - } - - /// Remove a signal from a signal_set. - /** - * This function removes the specified signal from the set. It has no effect - * if the signal is not in the set. - * - * @param signal_number The signal to be removed from the set. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Removes any notifications that have been queued for the specified - * signal number. - */ - ASIO_SYNC_OP_VOID remove(int signal_number, - asio::error_code& ec) - { - this->get_service().remove(this->get_implementation(), signal_number, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Remove all signals from a signal_set. - /** - * This function removes all signals from the set. It has no effect if the set - * is already empty. - * - * @throws asio::system_error Thrown on failure. - * - * @note Removes all queued notifications. - */ - void clear() - { - asio::error_code ec; - this->get_service().clear(this->get_implementation(), ec); - asio::detail::throw_error(ec, "clear"); - } - - /// Remove all signals from a signal_set. - /** - * This function removes all signals from the set. It has no effect if the set - * is already empty. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Removes all queued notifications. - */ - ASIO_SYNC_OP_VOID clear(asio::error_code& ec) - { - this->get_service().clear(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Cancel all operations associated with the signal set. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the signal set. The handler for each cancelled - * operation will be invoked with the asio::error::operation_aborted - * error code. - * - * Cancellation does not alter the set of registered signals. - * - * @throws asio::system_error Thrown on failure. - * - * @note If a registered signal occurred before cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all operations associated with the signal set. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the signal set. The handler for each cancelled - * operation will be invoked with the asio::error::operation_aborted - * error code. - * - * Cancellation does not alter the set of registered signals. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note If a registered signal occurred before cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous operation to wait for a signal to be delivered. - /** - * This function may be used to initiate an asynchronous wait against the - * signal set. It always returns immediately. - * - * For each call to async_wait(), the supplied handler will be called exactly - * once. The handler will be called when: - * - * @li One of the registered signals in the signal set occurs; or - * - * @li The signal set was cancelled, in which case the handler is passed the - * error code asio::error::operation_aborted. - * - * @param handler The handler to be called when the signal occurs. Copies - * will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * int signal_number // Indicates which signal occurred. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(SignalHandler, - void (asio::error_code, int)) - async_wait(ASIO_MOVE_ARG(SignalHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a SignalHandler. - ASIO_SIGNAL_HANDLER_CHECK(SignalHandler, handler) type_check; - - return this->get_service().async_wait(this->get_implementation(), - ASIO_MOVE_CAST(SignalHandler)(handler)); - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_BASIC_SIGNAL_SET_HPP diff --git a/scout_sdk/asio/asio/basic_socket.hpp b/scout_sdk/asio/asio/basic_socket.hpp deleted file mode 100644 index 3dfacb4..0000000 --- a/scout_sdk/asio/asio/basic_socket.hpp +++ /dev/null @@ -1,1757 +0,0 @@ -// -// basic_socket.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_HPP -#define ASIO_BASIC_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/async_result.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/post.hpp" -#include "asio/socket_base.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/winrt_ssocket_service.hpp" -# define ASIO_SVC_T detail::winrt_ssocket_service -# elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_socket_service.hpp" -# define ASIO_SVC_T detail::win_iocp_socket_service -# else -# include "asio/detail/reactive_socket_service.hpp" -# define ASIO_SVC_T detail::reactive_socket_service -# endif -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides socket functionality. -/** - * The basic_socket class template provides functionality that is common to both - * stream-oriented and datagram-oriented sockets. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_socket - : ASIO_SVC_ACCESS basic_io_object, - public socket_base -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The native representation of a socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename ASIO_SVC_T::native_handle_type native_handle_type; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - -#if !defined(ASIO_NO_EXTENSIONS) - /// A basic_socket is always the lowest layer. - typedef basic_socket lowest_layer_type; -#endif // !defined(ASIO_NO_EXTENSIONS) - - /// Construct a basic_socket without opening it. - /** - * This constructor creates a socket without opening it. - * - * @param io_context The io_context object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - */ - explicit basic_socket(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct and open a basic_socket. - /** - * This constructor creates and opens a socket. - * - * @param io_context The io_context object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::system_error Thrown on failure. - */ - basic_socket(asio::io_context& io_context, - const protocol_type& protocol) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), protocol, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Construct a basic_socket, opening it and binding it to the given local - /// endpoint. - /** - * This constructor creates a socket and automatically opens it bound to the - * specified endpoint on the local machine. The protocol used is the protocol - * associated with the given endpoint. - * - * @param io_context The io_context object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param endpoint An endpoint on the local machine to which the socket will - * be bound. - * - * @throws asio::system_error Thrown on failure. - */ - basic_socket(asio::io_context& io_context, - const endpoint_type& endpoint) - : basic_io_object(io_context) - { - asio::error_code ec; - const protocol_type protocol = endpoint.protocol(); - this->get_service().open(this->get_implementation(), protocol, ec); - asio::detail::throw_error(ec, "open"); - this->get_service().bind(this->get_implementation(), endpoint, ec); - asio::detail::throw_error(ec, "bind"); - } - - /// Construct a basic_socket on an existing native socket. - /** - * This constructor creates a socket object to hold an existing native socket. - * - * @param io_context The io_context object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket A native socket. - * - * @throws asio::system_error Thrown on failure. - */ - basic_socket(asio::io_context& io_context, - const protocol_type& protocol, const native_handle_type& native_socket) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - protocol, native_socket, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_socket from another. - /** - * This constructor moves a socket from one object to another. - * - * @param other The other basic_socket object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket(io_context&) constructor. - */ - basic_socket(basic_socket&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign a basic_socket from another. - /** - * This assignment operator moves a socket from one object to another. - * - * @param other The other basic_socket object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket(io_context&) constructor. - */ - basic_socket& operator=(basic_socket&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } - - // All sockets have access to each other's implementations. - template - friend class basic_socket; - - /// Move-construct a basic_socket from a socket of another protocol type. - /** - * This constructor moves a socket from one object to another. - * - * @param other The other basic_socket object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket(io_context&) constructor. - */ - template - basic_socket(basic_socket&& other, - typename enable_if::value>::type* = 0) - : basic_io_object( - other.get_service(), other.get_implementation()) - { - } - - /// Move-assign a basic_socket from a socket of another protocol type. - /** - * This assignment operator moves a socket from one object to another. - * - * @param other The other basic_socket object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket(io_context&) constructor. - */ - template - typename enable_if::value, - basic_socket>::type& operator=( - basic_socket&& other) - { - basic_socket tmp(std::move(other)); - basic_io_object::operator=(std::move(tmp)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - -#if defined(ASIO_ENABLE_OLD_SERVICES) - // These functions are provided by basic_io_object<>. -#else // defined(ASIO_ENABLE_OLD_SERVICES) -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#if !defined(ASIO_NO_EXTENSIONS) - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since a basic_socket cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since a basic_socket cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } -#endif // !defined(ASIO_NO_EXTENSIONS) - - /// Open the socket using the specified protocol. - /** - * This function opens the socket so that it will use the specified protocol. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * socket.open(asio::ip::tcp::v4()); - * @endcode - */ - void open(const protocol_type& protocol = protocol_type()) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), protocol, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Open the socket using the specified protocol. - /** - * This function opens the socket so that it will use the specified protocol. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * asio::error_code ec; - * socket.open(asio::ip::tcp::v4(), ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID open(const protocol_type& protocol, - asio::error_code& ec) - { - this->get_service().open(this->get_implementation(), protocol, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native socket to the socket. - /* - * This function opens the socket to hold an existing native socket. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_socket A native socket. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const protocol_type& protocol, - const native_handle_type& native_socket) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - protocol, native_socket, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native socket to the socket. - /* - * This function opens the socket to hold an existing native socket. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_socket A native socket. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const protocol_type& protocol, - const native_handle_type& native_socket, asio::error_code& ec) - { - this->get_service().assign(this->get_implementation(), - protocol, native_socket, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the socket. - /** - * This function is used to close the socket. Any asynchronous send, receive - * or connect operations will be cancelled immediately, and will complete - * with the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. Note that, even if - * the function indicates an error, the underlying descriptor is closed. - * - * @note For portable behaviour with respect to graceful closure of a - * connected socket, call shutdown() before closing the socket. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the socket. - /** - * This function is used to close the socket. Any asynchronous send, receive - * or connect operations will be cancelled immediately, and will complete - * with the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. Note that, even if - * the function indicates an error, the underlying descriptor is closed. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::error_code ec; - * socket.close(ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - * - * @note For portable behaviour with respect to graceful closure of a - * connected socket, call shutdown() before closing the socket. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Release ownership of the underlying native socket. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. Ownership - * of the native socket is then transferred to the caller. - * - * @throws asio::system_error Thrown on failure. - * - * @note This function is unsupported on Windows versions prior to Windows - * 8.1, and will fail with asio::error::operation_not_supported on - * these platforms. - */ -#if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ - && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) - __declspec(deprecated("This function always fails with " - "operation_not_supported when used on Windows versions " - "prior to Windows 8.1.")) -#endif - native_handle_type release() - { - asio::error_code ec; - native_handle_type s = this->get_service().release( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "release"); - return s; - } - - /// Release ownership of the underlying native socket. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. Ownership - * of the native socket is then transferred to the caller. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note This function is unsupported on Windows versions prior to Windows - * 8.1, and will fail with asio::error::operation_not_supported on - * these platforms. - */ -#if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ - && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) - __declspec(deprecated("This function always fails with " - "operation_not_supported when used on Windows versions " - "prior to Windows 8.1.")) -#endif - native_handle_type release(asio::error_code& ec) - { - return this->get_service().release(this->get_implementation(), ec); - } - - /// Get the native socket representation. - /** - * This function may be used to obtain the underlying representation of the - * socket. This is intended to allow access to native socket functionality - * that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the socket. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls to cancel() will always fail with - * asio::error::operation_not_supported when run on Windows XP, Windows - * Server 2003, and earlier versions of Windows, unless - * ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has - * two issues that should be considered before enabling its use: - * - * @li It will only cancel asynchronous operations that were initiated in the - * current thread. - * - * @li It can appear to complete without error, but the request to cancel the - * unfinished operations may be silently ignored by the operating system. - * Whether it works or not seems to depend on the drivers that are installed. - * - * For portable cancellation, consider using one of the following - * alternatives: - * - * @li Disable asio's I/O completion port backend by defining - * ASIO_DISABLE_IOCP. - * - * @li Use the close() function to simultaneously cancel the outstanding - * operations and close the socket. - * - * When running on Windows Vista, Windows Server 2008, and later, the - * CancelIoEx function is always used. This function does not have the - * problems described above. - */ -#if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ - && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600) \ - && !defined(ASIO_ENABLE_CANCELIO) - __declspec(deprecated("By default, this function always fails with " - "operation_not_supported when used on Windows XP, Windows Server 2003, " - "or earlier. Consult documentation for details.")) -#endif - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the socket. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls to cancel() will always fail with - * asio::error::operation_not_supported when run on Windows XP, Windows - * Server 2003, and earlier versions of Windows, unless - * ASIO_ENABLE_CANCELIO is defined. However, the CancelIo function has - * two issues that should be considered before enabling its use: - * - * @li It will only cancel asynchronous operations that were initiated in the - * current thread. - * - * @li It can appear to complete without error, but the request to cancel the - * unfinished operations may be silently ignored by the operating system. - * Whether it works or not seems to depend on the drivers that are installed. - * - * For portable cancellation, consider using one of the following - * alternatives: - * - * @li Disable asio's I/O completion port backend by defining - * ASIO_DISABLE_IOCP. - * - * @li Use the close() function to simultaneously cancel the outstanding - * operations and close the socket. - * - * When running on Windows Vista, Windows Server 2008, and later, the - * CancelIoEx function is always used. This function does not have the - * problems described above. - */ -#if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ - && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0600) \ - && !defined(ASIO_ENABLE_CANCELIO) - __declspec(deprecated("By default, this function always fails with " - "operation_not_supported when used on Windows XP, Windows Server 2003, " - "or earlier. Consult documentation for details.")) -#endif - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is at the out-of-band data mark. - /** - * This function is used to check whether the socket input is currently - * positioned at the out-of-band data mark. - * - * @return A bool indicating whether the socket is at the out-of-band data - * mark. - * - * @throws asio::system_error Thrown on failure. - */ - bool at_mark() const - { - asio::error_code ec; - bool b = this->get_service().at_mark(this->get_implementation(), ec); - asio::detail::throw_error(ec, "at_mark"); - return b; - } - - /// Determine whether the socket is at the out-of-band data mark. - /** - * This function is used to check whether the socket input is currently - * positioned at the out-of-band data mark. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return A bool indicating whether the socket is at the out-of-band data - * mark. - */ - bool at_mark(asio::error_code& ec) const - { - return this->get_service().at_mark(this->get_implementation(), ec); - } - - /// Determine the number of bytes available for reading. - /** - * This function is used to determine the number of bytes that may be read - * without blocking. - * - * @return The number of bytes that may be read without blocking, or 0 if an - * error occurs. - * - * @throws asio::system_error Thrown on failure. - */ - std::size_t available() const - { - asio::error_code ec; - std::size_t s = this->get_service().available( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "available"); - return s; - } - - /// Determine the number of bytes available for reading. - /** - * This function is used to determine the number of bytes that may be read - * without blocking. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of bytes that may be read without blocking, or 0 if an - * error occurs. - */ - std::size_t available(asio::error_code& ec) const - { - return this->get_service().available(this->get_implementation(), ec); - } - - /// Bind the socket to the given local endpoint. - /** - * This function binds the socket to the specified endpoint on the local - * machine. - * - * @param endpoint An endpoint on the local machine to which the socket will - * be bound. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * socket.open(asio::ip::tcp::v4()); - * socket.bind(asio::ip::tcp::endpoint( - * asio::ip::tcp::v4(), 12345)); - * @endcode - */ - void bind(const endpoint_type& endpoint) - { - asio::error_code ec; - this->get_service().bind(this->get_implementation(), endpoint, ec); - asio::detail::throw_error(ec, "bind"); - } - - /// Bind the socket to the given local endpoint. - /** - * This function binds the socket to the specified endpoint on the local - * machine. - * - * @param endpoint An endpoint on the local machine to which the socket will - * be bound. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * socket.open(asio::ip::tcp::v4()); - * asio::error_code ec; - * socket.bind(asio::ip::tcp::endpoint( - * asio::ip::tcp::v4(), 12345), ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID bind(const endpoint_type& endpoint, - asio::error_code& ec) - { - this->get_service().bind(this->get_implementation(), endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Connect the socket to the specified endpoint. - /** - * This function is used to connect a socket to the specified remote endpoint. - * The function call will block until the connection is successfully made or - * an error occurs. - * - * The socket is automatically opened if it is not already open. If the - * connect fails, and the socket was automatically opened, the socket is - * not returned to the closed state. - * - * @param peer_endpoint The remote endpoint to which the socket will be - * connected. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * asio::ip::tcp::endpoint endpoint( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.connect(endpoint); - * @endcode - */ - void connect(const endpoint_type& peer_endpoint) - { - asio::error_code ec; - if (!is_open()) - { - this->get_service().open(this->get_implementation(), - peer_endpoint.protocol(), ec); - asio::detail::throw_error(ec, "connect"); - } - this->get_service().connect(this->get_implementation(), peer_endpoint, ec); - asio::detail::throw_error(ec, "connect"); - } - - /// Connect the socket to the specified endpoint. - /** - * This function is used to connect a socket to the specified remote endpoint. - * The function call will block until the connection is successfully made or - * an error occurs. - * - * The socket is automatically opened if it is not already open. If the - * connect fails, and the socket was automatically opened, the socket is - * not returned to the closed state. - * - * @param peer_endpoint The remote endpoint to which the socket will be - * connected. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * asio::ip::tcp::endpoint endpoint( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * asio::error_code ec; - * socket.connect(endpoint, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID connect(const endpoint_type& peer_endpoint, - asio::error_code& ec) - { - if (!is_open()) - { - this->get_service().open(this->get_implementation(), - peer_endpoint.protocol(), ec); - if (ec) - { - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - this->get_service().connect(this->get_implementation(), peer_endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous connect. - /** - * This function is used to asynchronously connect a socket to the specified - * remote endpoint. The function call always returns immediately. - * - * The socket is automatically opened if it is not already open. If the - * connect fails, and the socket was automatically opened, the socket is - * not returned to the closed state. - * - * @param peer_endpoint The remote endpoint to which the socket will be - * connected. Copies will be made of the endpoint object as required. - * - * @param handler The handler to be called when the connection operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void connect_handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Connect succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::socket socket(io_context); - * asio::ip::tcp::endpoint endpoint( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.async_connect(endpoint, connect_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(ConnectHandler, - void (asio::error_code)) - async_connect(const endpoint_type& peer_endpoint, - ASIO_MOVE_ARG(ConnectHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ConnectHandler. - ASIO_CONNECT_HANDLER_CHECK(ConnectHandler, handler) type_check; - - if (!is_open()) - { - asio::error_code ec; - const protocol_type protocol = peer_endpoint.protocol(); - this->get_service().open(this->get_implementation(), protocol, ec); - if (ec) - { - async_completion init(handler); - - asio::post(this->get_executor(), - asio::detail::bind_handler( - ASIO_MOVE_CAST(ASIO_HANDLER_TYPE( - ConnectHandler, void (asio::error_code)))( - init.completion_handler), ec)); - - return init.result.get(); - } - } - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_connect(this->get_implementation(), - peer_endpoint, ASIO_MOVE_CAST(ConnectHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_connect( - this->get_implementation(), peer_endpoint, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Set an option on the socket. - /** - * This function is used to set an option on the socket. - * - * @param option The new option value to be set on the socket. - * - * @throws asio::system_error Thrown on failure. - * - * @sa SettableSocketOption @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example - * Setting the IPPROTO_TCP/TCP_NODELAY option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::no_delay option(true); - * socket.set_option(option); - * @endcode - */ - template - void set_option(const SettableSocketOption& option) - { - asio::error_code ec; - this->get_service().set_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "set_option"); - } - - /// Set an option on the socket. - /** - * This function is used to set an option on the socket. - * - * @param option The new option value to be set on the socket. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa SettableSocketOption @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example - * Setting the IPPROTO_TCP/TCP_NODELAY option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::no_delay option(true); - * asio::error_code ec; - * socket.set_option(option, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - template - ASIO_SYNC_OP_VOID set_option(const SettableSocketOption& option, - asio::error_code& ec) - { - this->get_service().set_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get an option from the socket. - /** - * This function is used to get the current value of an option on the socket. - * - * @param option The option value to be obtained from the socket. - * - * @throws asio::system_error Thrown on failure. - * - * @sa GettableSocketOption @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example - * Getting the value of the SOL_SOCKET/SO_KEEPALIVE option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::socket::keep_alive option; - * socket.get_option(option); - * bool is_set = option.value(); - * @endcode - */ - template - void get_option(GettableSocketOption& option) const - { - asio::error_code ec; - this->get_service().get_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "get_option"); - } - - /// Get an option from the socket. - /** - * This function is used to get the current value of an option on the socket. - * - * @param option The option value to be obtained from the socket. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa GettableSocketOption @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example - * Getting the value of the SOL_SOCKET/SO_KEEPALIVE option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::socket::keep_alive option; - * asio::error_code ec; - * socket.get_option(option, ec); - * if (ec) - * { - * // An error occurred. - * } - * bool is_set = option.value(); - * @endcode - */ - template - ASIO_SYNC_OP_VOID get_option(GettableSocketOption& option, - asio::error_code& ec) const - { - this->get_service().get_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the socket. - /** - * This function is used to execute an IO control command on the socket. - * - * @param command The IO control command to be performed on the socket. - * - * @throws asio::system_error Thrown on failure. - * - * @sa IoControlCommand @n - * asio::socket_base::bytes_readable @n - * asio::socket_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::socket::bytes_readable command; - * socket.io_control(command); - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - void io_control(IoControlCommand& command) - { - asio::error_code ec; - this->get_service().io_control(this->get_implementation(), command, ec); - asio::detail::throw_error(ec, "io_control"); - } - - /// Perform an IO control command on the socket. - /** - * This function is used to execute an IO control command on the socket. - * - * @param command The IO control command to be performed on the socket. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa IoControlCommand @n - * asio::socket_base::bytes_readable @n - * asio::socket_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::socket::bytes_readable command; - * asio::error_code ec; - * socket.io_control(command, ec); - * if (ec) - * { - * // An error occurred. - * } - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, - asio::error_code& ec) - { - this->get_service().io_control(this->get_implementation(), command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the socket. - /** - * @returns @c true if the socket's synchronous operations will fail with - * asio::error::would_block if they are unable to perform the requested - * operation immediately. If @c false, synchronous operations will block - * until complete. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - bool non_blocking() const - { - return this->get_service().non_blocking(this->get_implementation()); - } - - /// Sets the non-blocking mode of the socket. - /** - * @param mode If @c true, the socket's synchronous operations will fail with - * asio::error::would_block if they are unable to perform the requested - * operation immediately. If @c false, synchronous operations will block - * until complete. - * - * @throws asio::system_error Thrown on failure. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - void non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().non_blocking(this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "non_blocking"); - } - - /// Sets the non-blocking mode of the socket. - /** - * @param mode If @c true, the socket's synchronous operations will fail with - * asio::error::would_block if they are unable to perform the requested - * operation immediately. If @c false, synchronous operations will block - * until complete. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - ASIO_SYNC_OP_VOID non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().non_blocking(this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native socket implementation. - /** - * This function is used to retrieve the non-blocking mode of the underlying - * native socket. This mode has no effect on the behaviour of the socket - * object's synchronous operations. - * - * @returns @c true if the underlying socket is in non-blocking mode and - * direct system calls may fail with asio::error::would_block (or the - * equivalent system error). - * - * @note The current non-blocking mode is cached by the socket object. - * Consequently, the return value may be incorrect if the non-blocking mode - * was set directly on the native socket. - * - * @par Example - * This function is intended to allow the encapsulation of arbitrary - * non-blocking system calls as asynchronous operations, in a way that is - * transparent to the user of the socket object. The following example - * illustrates how Linux's @c sendfile system call might be encapsulated: - * @code template - * struct sendfile_op - * { - * tcp::socket& sock_; - * int fd_; - * Handler handler_; - * off_t offset_; - * std::size_t total_bytes_transferred_; - * - * // Function call operator meeting WriteHandler requirements. - * // Used as the handler for the async_write_some operation. - * void operator()(asio::error_code ec, std::size_t) - * { - * // Put the underlying socket into non-blocking mode. - * if (!ec) - * if (!sock_.native_non_blocking()) - * sock_.native_non_blocking(true, ec); - * - * if (!ec) - * { - * for (;;) - * { - * // Try the system call. - * errno = 0; - * int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536); - * ec = asio::error_code(n < 0 ? errno : 0, - * asio::error::get_system_category()); - * total_bytes_transferred_ += ec ? 0 : n; - * - * // Retry operation immediately if interrupted by signal. - * if (ec == asio::error::interrupted) - * continue; - * - * // Check if we need to run the operation again. - * if (ec == asio::error::would_block - * || ec == asio::error::try_again) - * { - * // We have to wait for the socket to become ready again. - * sock_.async_wait(tcp::socket::wait_write, *this); - * return; - * } - * - * if (ec || n == 0) - * { - * // An error occurred, or we have reached the end of the file. - * // Either way we must exit the loop so we can call the handler. - * break; - * } - * - * // Loop around to try calling sendfile again. - * } - * } - * - * // Pass result back to user's handler. - * handler_(ec, total_bytes_transferred_); - * } - * }; - * - * template - * void async_sendfile(tcp::socket& sock, int fd, Handler h) - * { - * sendfile_op op = { sock, fd, h, 0, 0 }; - * sock.async_wait(tcp::socket::wait_write, op); - * } @endcode - */ - bool native_non_blocking() const - { - return this->get_service().native_non_blocking(this->get_implementation()); - } - - /// Sets the non-blocking mode of the native socket implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native socket. It has no effect on the behaviour of the socket object's - * synchronous operations. - * - * @param mode If @c true, the underlying socket is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @throws asio::system_error Thrown on failure. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - * - * @par Example - * This function is intended to allow the encapsulation of arbitrary - * non-blocking system calls as asynchronous operations, in a way that is - * transparent to the user of the socket object. The following example - * illustrates how Linux's @c sendfile system call might be encapsulated: - * @code template - * struct sendfile_op - * { - * tcp::socket& sock_; - * int fd_; - * Handler handler_; - * off_t offset_; - * std::size_t total_bytes_transferred_; - * - * // Function call operator meeting WriteHandler requirements. - * // Used as the handler for the async_write_some operation. - * void operator()(asio::error_code ec, std::size_t) - * { - * // Put the underlying socket into non-blocking mode. - * if (!ec) - * if (!sock_.native_non_blocking()) - * sock_.native_non_blocking(true, ec); - * - * if (!ec) - * { - * for (;;) - * { - * // Try the system call. - * errno = 0; - * int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536); - * ec = asio::error_code(n < 0 ? errno : 0, - * asio::error::get_system_category()); - * total_bytes_transferred_ += ec ? 0 : n; - * - * // Retry operation immediately if interrupted by signal. - * if (ec == asio::error::interrupted) - * continue; - * - * // Check if we need to run the operation again. - * if (ec == asio::error::would_block - * || ec == asio::error::try_again) - * { - * // We have to wait for the socket to become ready again. - * sock_.async_wait(tcp::socket::wait_write, *this); - * return; - * } - * - * if (ec || n == 0) - * { - * // An error occurred, or we have reached the end of the file. - * // Either way we must exit the loop so we can call the handler. - * break; - * } - * - * // Loop around to try calling sendfile again. - * } - * } - * - * // Pass result back to user's handler. - * handler_(ec, total_bytes_transferred_); - * } - * }; - * - * template - * void async_sendfile(tcp::socket& sock, int fd, Handler h) - * { - * sendfile_op op = { sock, fd, h, 0, 0 }; - * sock.async_wait(tcp::socket::wait_write, op); - * } @endcode - */ - void native_non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "native_non_blocking"); - } - - /// Sets the non-blocking mode of the native socket implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native socket. It has no effect on the behaviour of the socket object's - * synchronous operations. - * - * @param mode If @c true, the underlying socket is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @param ec Set to indicate what error occurred, if any. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - * - * @par Example - * This function is intended to allow the encapsulation of arbitrary - * non-blocking system calls as asynchronous operations, in a way that is - * transparent to the user of the socket object. The following example - * illustrates how Linux's @c sendfile system call might be encapsulated: - * @code template - * struct sendfile_op - * { - * tcp::socket& sock_; - * int fd_; - * Handler handler_; - * off_t offset_; - * std::size_t total_bytes_transferred_; - * - * // Function call operator meeting WriteHandler requirements. - * // Used as the handler for the async_write_some operation. - * void operator()(asio::error_code ec, std::size_t) - * { - * // Put the underlying socket into non-blocking mode. - * if (!ec) - * if (!sock_.native_non_blocking()) - * sock_.native_non_blocking(true, ec); - * - * if (!ec) - * { - * for (;;) - * { - * // Try the system call. - * errno = 0; - * int n = ::sendfile(sock_.native_handle(), fd_, &offset_, 65536); - * ec = asio::error_code(n < 0 ? errno : 0, - * asio::error::get_system_category()); - * total_bytes_transferred_ += ec ? 0 : n; - * - * // Retry operation immediately if interrupted by signal. - * if (ec == asio::error::interrupted) - * continue; - * - * // Check if we need to run the operation again. - * if (ec == asio::error::would_block - * || ec == asio::error::try_again) - * { - * // We have to wait for the socket to become ready again. - * sock_.async_wait(tcp::socket::wait_write, *this); - * return; - * } - * - * if (ec || n == 0) - * { - * // An error occurred, or we have reached the end of the file. - * // Either way we must exit the loop so we can call the handler. - * break; - * } - * - * // Loop around to try calling sendfile again. - * } - * } - * - * // Pass result back to user's handler. - * handler_(ec, total_bytes_transferred_); - * } - * }; - * - * template - * void async_sendfile(tcp::socket& sock, int fd, Handler h) - * { - * sendfile_op op = { sock, fd, h, 0, 0 }; - * sock.async_wait(tcp::socket::wait_write, op); - * } @endcode - */ - ASIO_SYNC_OP_VOID native_non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the local endpoint of the socket. - /** - * This function is used to obtain the locally bound endpoint of the socket. - * - * @returns An object that represents the local endpoint of the socket. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::endpoint endpoint = socket.local_endpoint(); - * @endcode - */ - endpoint_type local_endpoint() const - { - asio::error_code ec; - endpoint_type ep = this->get_service().local_endpoint( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "local_endpoint"); - return ep; - } - - /// Get the local endpoint of the socket. - /** - * This function is used to obtain the locally bound endpoint of the socket. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns An object that represents the local endpoint of the socket. - * Returns a default-constructed endpoint object if an error occurred. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::error_code ec; - * asio::ip::tcp::endpoint endpoint = socket.local_endpoint(ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - endpoint_type local_endpoint(asio::error_code& ec) const - { - return this->get_service().local_endpoint(this->get_implementation(), ec); - } - - /// Get the remote endpoint of the socket. - /** - * This function is used to obtain the remote endpoint of the socket. - * - * @returns An object that represents the remote endpoint of the socket. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(); - * @endcode - */ - endpoint_type remote_endpoint() const - { - asio::error_code ec; - endpoint_type ep = this->get_service().remote_endpoint( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "remote_endpoint"); - return ep; - } - - /// Get the remote endpoint of the socket. - /** - * This function is used to obtain the remote endpoint of the socket. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns An object that represents the remote endpoint of the socket. - * Returns a default-constructed endpoint object if an error occurred. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::error_code ec; - * asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - endpoint_type remote_endpoint(asio::error_code& ec) const - { - return this->get_service().remote_endpoint(this->get_implementation(), ec); - } - - /// Disable sends or receives on the socket. - /** - * This function is used to disable send operations, receive operations, or - * both. - * - * @param what Determines what types of operation will no longer be allowed. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * Shutting down the send side of the socket: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * socket.shutdown(asio::ip::tcp::socket::shutdown_send); - * @endcode - */ - void shutdown(shutdown_type what) - { - asio::error_code ec; - this->get_service().shutdown(this->get_implementation(), what, ec); - asio::detail::throw_error(ec, "shutdown"); - } - - /// Disable sends or receives on the socket. - /** - * This function is used to disable send operations, receive operations, or - * both. - * - * @param what Determines what types of operation will no longer be allowed. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * Shutting down the send side of the socket: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::error_code ec; - * socket.shutdown(asio::ip::tcp::socket::shutdown_send, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID shutdown(shutdown_type what, - asio::error_code& ec) - { - this->get_service().shutdown(this->get_implementation(), what, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the socket to become ready to read, ready to write, or to have - /// pending error conditions. - /** - * This function is used to perform a blocking wait for a socket to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired socket state. - * - * @par Example - * Waiting for a socket to become readable. - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * socket.wait(asio::ip::tcp::socket::wait_read); - * @endcode - */ - void wait(wait_type w) - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), w, ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Wait for the socket to become ready to read, ready to write, or to have - /// pending error conditions. - /** - * This function is used to perform a blocking wait for a socket to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired socket state. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * Waiting for a socket to become readable. - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::error_code ec; - * socket.wait(asio::ip::tcp::socket::wait_read, ec); - * @endcode - */ - ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the socket to become ready to read, ready to - /// write, or to have pending error conditions. - /** - * This function is used to perform an asynchronous wait for a socket to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired socket state. - * - * @param handler The handler to be called when the wait operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void wait_handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Wait succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::socket socket(io_context); - * ... - * socket.async_wait(asio::ip::tcp::socket::wait_read, wait_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WaitHandler. - ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_wait(this->get_implementation(), - w, ASIO_MOVE_CAST(WaitHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_wait(this->get_implementation(), - w, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - -protected: - /// Protected destructor to prevent deletion through this type. - /** - * This function destroys the socket, cancelling any outstanding asynchronous - * operations associated with the socket as if by calling @c cancel. - */ - ~basic_socket() - { - } - -private: - // Disallow copying and assignment. - basic_socket(const basic_socket&) ASIO_DELETED; - basic_socket& operator=(const basic_socket&) ASIO_DELETED; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# undef ASIO_SVC_T -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_BASIC_SOCKET_HPP diff --git a/scout_sdk/asio/asio/basic_socket_acceptor.hpp b/scout_sdk/asio/asio/basic_socket_acceptor.hpp deleted file mode 100644 index ed201bb..0000000 --- a/scout_sdk/asio/asio/basic_socket_acceptor.hpp +++ /dev/null @@ -1,1986 +0,0 @@ -// -// basic_socket_acceptor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_ACCEPTOR_HPP -#define ASIO_BASIC_SOCKET_ACCEPTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/basic_socket.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/socket_base.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/socket_acceptor_service.hpp" -#else // defined(ASIO_ENABLE_OLD_SERVICES) -# if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/null_socket_service.hpp" -# define ASIO_SVC_T detail::null_socket_service -# elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_socket_service.hpp" -# define ASIO_SVC_T detail::win_iocp_socket_service -# else -# include "asio/detail/reactive_socket_service.hpp" -# define ASIO_SVC_T detail::reactive_socket_service -# endif -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides the ability to accept new connections. -/** - * The basic_socket_acceptor class template is used for accepting new socket - * connections. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Example - * Opening a socket acceptor with the SO_REUSEADDR option enabled: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port); - * acceptor.open(endpoint.protocol()); - * acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true)); - * acceptor.bind(endpoint); - * acceptor.listen(); - * @endcode - */ -template )> -class basic_socket_acceptor - : ASIO_SVC_ACCESS basic_io_object, - public socket_base -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The native representation of an acceptor. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename ASIO_SVC_T::native_handle_type native_handle_type; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct an acceptor without opening it. - /** - * This constructor creates an acceptor without opening it to listen for new - * connections. The open() function must be called before the acceptor can - * accept new socket connections. - * - * @param io_context The io_context object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - */ - explicit basic_socket_acceptor(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct an open acceptor. - /** - * This constructor creates an acceptor and automatically opens it. - * - * @param io_context The io_context object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::system_error Thrown on failure. - */ - basic_socket_acceptor(asio::io_context& io_context, - const protocol_type& protocol) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), protocol, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Construct an acceptor opened on the given endpoint. - /** - * This constructor creates an acceptor and automatically opens it to listen - * for new connections on the specified endpoint. - * - * @param io_context The io_context object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - * - * @param endpoint An endpoint on the local machine on which the acceptor - * will listen for new connections. - * - * @param reuse_addr Whether the constructor should set the socket option - * socket_base::reuse_address. - * - * @throws asio::system_error Thrown on failure. - * - * @note This constructor is equivalent to the following code: - * @code - * basic_socket_acceptor acceptor(io_context); - * acceptor.open(endpoint.protocol()); - * if (reuse_addr) - * acceptor.set_option(socket_base::reuse_address(true)); - * acceptor.bind(endpoint); - * acceptor.listen(listen_backlog); - * @endcode - */ - basic_socket_acceptor(asio::io_context& io_context, - const endpoint_type& endpoint, bool reuse_addr = true) - : basic_io_object(io_context) - { - asio::error_code ec; - const protocol_type protocol = endpoint.protocol(); - this->get_service().open(this->get_implementation(), protocol, ec); - asio::detail::throw_error(ec, "open"); - if (reuse_addr) - { - this->get_service().set_option(this->get_implementation(), - socket_base::reuse_address(true), ec); - asio::detail::throw_error(ec, "set_option"); - } - this->get_service().bind(this->get_implementation(), endpoint, ec); - asio::detail::throw_error(ec, "bind"); - this->get_service().listen(this->get_implementation(), - socket_base::max_listen_connections, ec); - asio::detail::throw_error(ec, "listen"); - } - - /// Construct a basic_socket_acceptor on an existing native acceptor. - /** - * This constructor creates an acceptor object to hold an existing native - * acceptor. - * - * @param io_context The io_context object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_acceptor A native acceptor. - * - * @throws asio::system_error Thrown on failure. - */ - basic_socket_acceptor(asio::io_context& io_context, - const protocol_type& protocol, const native_handle_type& native_acceptor) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - protocol, native_acceptor, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_socket_acceptor from another. - /** - * This constructor moves an acceptor from one object to another. - * - * @param other The other basic_socket_acceptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket_acceptor(io_context&) constructor. - */ - basic_socket_acceptor(basic_socket_acceptor&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign a basic_socket_acceptor from another. - /** - * This assignment operator moves an acceptor from one object to another. - * - * @param other The other basic_socket_acceptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket_acceptor(io_context&) constructor. - */ - basic_socket_acceptor& operator=(basic_socket_acceptor&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } - - // All socket acceptors have access to each other's implementations. - template - friend class basic_socket_acceptor; - - /// Move-construct a basic_socket_acceptor from an acceptor of another - /// protocol type. - /** - * This constructor moves an acceptor from one object to another. - * - * @param other The other basic_socket_acceptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket(io_context&) constructor. - */ - template - basic_socket_acceptor( - basic_socket_acceptor&& other, - typename enable_if::value>::type* = 0) - : basic_io_object( - other.get_service(), other.get_implementation()) - { - } - - /// Move-assign a basic_socket_acceptor from an acceptor of another protocol - /// type. - /** - * This assignment operator moves an acceptor from one object to another. - * - * @param other The other basic_socket_acceptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_socket(io_context&) constructor. - */ - template - typename enable_if::value, - basic_socket_acceptor>::type& operator=( - basic_socket_acceptor&& other) - { - basic_socket_acceptor tmp(std::move(other)); - basic_io_object::operator=(std::move(tmp)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the acceptor. - /** - * This function destroys the acceptor, cancelling any outstanding - * asynchronous operations associated with the acceptor as if by calling - * @c cancel. - */ - ~basic_socket_acceptor() - { - } - -#if defined(ASIO_ENABLE_OLD_SERVICES) - // These functions are provided by basic_io_object<>. -#else // defined(ASIO_ENABLE_OLD_SERVICES) -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - - /// Open the acceptor using the specified protocol. - /** - * This function opens the socket acceptor so that it will use the specified - * protocol. - * - * @param protocol An object specifying which protocol is to be used. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * acceptor.open(asio::ip::tcp::v4()); - * @endcode - */ - void open(const protocol_type& protocol = protocol_type()) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), protocol, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Open the acceptor using the specified protocol. - /** - * This function opens the socket acceptor so that it will use the specified - * protocol. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * asio::error_code ec; - * acceptor.open(asio::ip::tcp::v4(), ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID open(const protocol_type& protocol, - asio::error_code& ec) - { - this->get_service().open(this->get_implementation(), protocol, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assigns an existing native acceptor to the acceptor. - /* - * This function opens the acceptor to hold an existing native acceptor. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_acceptor A native acceptor. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const protocol_type& protocol, - const native_handle_type& native_acceptor) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - protocol, native_acceptor, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assigns an existing native acceptor to the acceptor. - /* - * This function opens the acceptor to hold an existing native acceptor. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_acceptor A native acceptor. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const protocol_type& protocol, - const native_handle_type& native_acceptor, asio::error_code& ec) - { - this->get_service().assign(this->get_implementation(), - protocol, native_acceptor, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the acceptor is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Bind the acceptor to the given local endpoint. - /** - * This function binds the socket acceptor to the specified endpoint on the - * local machine. - * - * @param endpoint An endpoint on the local machine to which the socket - * acceptor will be bound. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345); - * acceptor.open(endpoint.protocol()); - * acceptor.bind(endpoint); - * @endcode - */ - void bind(const endpoint_type& endpoint) - { - asio::error_code ec; - this->get_service().bind(this->get_implementation(), endpoint, ec); - asio::detail::throw_error(ec, "bind"); - } - - /// Bind the acceptor to the given local endpoint. - /** - * This function binds the socket acceptor to the specified endpoint on the - * local machine. - * - * @param endpoint An endpoint on the local machine to which the socket - * acceptor will be bound. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), 12345); - * acceptor.open(endpoint.protocol()); - * asio::error_code ec; - * acceptor.bind(endpoint, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID bind(const endpoint_type& endpoint, - asio::error_code& ec) - { - this->get_service().bind(this->get_implementation(), endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Place the acceptor into the state where it will listen for new - /// connections. - /** - * This function puts the socket acceptor into the state where it may accept - * new connections. - * - * @param backlog The maximum length of the queue of pending connections. - * - * @throws asio::system_error Thrown on failure. - */ - void listen(int backlog = socket_base::max_listen_connections) - { - asio::error_code ec; - this->get_service().listen(this->get_implementation(), backlog, ec); - asio::detail::throw_error(ec, "listen"); - } - - /// Place the acceptor into the state where it will listen for new - /// connections. - /** - * This function puts the socket acceptor into the state where it may accept - * new connections. - * - * @param backlog The maximum length of the queue of pending connections. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::error_code ec; - * acceptor.listen(asio::socket_base::max_listen_connections, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID listen(int backlog, asio::error_code& ec) - { - this->get_service().listen(this->get_implementation(), backlog, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Close the acceptor. - /** - * This function is used to close the acceptor. Any asynchronous accept - * operations will be cancelled immediately. - * - * A subsequent call to open() is required before the acceptor can again be - * used to again perform socket accept operations. - * - * @throws asio::system_error Thrown on failure. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the acceptor. - /** - * This function is used to close the acceptor. Any asynchronous accept - * operations will be cancelled immediately. - * - * A subsequent call to open() is required before the acceptor can again be - * used to again perform socket accept operations. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::error_code ec; - * acceptor.close(ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Release ownership of the underlying native acceptor. - /** - * This function causes all outstanding asynchronous accept operations to - * finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. Ownership of the - * native acceptor is then transferred to the caller. - * - * @throws asio::system_error Thrown on failure. - * - * @note This function is unsupported on Windows versions prior to Windows - * 8.1, and will fail with asio::error::operation_not_supported on - * these platforms. - */ -#if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ - && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) - __declspec(deprecated("This function always fails with " - "operation_not_supported when used on Windows versions " - "prior to Windows 8.1.")) -#endif - native_handle_type release() - { - asio::error_code ec; - native_handle_type s = this->get_service().release( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "release"); - return s; - } - - /// Release ownership of the underlying native acceptor. - /** - * This function causes all outstanding asynchronous accept operations to - * finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. Ownership of the - * native acceptor is then transferred to the caller. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note This function is unsupported on Windows versions prior to Windows - * 8.1, and will fail with asio::error::operation_not_supported on - * these platforms. - */ -#if defined(ASIO_MSVC) && (ASIO_MSVC >= 1400) \ - && (!defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0603) - __declspec(deprecated("This function always fails with " - "operation_not_supported when used on Windows versions " - "prior to Windows 8.1.")) -#endif - native_handle_type release(asio::error_code& ec) - { - return this->get_service().release(this->get_implementation(), ec); - } - - /// Get the native acceptor representation. - /** - * This function may be used to obtain the underlying representation of the - * acceptor. This is intended to allow access to native acceptor functionality - * that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the acceptor. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the acceptor. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Set an option on the acceptor. - /** - * This function is used to set an option on the acceptor. - * - * @param option The new option value to be set on the acceptor. - * - * @throws asio::system_error Thrown on failure. - * - * @sa SettableSocketOption @n - * asio::socket_base::reuse_address - * asio::socket_base::enable_connection_aborted - * - * @par Example - * Setting the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::acceptor::reuse_address option(true); - * acceptor.set_option(option); - * @endcode - */ - template - void set_option(const SettableSocketOption& option) - { - asio::error_code ec; - this->get_service().set_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "set_option"); - } - - /// Set an option on the acceptor. - /** - * This function is used to set an option on the acceptor. - * - * @param option The new option value to be set on the acceptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa SettableSocketOption @n - * asio::socket_base::reuse_address - * asio::socket_base::enable_connection_aborted - * - * @par Example - * Setting the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::acceptor::reuse_address option(true); - * asio::error_code ec; - * acceptor.set_option(option, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - template - ASIO_SYNC_OP_VOID set_option(const SettableSocketOption& option, - asio::error_code& ec) - { - this->get_service().set_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get an option from the acceptor. - /** - * This function is used to get the current value of an option on the - * acceptor. - * - * @param option The option value to be obtained from the acceptor. - * - * @throws asio::system_error Thrown on failure. - * - * @sa GettableSocketOption @n - * asio::socket_base::reuse_address - * - * @par Example - * Getting the value of the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::acceptor::reuse_address option; - * acceptor.get_option(option); - * bool is_set = option.get(); - * @endcode - */ - template - void get_option(GettableSocketOption& option) const - { - asio::error_code ec; - this->get_service().get_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "get_option"); - } - - /// Get an option from the acceptor. - /** - * This function is used to get the current value of an option on the - * acceptor. - * - * @param option The option value to be obtained from the acceptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa GettableSocketOption @n - * asio::socket_base::reuse_address - * - * @par Example - * Getting the value of the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::acceptor::reuse_address option; - * asio::error_code ec; - * acceptor.get_option(option, ec); - * if (ec) - * { - * // An error occurred. - * } - * bool is_set = option.get(); - * @endcode - */ - template - ASIO_SYNC_OP_VOID get_option(GettableSocketOption& option, - asio::error_code& ec) const - { - this->get_service().get_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the acceptor. - /** - * This function is used to execute an IO control command on the acceptor. - * - * @param command The IO control command to be performed on the acceptor. - * - * @throws asio::system_error Thrown on failure. - * - * @sa IoControlCommand @n - * asio::socket_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::acceptor::non_blocking_io command(true); - * socket.io_control(command); - * @endcode - */ - template - void io_control(IoControlCommand& command) - { - asio::error_code ec; - this->get_service().io_control(this->get_implementation(), command, ec); - asio::detail::throw_error(ec, "io_control"); - } - - /// Perform an IO control command on the acceptor. - /** - * This function is used to execute an IO control command on the acceptor. - * - * @param command The IO control command to be performed on the acceptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa IoControlCommand @n - * asio::socket_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::acceptor::non_blocking_io command(true); - * asio::error_code ec; - * socket.io_control(command, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - template - ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, - asio::error_code& ec) - { - this->get_service().io_control(this->get_implementation(), command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the acceptor. - /** - * @returns @c true if the acceptor's synchronous operations will fail with - * asio::error::would_block if they are unable to perform the requested - * operation immediately. If @c false, synchronous operations will block - * until complete. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - bool non_blocking() const - { - return this->get_service().non_blocking(this->get_implementation()); - } - - /// Sets the non-blocking mode of the acceptor. - /** - * @param mode If @c true, the acceptor's synchronous operations will fail - * with asio::error::would_block if they are unable to perform the - * requested operation immediately. If @c false, synchronous operations will - * block until complete. - * - * @throws asio::system_error Thrown on failure. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - void non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().non_blocking(this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "non_blocking"); - } - - /// Sets the non-blocking mode of the acceptor. - /** - * @param mode If @c true, the acceptor's synchronous operations will fail - * with asio::error::would_block if they are unable to perform the - * requested operation immediately. If @c false, synchronous operations will - * block until complete. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - ASIO_SYNC_OP_VOID non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().non_blocking(this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native acceptor implementation. - /** - * This function is used to retrieve the non-blocking mode of the underlying - * native acceptor. This mode has no effect on the behaviour of the acceptor - * object's synchronous operations. - * - * @returns @c true if the underlying acceptor is in non-blocking mode and - * direct system calls may fail with asio::error::would_block (or the - * equivalent system error). - * - * @note The current non-blocking mode is cached by the acceptor object. - * Consequently, the return value may be incorrect if the non-blocking mode - * was set directly on the native acceptor. - */ - bool native_non_blocking() const - { - return this->get_service().native_non_blocking(this->get_implementation()); - } - - /// Sets the non-blocking mode of the native acceptor implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native acceptor. It has no effect on the behaviour of the acceptor object's - * synchronous operations. - * - * @param mode If @c true, the underlying acceptor is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @throws asio::system_error Thrown on failure. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - */ - void native_non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "native_non_blocking"); - } - - /// Sets the non-blocking mode of the native acceptor implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native acceptor. It has no effect on the behaviour of the acceptor object's - * synchronous operations. - * - * @param mode If @c true, the underlying acceptor is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @param ec Set to indicate what error occurred, if any. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - */ - ASIO_SYNC_OP_VOID native_non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the local endpoint of the acceptor. - /** - * This function is used to obtain the locally bound endpoint of the acceptor. - * - * @returns An object that represents the local endpoint of the acceptor. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint(); - * @endcode - */ - endpoint_type local_endpoint() const - { - asio::error_code ec; - endpoint_type ep = this->get_service().local_endpoint( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "local_endpoint"); - return ep; - } - - /// Get the local endpoint of the acceptor. - /** - * This function is used to obtain the locally bound endpoint of the acceptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns An object that represents the local endpoint of the acceptor. - * Returns a default-constructed endpoint object if an error occurred and the - * error handler did not throw an exception. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::error_code ec; - * asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint(ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - endpoint_type local_endpoint(asio::error_code& ec) const - { - return this->get_service().local_endpoint(this->get_implementation(), ec); - } - - /// Wait for the acceptor to become ready to read, ready to write, or to have - /// pending error conditions. - /** - * This function is used to perform a blocking wait for an acceptor to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired acceptor state. - * - * @par Example - * Waiting for an acceptor to become readable. - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * acceptor.wait(asio::ip::tcp::acceptor::wait_read); - * @endcode - */ - void wait(wait_type w) - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), w, ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Wait for the acceptor to become ready to read, ready to write, or to have - /// pending error conditions. - /** - * This function is used to perform a blocking wait for an acceptor to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired acceptor state. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * Waiting for an acceptor to become readable. - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::error_code ec; - * acceptor.wait(asio::ip::tcp::acceptor::wait_read, ec); - * @endcode - */ - ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the acceptor to become ready to read, ready to - /// write, or to have pending error conditions. - /** - * This function is used to perform an asynchronous wait for an acceptor to - * enter a ready to read, write or error condition state. - * - * @param w Specifies the desired acceptor state. - * - * @param handler The handler to be called when the wait operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void wait_handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Wait succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * acceptor.async_wait( - * asio::ip::tcp::acceptor::wait_read, - * wait_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WaitHandler. - ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_wait(this->get_implementation(), - w, ASIO_MOVE_CAST(WaitHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_wait(this->get_implementation(), - w, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - -#if !defined(ASIO_NO_EXTENSIONS) - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer into the - * given socket. The function call will block until a new connection has been - * accepted successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(io_context); - * acceptor.accept(socket); - * @endcode - */ -#if defined(ASIO_ENABLE_OLD_SERVICES) - template - void accept(basic_socket& peer, - typename enable_if::value>::type* = 0) -#else // defined(ASIO_ENABLE_OLD_SERVICES) - template - void accept(basic_socket& peer, - typename enable_if::value>::type* = 0) -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - { - asio::error_code ec; - this->get_service().accept(this->get_implementation(), - peer, static_cast(0), ec); - asio::detail::throw_error(ec, "accept"); - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer into the - * given socket. The function call will block until a new connection has been - * accepted successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(io_context); - * asio::error_code ec; - * acceptor.accept(socket, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ -#if defined(ASIO_ENABLE_OLD_SERVICES) - template - ASIO_SYNC_OP_VOID accept( - basic_socket& peer, - asio::error_code& ec, - typename enable_if::value>::type* = 0) -#else // defined(ASIO_ENABLE_OLD_SERVICES) - template - ASIO_SYNC_OP_VOID accept( - basic_socket& peer, asio::error_code& ec, - typename enable_if::value>::type* = 0) -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - { - this->get_service().accept(this->get_implementation(), - peer, static_cast(0), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection into a - * socket. The function call always returns immediately. - * - * @param peer The socket into which the new connection will be accepted. - * Ownership of the peer object is retained by the caller, which must - * guarantee that it is valid until the handler is called. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void accept_handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Accept succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(io_context); - * acceptor.async_accept(socket, accept_handler); - * @endcode - */ -#if defined(ASIO_ENABLE_OLD_SERVICES) - template - ASIO_INITFN_RESULT_TYPE(AcceptHandler, - void (asio::error_code)) - async_accept(basic_socket& peer, - ASIO_MOVE_ARG(AcceptHandler) handler, - typename enable_if::value>::type* = 0) -#else // defined(ASIO_ENABLE_OLD_SERVICES) - template - ASIO_INITFN_RESULT_TYPE(AcceptHandler, - void (asio::error_code)) - async_accept(basic_socket& peer, - ASIO_MOVE_ARG(AcceptHandler) handler, - typename enable_if::value>::type* = 0) -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a AcceptHandler. - ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_accept(this->get_implementation(), - peer, static_cast(0), - ASIO_MOVE_CAST(AcceptHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_accept(this->get_implementation(), - peer, static_cast(0), init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Accept a new connection and obtain the endpoint of the peer - /** - * This function is used to accept a new connection from a peer into the - * given socket, and additionally provide the endpoint of the remote peer. - * The function call will block until a new connection has been accepted - * successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @param peer_endpoint An endpoint object which will receive the endpoint of - * the remote peer. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(io_context); - * asio::ip::tcp::endpoint endpoint; - * acceptor.accept(socket, endpoint); - * @endcode - */ -#if defined(ASIO_ENABLE_OLD_SERVICES) - template - void accept(basic_socket& peer, - endpoint_type& peer_endpoint) -#else // defined(ASIO_ENABLE_OLD_SERVICES) - void accept(basic_socket& peer, endpoint_type& peer_endpoint) -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - { - asio::error_code ec; - this->get_service().accept(this->get_implementation(), - peer, &peer_endpoint, ec); - asio::detail::throw_error(ec, "accept"); - } - - /// Accept a new connection and obtain the endpoint of the peer - /** - * This function is used to accept a new connection from a peer into the - * given socket, and additionally provide the endpoint of the remote peer. - * The function call will block until a new connection has been accepted - * successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @param peer_endpoint An endpoint object which will receive the endpoint of - * the remote peer. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(io_context); - * asio::ip::tcp::endpoint endpoint; - * asio::error_code ec; - * acceptor.accept(socket, endpoint, ec); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ -#if defined(ASIO_ENABLE_OLD_SERVICES) - template - ASIO_SYNC_OP_VOID accept( - basic_socket& peer, - endpoint_type& peer_endpoint, asio::error_code& ec) -#else // defined(ASIO_ENABLE_OLD_SERVICES) - ASIO_SYNC_OP_VOID accept(basic_socket& peer, - endpoint_type& peer_endpoint, asio::error_code& ec) -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - { - this->get_service().accept( - this->get_implementation(), peer, &peer_endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection into a - * socket, and additionally obtain the endpoint of the remote peer. The - * function call always returns immediately. - * - * @param peer The socket into which the new connection will be accepted. - * Ownership of the peer object is retained by the caller, which must - * guarantee that it is valid until the handler is called. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. Ownership of the peer_endpoint object is - * retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -#if defined(ASIO_ENABLE_OLD_SERVICES) - template - ASIO_INITFN_RESULT_TYPE(AcceptHandler, - void (asio::error_code)) - async_accept(basic_socket& peer, - endpoint_type& peer_endpoint, ASIO_MOVE_ARG(AcceptHandler) handler) -#else // defined(ASIO_ENABLE_OLD_SERVICES) - template - ASIO_INITFN_RESULT_TYPE(AcceptHandler, - void (asio::error_code)) - async_accept(basic_socket& peer, - endpoint_type& peer_endpoint, ASIO_MOVE_ARG(AcceptHandler) handler) -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a AcceptHandler. - ASIO_ACCEPT_HANDLER_CHECK(AcceptHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_accept(this->get_implementation(), peer, - &peer_endpoint, ASIO_MOVE_CAST(AcceptHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_accept(this->get_implementation(), - peer, &peer_endpoint, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -#endif // !defined(ASIO_NO_EXTENSIONS) - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @returns A socket object representing the newly accepted connection. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(acceptor.accept()); - * @endcode - */ - typename Protocol::socket accept() - { - asio::error_code ec; - typename Protocol::socket peer( - this->get_service().accept( - this->get_implementation(), 0, 0, ec)); - asio::detail::throw_error(ec, "accept"); - return peer; - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns On success, a socket object representing the newly accepted - * connection. On error, a socket object where is_open() is false. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(acceptor.accept(ec)); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - typename Protocol::socket accept(asio::error_code& ec) - { - return this->get_service().accept(this->get_implementation(), 0, 0, ec); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection. The - * function call always returns immediately. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * typename Protocol::socket peer // On success, the newly accepted socket. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void accept_handler(const asio::error_code& error, - * asio::ip::tcp::socket peer) - * { - * if (!error) - * { - * // Accept succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * acceptor.async_accept(accept_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, - void (asio::error_code, typename Protocol::socket)) - async_accept(ASIO_MOVE_ARG(MoveAcceptHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a MoveAcceptHandler. - ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, - handler, typename Protocol::socket) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_accept( - this->get_implementation(), static_cast(0), - static_cast(0), - ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_accept( - this->get_implementation(), static_cast(0), - static_cast(0), init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param io_context The io_context object to be used for the newly accepted - * socket. - * - * @returns A socket object representing the newly accepted connection. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(acceptor.accept()); - * @endcode - */ - typename Protocol::socket accept(asio::io_context& io_context) - { - asio::error_code ec; - typename Protocol::socket peer( - this->get_service().accept(this->get_implementation(), - &io_context, static_cast(0), ec)); - asio::detail::throw_error(ec, "accept"); - return peer; - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param io_context The io_context object to be used for the newly accepted - * socket. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns On success, a socket object representing the newly accepted - * connection. On error, a socket object where is_open() is false. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::socket socket(acceptor.accept(io_context2, ec)); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - typename Protocol::socket accept( - asio::io_context& io_context, asio::error_code& ec) - { - return this->get_service().accept(this->get_implementation(), - &io_context, static_cast(0), ec); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection. The - * function call always returns immediately. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param io_context The io_context object to be used for the newly accepted - * socket. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * typename Protocol::socket peer // On success, the newly accepted socket. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void accept_handler(const asio::error_code& error, - * asio::ip::tcp::socket peer) - * { - * if (!error) - * { - * // Accept succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * acceptor.async_accept(io_context2, accept_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, - void (asio::error_code, typename Protocol::socket)) - async_accept(asio::io_context& io_context, - ASIO_MOVE_ARG(MoveAcceptHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a MoveAcceptHandler. - ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, - handler, typename Protocol::socket) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_accept(this->get_implementation(), - &io_context, static_cast(0), - ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_accept(this->get_implementation(), - &io_context, static_cast(0), init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. - * - * @returns A socket object representing the newly accepted connection. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::endpoint endpoint; - * asio::ip::tcp::socket socket(acceptor.accept(endpoint)); - * @endcode - */ - typename Protocol::socket accept(endpoint_type& peer_endpoint) - { - asio::error_code ec; - typename Protocol::socket peer( - this->get_service().accept(this->get_implementation(), - static_cast(0), &peer_endpoint, ec)); - asio::detail::throw_error(ec, "accept"); - return peer; - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns On success, a socket object representing the newly accepted - * connection. On error, a socket object where is_open() is false. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::endpoint endpoint; - * asio::ip::tcp::socket socket(acceptor.accept(endpoint, ec)); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - typename Protocol::socket accept( - endpoint_type& peer_endpoint, asio::error_code& ec) - { - return this->get_service().accept(this->get_implementation(), - static_cast(0), &peer_endpoint, ec); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection. The - * function call always returns immediately. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. Ownership of the peer_endpoint object is - * retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * typename Protocol::socket peer // On success, the newly accepted socket. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void accept_handler(const asio::error_code& error, - * asio::ip::tcp::socket peer) - * { - * if (!error) - * { - * // Accept succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::endpoint endpoint; - * acceptor.async_accept(endpoint, accept_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, - void (asio::error_code, typename Protocol::socket)) - async_accept(endpoint_type& peer_endpoint, - ASIO_MOVE_ARG(MoveAcceptHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a MoveAcceptHandler. - ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, - handler, typename Protocol::socket) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_accept(this->get_implementation(), - static_cast(0), &peer_endpoint, - ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_accept(this->get_implementation(), - static_cast(0), &peer_endpoint, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param io_context The io_context object to be used for the newly accepted - * socket. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. - * - * @returns A socket object representing the newly accepted connection. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::endpoint endpoint; - * asio::ip::tcp::socket socket( - * acceptor.accept(io_context2, endpoint)); - * @endcode - */ - typename Protocol::socket accept( - asio::io_context& io_context, endpoint_type& peer_endpoint) - { - asio::error_code ec; - typename Protocol::socket peer( - this->get_service().accept(this->get_implementation(), - &io_context, &peer_endpoint, ec)); - asio::detail::throw_error(ec, "accept"); - return peer; - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer. The function - * call will block until a new connection has been accepted successfully or - * an error occurs. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param io_context The io_context object to be used for the newly accepted - * socket. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns On success, a socket object representing the newly accepted - * connection. On error, a socket object where is_open() is false. - * - * @par Example - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::endpoint endpoint; - * asio::ip::tcp::socket socket( - * acceptor.accept(io_context2, endpoint, ec)); - * if (ec) - * { - * // An error occurred. - * } - * @endcode - */ - typename Protocol::socket accept(asio::io_context& io_context, - endpoint_type& peer_endpoint, asio::error_code& ec) - { - return this->get_service().accept(this->get_implementation(), - &io_context, &peer_endpoint, ec); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection. The - * function call always returns immediately. - * - * This overload requires that the Protocol template parameter satisfy the - * AcceptableProtocol type requirements. - * - * @param io_context The io_context object to be used for the newly accepted - * socket. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. Ownership of the peer_endpoint object is - * retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * typename Protocol::socket peer // On success, the newly accepted socket. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void accept_handler(const asio::error_code& error, - * asio::ip::tcp::socket peer) - * { - * if (!error) - * { - * // Accept succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::ip::tcp::endpoint endpoint; - * acceptor.async_accept(io_context2, endpoint, accept_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, - void (asio::error_code, typename Protocol::socket)) - async_accept(asio::io_context& io_context, - endpoint_type& peer_endpoint, - ASIO_MOVE_ARG(MoveAcceptHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a MoveAcceptHandler. - ASIO_MOVE_ACCEPT_HANDLER_CHECK(MoveAcceptHandler, - handler, typename Protocol::socket) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_accept( - this->get_implementation(), &io_context, &peer_endpoint, - ASIO_MOVE_CAST(MoveAcceptHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_accept(this->get_implementation(), - &io_context, &peer_endpoint, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# undef ASIO_SVC_T -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_BASIC_SOCKET_ACCEPTOR_HPP diff --git a/scout_sdk/asio/asio/basic_socket_iostream.hpp b/scout_sdk/asio/asio/basic_socket_iostream.hpp deleted file mode 100644 index 6681367..0000000 --- a/scout_sdk/asio/asio/basic_socket_iostream.hpp +++ /dev/null @@ -1,430 +0,0 @@ -// -// basic_socket_iostream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_IOSTREAM_HPP -#define ASIO_BASIC_SOCKET_IOSTREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_NO_IOSTREAM) - -#include -#include -#include "asio/basic_socket_streambuf.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/stream_socket_service.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#if !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -# include "asio/detail/variadic_templates.hpp" - -// A macro that should expand to: -// template -// explicit basic_socket_iostream(T1 x1, ..., Tn xn) -// : std::basic_iostream( -// &this->detail::socket_iostream_base< -// Protocol ASIO_SVC_TARG, Clock, -// WaitTraits ASIO_SVC_TARG1>::streambuf_) -// { -// if (rdbuf()->connect(x1, ..., xn) == 0) -// this->setstate(std::ios_base::failbit); -// } -// This macro should only persist within this file. - -# define ASIO_PRIVATE_CTR_DEF(n) \ - template \ - explicit basic_socket_iostream(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ - : std::basic_iostream( \ - &this->detail::socket_iostream_base< \ - Protocol ASIO_SVC_TARG, Clock, \ - WaitTraits ASIO_SVC_TARG1>::streambuf_) \ - { \ - this->setf(std::ios_base::unitbuf); \ - if (rdbuf()->connect(ASIO_VARIADIC_BYVAL_ARGS(n)) == 0) \ - this->setstate(std::ios_base::failbit); \ - } \ - /**/ - -// A macro that should expand to: -// template -// void connect(T1 x1, ..., Tn xn) -// { -// if (rdbuf()->connect(x1, ..., xn) == 0) -// this->setstate(std::ios_base::failbit); -// } -// This macro should only persist within this file. - -# define ASIO_PRIVATE_CONNECT_DEF(n) \ - template \ - void connect(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ - { \ - if (rdbuf()->connect(ASIO_VARIADIC_BYVAL_ARGS(n)) == 0) \ - this->setstate(std::ios_base::failbit); \ - } \ - /**/ - -#endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// A separate base class is used to ensure that the streambuf is initialised -// prior to the basic_socket_iostream's basic_iostream base class. -template -class socket_iostream_base -{ -protected: - socket_iostream_base() - { - } - -#if defined(ASIO_HAS_MOVE) - socket_iostream_base(socket_iostream_base&& other) - : streambuf_(std::move(other.streambuf_)) - { - } - - socket_iostream_base(basic_stream_socket s) - : streambuf_(std::move(s)) - { - } - - socket_iostream_base& operator=(socket_iostream_base&& other) - { - streambuf_ = std::move(other.streambuf_); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - basic_socket_streambuf streambuf_; -}; - -} // namespace detail - -#if !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) -#define ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL - -// Forward declaration with defaulted arguments. -template ), -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typename Clock = boost::posix_time::ptime, - typename WaitTraits = time_traits - ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> -#else // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typename Clock = chrono::steady_clock, - typename WaitTraits = wait_traits - ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) -class basic_socket_iostream; - -#endif // !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) - -/// Iostream interface for a socket. -#if defined(GENERATING_DOCUMENTATION) -template > -#else // defined(GENERATING_DOCUMENTATION) -template -#endif // defined(GENERATING_DOCUMENTATION) -class basic_socket_iostream - : private detail::socket_iostream_base, - public std::basic_iostream -{ -private: - // These typedefs are intended keep this class's implementation independent - // of whether it's using Boost.DateClock, Boost.Chrono or std::chrono. -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typedef WaitTraits traits_helper; -#else // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typedef detail::chrono_time_traits traits_helper; -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - -public: - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// The clock type. - typedef Clock clock_type; - -#if defined(GENERATING_DOCUMENTATION) - /// (Deprecated: Use time_point.) The time type. - typedef typename WaitTraits::time_type time_type; - - /// The time type. - typedef typename WaitTraits::time_point time_point; - - /// (Deprecated: Use duration.) The duration type. - typedef typename WaitTraits::duration_type duration_type; - - /// The duration type. - typedef typename WaitTraits::duration duration; -#else -# if !defined(ASIO_NO_DEPRECATED) - typedef typename traits_helper::time_type time_type; - typedef typename traits_helper::duration_type duration_type; -# endif // !defined(ASIO_NO_DEPRECATED) - typedef typename traits_helper::time_type time_point; - typedef typename traits_helper::duration_type duration; -#endif - - /// Construct a basic_socket_iostream without establishing a connection. - basic_socket_iostream() - : std::basic_iostream( - &this->detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>::streambuf_) - { - this->setf(std::ios_base::unitbuf); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Construct a basic_socket_iostream from the supplied socket. - explicit basic_socket_iostream(basic_stream_socket s) - : detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>(std::move(s)), - std::basic_iostream( - &this->detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>::streambuf_) - { - this->setf(std::ios_base::unitbuf); - } - -#if defined(ASIO_HAS_STD_IOSTREAM_MOVE) \ - || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_socket_iostream from another. - basic_socket_iostream(basic_socket_iostream&& other) - : detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>(std::move(other)), - std::basic_iostream(std::move(other)) - { - this->set_rdbuf(&this->detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>::streambuf_); - } - - /// Move-assign a basic_socket_iostream from another. - basic_socket_iostream& operator=(basic_socket_iostream&& other) - { - std::basic_iostream::operator=(std::move(other)); - detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_STD_IOSTREAM_MOVE) - // || defined(GENERATING_DOCUMENTATION) -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - -#if defined(GENERATING_DOCUMENTATION) - /// Establish a connection to an endpoint corresponding to a resolver query. - /** - * This constructor automatically establishes a connection based on the - * supplied resolver query parameters. The arguments are used to construct - * a resolver query object. - */ - template - explicit basic_socket_iostream(T1 t1, ..., TN tn); -#elif defined(ASIO_HAS_VARIADIC_TEMPLATES) - template - explicit basic_socket_iostream(T... x) - : std::basic_iostream( - &this->detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>::streambuf_) - { - this->setf(std::ios_base::unitbuf); - if (rdbuf()->connect(x...) == 0) - this->setstate(std::ios_base::failbit); - } -#else - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CTR_DEF) -#endif - -#if defined(GENERATING_DOCUMENTATION) - /// Establish a connection to an endpoint corresponding to a resolver query. - /** - * This function automatically establishes a connection based on the supplied - * resolver query parameters. The arguments are used to construct a resolver - * query object. - */ - template - void connect(T1 t1, ..., TN tn); -#elif defined(ASIO_HAS_VARIADIC_TEMPLATES) - template - void connect(T... x) - { - if (rdbuf()->connect(x...) == 0) - this->setstate(std::ios_base::failbit); - } -#else - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CONNECT_DEF) -#endif - - /// Close the connection. - void close() - { - if (rdbuf()->close() == 0) - this->setstate(std::ios_base::failbit); - } - - /// Return a pointer to the underlying streambuf. - basic_socket_streambuf* rdbuf() const - { - return const_cast*>( - &this->detail::socket_iostream_base< - Protocol ASIO_SVC_TARG, Clock, - WaitTraits ASIO_SVC_TARG1>::streambuf_); - } - - /// Get a reference to the underlying socket. - basic_socket& socket() - { - return rdbuf()->socket(); - } - - /// Get the last error associated with the stream. - /** - * @return An \c error_code corresponding to the last error from the stream. - * - * @par Example - * To print the error associated with a failure to establish a connection: - * @code tcp::iostream s("www.boost.org", "http"); - * if (!s) - * { - * std::cout << "Error: " << s.error().message() << std::endl; - * } @endcode - */ - const asio::error_code& error() const - { - return rdbuf()->error(); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use expiry().) Get the stream's expiry time as an absolute - /// time. - /** - * @return An absolute time value representing the stream's expiry time. - */ - time_point expires_at() const - { - return rdbuf()->expires_at(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the stream's expiry time as an absolute time. - /** - * @return An absolute time value representing the stream's expiry time. - */ - time_point expiry() const - { - return rdbuf()->expiry(); - } - - /// Set the stream's expiry time as an absolute time. - /** - * This function sets the expiry time associated with the stream. Stream - * operations performed after this time (where the operations cannot be - * completed using the internal buffers) will fail with the error - * asio::error::operation_aborted. - * - * @param expiry_time The expiry time to be used for the stream. - */ - void expires_at(const time_point& expiry_time) - { - rdbuf()->expires_at(expiry_time); - } - - /// Set the stream's expiry time relative to now. - /** - * This function sets the expiry time associated with the stream. Stream - * operations performed after this time (where the operations cannot be - * completed using the internal buffers) will fail with the error - * asio::error::operation_aborted. - * - * @param expiry_time The expiry time to be used for the timer. - */ - void expires_after(const duration& expiry_time) - { - rdbuf()->expires_after(expiry_time); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use expiry().) Get the stream's expiry time relative to now. - /** - * @return A relative time value representing the stream's expiry time. - */ - duration expires_from_now() const - { - return rdbuf()->expires_from_now(); - } - - /// (Deprecated: Use expires_after().) Set the stream's expiry time relative - /// to now. - /** - * This function sets the expiry time associated with the stream. Stream - * operations performed after this time (where the operations cannot be - * completed using the internal buffers) will fail with the error - * asio::error::operation_aborted. - * - * @param expiry_time The expiry time to be used for the timer. - */ - void expires_from_now(const duration& expiry_time) - { - rdbuf()->expires_from_now(expiry_time); - } -#endif // !defined(ASIO_NO_DEPRECATED) - -private: - // Disallow copying and assignment. - basic_socket_iostream(const basic_socket_iostream&) ASIO_DELETED; - basic_socket_iostream& operator=( - const basic_socket_iostream&) ASIO_DELETED; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_HAS_VARIADIC_TEMPLATES) -# undef ASIO_PRIVATE_CTR_DEF -# undef ASIO_PRIVATE_CONNECT_DEF -#endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_BASIC_SOCKET_IOSTREAM_HPP diff --git a/scout_sdk/asio/asio/basic_socket_streambuf.hpp b/scout_sdk/asio/asio/basic_socket_streambuf.hpp deleted file mode 100644 index 56a3637..0000000 --- a/scout_sdk/asio/asio/basic_socket_streambuf.hpp +++ /dev/null @@ -1,707 +0,0 @@ -// -// basic_socket_streambuf.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_STREAMBUF_HPP -#define ASIO_BASIC_SOCKET_STREAMBUF_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_NO_IOSTREAM) - -#include -#include -#include "asio/basic_socket.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/stream_socket_service.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) -# if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/deadline_timer_service.hpp" -# else // defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/detail/deadline_timer_service.hpp" -# endif // defined(ASIO_ENABLE_OLD_SERVICES) -#else // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) -# include "asio/steady_timer.hpp" -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - -#if !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -# include "asio/detail/variadic_templates.hpp" - -// A macro that should expand to: -// template -// basic_socket_streambuf* connect(T1 x1, ..., Tn xn) -// { -// init_buffers(); -// typedef typename Protocol::resolver resolver_type; -// resolver_type resolver(socket().get_executor().context()); -// connect_to_endpoints( -// resolver.resolve(x1, ..., xn, ec_)); -// return !ec_ ? this : 0; -// } -// This macro should only persist within this file. - -# define ASIO_PRIVATE_CONNECT_DEF(n) \ - template \ - basic_socket_streambuf* connect(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ - { \ - init_buffers(); \ - typedef typename Protocol::resolver resolver_type; \ - resolver_type resolver(socket().get_executor().context()); \ - connect_to_endpoints( \ - resolver.resolve(ASIO_VARIADIC_BYVAL_ARGS(n), ec_)); \ - return !ec_ ? this : 0; \ - } \ - /**/ - -#endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# define ASIO_SVC_T1 detail::deadline_timer_service -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// A separate base class is used to ensure that the io_context member is -// initialised prior to the basic_socket_streambuf's basic_socket base class. -class socket_streambuf_io_context -{ -protected: - socket_streambuf_io_context(io_context* ctx) - : default_io_context_(ctx) - { - } - - shared_ptr default_io_context_; -}; - -// A separate base class is used to ensure that the dynamically allocated -// buffers are constructed prior to the basic_socket_streambuf's basic_socket -// base class. This makes moving the socket is the last potentially throwing -// step in the streambuf's move constructor, giving the constructor a strong -// exception safety guarantee. -class socket_streambuf_buffers -{ -protected: - socket_streambuf_buffers() - : get_buffer_(buffer_size), - put_buffer_(buffer_size) - { - } - - enum { buffer_size = 512 }; - std::vector get_buffer_; - std::vector put_buffer_; -}; - -} // namespace detail - -#if !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) -#define ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL - -// Forward declaration with defaulted arguments. -template ), -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typename Clock = boost::posix_time::ptime, - typename WaitTraits = time_traits - ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> -#else // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typename Clock = chrono::steady_clock, - typename WaitTraits = wait_traits - ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) -class basic_socket_streambuf; - -#endif // !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) - -/// Iostream streambuf for a socket. -#if defined(GENERATING_DOCUMENTATION) -template > -#else // defined(GENERATING_DOCUMENTATION) -template -#endif // defined(GENERATING_DOCUMENTATION) -class basic_socket_streambuf - : public std::streambuf, - private detail::socket_streambuf_io_context, - private detail::socket_streambuf_buffers, -#if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - private basic_socket -#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - public basic_socket -#endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) -{ -private: - // These typedefs are intended keep this class's implementation independent - // of whether it's using Boost.DateClock, Boost.Chrono or std::chrono. -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typedef WaitTraits traits_helper; -#else // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - typedef detail::chrono_time_traits traits_helper; -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - -public: - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// The clock type. - typedef Clock clock_type; - -#if defined(GENERATING_DOCUMENTATION) - /// (Deprecated: Use time_point.) The time type. - typedef typename WaitTraits::time_type time_type; - - /// The time type. - typedef typename WaitTraits::time_point time_point; - - /// (Deprecated: Use duration.) The duration type. - typedef typename WaitTraits::duration_type duration_type; - - /// The duration type. - typedef typename WaitTraits::duration duration; -#else -# if !defined(ASIO_NO_DEPRECATED) - typedef typename traits_helper::time_type time_type; - typedef typename traits_helper::duration_type duration_type; -# endif // !defined(ASIO_NO_DEPRECATED) - typedef typename traits_helper::time_type time_point; - typedef typename traits_helper::duration_type duration; -#endif - - /// Construct a basic_socket_streambuf without establishing a connection. - basic_socket_streambuf() - : detail::socket_streambuf_io_context(new io_context), - basic_socket(*default_io_context_), - expiry_time_(max_expiry_time()) - { - init_buffers(); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Construct a basic_socket_streambuf from the supplied socket. - explicit basic_socket_streambuf(basic_stream_socket s) - : detail::socket_streambuf_io_context(0), - basic_socket(std::move(s)), - expiry_time_(max_expiry_time()) - { - init_buffers(); - } - - /// Move-construct a basic_socket_streambuf from another. - basic_socket_streambuf(basic_socket_streambuf&& other) - : detail::socket_streambuf_io_context(other), - basic_socket(std::move(other.socket())), - ec_(other.ec_), - expiry_time_(other.expiry_time_) - { - get_buffer_.swap(other.get_buffer_); - put_buffer_.swap(other.put_buffer_); - setg(other.eback(), other.gptr(), other.egptr()); - setp(other.pptr(), other.epptr()); - other.ec_ = asio::error_code(); - other.expiry_time_ = max_expiry_time(); - other.init_buffers(); - } - - /// Move-assign a basic_socket_streambuf from another. - basic_socket_streambuf& operator=(basic_socket_streambuf&& other) - { - this->close(); - socket() = std::move(other.socket()); - detail::socket_streambuf_io_context::operator=(other); - ec_ = other.ec_; - expiry_time_ = other.expiry_time_; - get_buffer_.swap(other.get_buffer_); - put_buffer_.swap(other.put_buffer_); - setg(other.eback(), other.gptr(), other.egptr()); - setp(other.pptr(), other.epptr()); - other.ec_ = asio::error_code(); - other.expiry_time_ = max_expiry_time(); - other.put_buffer_.resize(buffer_size); - other.init_buffers(); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destructor flushes buffered data. - virtual ~basic_socket_streambuf() - { - if (pptr() != pbase()) - overflow(traits_type::eof()); - } - - /// Establish a connection. - /** - * This function establishes a connection to the specified endpoint. - * - * @return \c this if a connection was successfully established, a null - * pointer otherwise. - */ - basic_socket_streambuf* connect(const endpoint_type& endpoint) - { - init_buffers(); - ec_ = asio::error_code(); - this->connect_to_endpoints(&endpoint, &endpoint + 1); - return !ec_ ? this : 0; - } - -#if defined(GENERATING_DOCUMENTATION) - /// Establish a connection. - /** - * This function automatically establishes a connection based on the supplied - * resolver query parameters. The arguments are used to construct a resolver - * query object. - * - * @return \c this if a connection was successfully established, a null - * pointer otherwise. - */ - template - basic_socket_streambuf* connect(T1 t1, ..., TN tn); -#elif defined(ASIO_HAS_VARIADIC_TEMPLATES) - template - basic_socket_streambuf* connect(T... x) - { - init_buffers(); - typedef typename Protocol::resolver resolver_type; - resolver_type resolver(socket().get_executor().context()); - connect_to_endpoints(resolver.resolve(x..., ec_)); - return !ec_ ? this : 0; - } -#else - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CONNECT_DEF) -#endif - - /// Close the connection. - /** - * @return \c this if a connection was successfully established, a null - * pointer otherwise. - */ - basic_socket_streambuf* close() - { - sync(); - socket().close(ec_); - if (!ec_) - init_buffers(); - return !ec_ ? this : 0; - } - - /// Get a reference to the underlying socket. - basic_socket& socket() - { - return *this; - } - - /// Get the last error associated with the stream buffer. - /** - * @return An \c error_code corresponding to the last error from the stream - * buffer. - */ - const asio::error_code& error() const - { - return ec_; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use error().) Get the last error associated with the stream - /// buffer. - /** - * @return An \c error_code corresponding to the last error from the stream - * buffer. - */ - const asio::error_code& puberror() const - { - return error(); - } - - /// (Deprecated: Use expiry().) Get the stream buffer's expiry time as an - /// absolute time. - /** - * @return An absolute time value representing the stream buffer's expiry - * time. - */ - time_point expires_at() const - { - return expiry_time_; - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the stream buffer's expiry time as an absolute time. - /** - * @return An absolute time value representing the stream buffer's expiry - * time. - */ - time_point expiry() const - { - return expiry_time_; - } - - /// Set the stream buffer's expiry time as an absolute time. - /** - * This function sets the expiry time associated with the stream. Stream - * operations performed after this time (where the operations cannot be - * completed using the internal buffers) will fail with the error - * asio::error::operation_aborted. - * - * @param expiry_time The expiry time to be used for the stream. - */ - void expires_at(const time_point& expiry_time) - { - expiry_time_ = expiry_time; - } - - /// Set the stream buffer's expiry time relative to now. - /** - * This function sets the expiry time associated with the stream. Stream - * operations performed after this time (where the operations cannot be - * completed using the internal buffers) will fail with the error - * asio::error::operation_aborted. - * - * @param expiry_time The expiry time to be used for the timer. - */ - void expires_after(const duration& expiry_time) - { - expiry_time_ = traits_helper::add(traits_helper::now(), expiry_time); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use expiry().) Get the stream buffer's expiry time relative - /// to now. - /** - * @return A relative time value representing the stream buffer's expiry time. - */ - duration expires_from_now() const - { - return traits_helper::subtract(expires_at(), traits_helper::now()); - } - - /// (Deprecated: Use expires_after().) Set the stream buffer's expiry time - /// relative to now. - /** - * This function sets the expiry time associated with the stream. Stream - * operations performed after this time (where the operations cannot be - * completed using the internal buffers) will fail with the error - * asio::error::operation_aborted. - * - * @param expiry_time The expiry time to be used for the timer. - */ - void expires_from_now(const duration& expiry_time) - { - expiry_time_ = traits_helper::add(traits_helper::now(), expiry_time); - } -#endif // !defined(ASIO_NO_DEPRECATED) - -protected: - int_type underflow() - { -#if defined(ASIO_WINDOWS_RUNTIME) - ec_ = asio::error::operation_not_supported; - return traits_type::eof(); -#else // defined(ASIO_WINDOWS_RUNTIME) - if (gptr() != egptr()) - return traits_type::eof(); - - for (;;) - { - // Check if we are past the expiry time. - if (traits_helper::less_than(expiry_time_, traits_helper::now())) - { - ec_ = asio::error::timed_out; - return traits_type::eof(); - } - - // Try to complete the operation without blocking. - if (!socket().native_non_blocking()) - socket().native_non_blocking(true, ec_); - detail::buffer_sequence_adapter - bufs(asio::buffer(get_buffer_) + putback_max); - detail::signed_size_type bytes = detail::socket_ops::recv( - socket().native_handle(), bufs.buffers(), bufs.count(), 0, ec_); - - // Check if operation succeeded. - if (bytes > 0) - { - setg(&get_buffer_[0], &get_buffer_[0] + putback_max, - &get_buffer_[0] + putback_max + bytes); - return traits_type::to_int_type(*gptr()); - } - - // Check for EOF. - if (bytes == 0) - { - ec_ = asio::error::eof; - return traits_type::eof(); - } - - // Operation failed. - if (ec_ != asio::error::would_block - && ec_ != asio::error::try_again) - return traits_type::eof(); - - // Wait for socket to become ready. - if (detail::socket_ops::poll_read( - socket().native_handle(), 0, timeout(), ec_) < 0) - return traits_type::eof(); - } -#endif // defined(ASIO_WINDOWS_RUNTIME) - } - - int_type overflow(int_type c) - { -#if defined(ASIO_WINDOWS_RUNTIME) - ec_ = asio::error::operation_not_supported; - return traits_type::eof(); -#else // defined(ASIO_WINDOWS_RUNTIME) - char_type ch = traits_type::to_char_type(c); - - // Determine what needs to be sent. - const_buffer output_buffer; - if (put_buffer_.empty()) - { - if (traits_type::eq_int_type(c, traits_type::eof())) - return traits_type::not_eof(c); // Nothing to do. - output_buffer = asio::buffer(&ch, sizeof(char_type)); - } - else - { - output_buffer = asio::buffer(pbase(), - (pptr() - pbase()) * sizeof(char_type)); - } - - while (output_buffer.size() > 0) - { - // Check if we are past the expiry time. - if (traits_helper::less_than(expiry_time_, traits_helper::now())) - { - ec_ = asio::error::timed_out; - return traits_type::eof(); - } - - // Try to complete the operation without blocking. - if (!socket().native_non_blocking()) - socket().native_non_blocking(true, ec_); - detail::buffer_sequence_adapter< - const_buffer, const_buffer> bufs(output_buffer); - detail::signed_size_type bytes = detail::socket_ops::send( - socket().native_handle(), bufs.buffers(), bufs.count(), 0, ec_); - - // Check if operation succeeded. - if (bytes > 0) - { - output_buffer += static_cast(bytes); - continue; - } - - // Operation failed. - if (ec_ != asio::error::would_block - && ec_ != asio::error::try_again) - return traits_type::eof(); - - // Wait for socket to become ready. - if (detail::socket_ops::poll_write( - socket().native_handle(), 0, timeout(), ec_) < 0) - return traits_type::eof(); - } - - if (!put_buffer_.empty()) - { - setp(&put_buffer_[0], &put_buffer_[0] + put_buffer_.size()); - - // If the new character is eof then our work here is done. - if (traits_type::eq_int_type(c, traits_type::eof())) - return traits_type::not_eof(c); - - // Add the new character to the output buffer. - *pptr() = ch; - pbump(1); - } - - return c; -#endif // defined(ASIO_WINDOWS_RUNTIME) - } - - int sync() - { - return overflow(traits_type::eof()); - } - - std::streambuf* setbuf(char_type* s, std::streamsize n) - { - if (pptr() == pbase() && s == 0 && n == 0) - { - put_buffer_.clear(); - setp(0, 0); - sync(); - return this; - } - - return 0; - } - -private: - // Disallow copying and assignment. - basic_socket_streambuf(const basic_socket_streambuf&) ASIO_DELETED; - basic_socket_streambuf& operator=( - const basic_socket_streambuf&) ASIO_DELETED; - - void init_buffers() - { - setg(&get_buffer_[0], - &get_buffer_[0] + putback_max, - &get_buffer_[0] + putback_max); - - if (put_buffer_.empty()) - setp(0, 0); - else - setp(&put_buffer_[0], &put_buffer_[0] + put_buffer_.size()); - } - - int timeout() const - { - int64_t msec = traits_helper::to_posix_duration( - traits_helper::subtract(expiry_time_, - traits_helper::now())).total_milliseconds(); - if (msec > (std::numeric_limits::max)()) - msec = (std::numeric_limits::max)(); - else if (msec < 0) - msec = 0; - return static_cast(msec); - } - - template - void connect_to_endpoints(const EndpointSequence& endpoints) - { - this->connect_to_endpoints(endpoints.begin(), endpoints.end()); - } - - template - void connect_to_endpoints(EndpointIterator begin, EndpointIterator end) - { -#if defined(ASIO_WINDOWS_RUNTIME) - ec_ = asio::error::operation_not_supported; -#else // defined(ASIO_WINDOWS_RUNTIME) - if (ec_) - return; - - ec_ = asio::error::not_found; - for (EndpointIterator i = begin; i != end; ++i) - { - // Check if we are past the expiry time. - if (traits_helper::less_than(expiry_time_, traits_helper::now())) - { - ec_ = asio::error::timed_out; - return; - } - - // Close and reopen the socket. - typename Protocol::endpoint ep(*i); - socket().close(ec_); - socket().open(ep.protocol(), ec_); - if (ec_) - continue; - - // Try to complete the operation without blocking. - if (!socket().native_non_blocking()) - socket().native_non_blocking(true, ec_); - detail::socket_ops::connect(socket().native_handle(), - ep.data(), ep.size(), ec_); - - // Check if operation succeeded. - if (!ec_) - return; - - // Operation failed. - if (ec_ != asio::error::in_progress - && ec_ != asio::error::would_block) - continue; - - // Wait for socket to become ready. - if (detail::socket_ops::poll_connect( - socket().native_handle(), timeout(), ec_) < 0) - continue; - - // Get the error code from the connect operation. - int connect_error = 0; - size_t connect_error_len = sizeof(connect_error); - if (detail::socket_ops::getsockopt(socket().native_handle(), 0, - SOL_SOCKET, SO_ERROR, &connect_error, &connect_error_len, ec_) - == detail::socket_error_retval) - return; - - // Check the result of the connect operation. - ec_ = asio::error_code(connect_error, - asio::error::get_system_category()); - if (!ec_) - return; - } -#endif // defined(ASIO_WINDOWS_RUNTIME) - } - - // Helper function to get the maximum expiry time. - static time_point max_expiry_time() - { -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - return boost::posix_time::pos_infin; -#else // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - return (time_point::max)(); -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // && defined(ASIO_USE_BOOST_DATE_TIME_FOR_SOCKET_IOSTREAM) - } - - enum { putback_max = 8 }; - asio::error_code ec_; - time_point expiry_time_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# undef ASIO_SVC_T1 -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#if !defined(ASIO_HAS_VARIADIC_TEMPLATES) -# undef ASIO_PRIVATE_CONNECT_DEF -#endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_BASIC_SOCKET_STREAMBUF_HPP diff --git a/scout_sdk/asio/asio/basic_stream_socket.hpp b/scout_sdk/asio/asio/basic_stream_socket.hpp deleted file mode 100644 index eea8862..0000000 --- a/scout_sdk/asio/asio/basic_stream_socket.hpp +++ /dev/null @@ -1,921 +0,0 @@ -// -// basic_stream_socket.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_STREAM_SOCKET_HPP -#define ASIO_BASIC_STREAM_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/basic_socket.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/stream_socket_service.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides stream-oriented socket functionality. -/** - * The basic_stream_socket class template provides asynchronous and blocking - * stream-oriented socket functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -template )> -class basic_stream_socket - : public basic_socket -{ -public: - /// The native representation of a socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename basic_socket< - Protocol ASIO_SVC_TARG>::native_handle_type native_handle_type; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct a basic_stream_socket without opening it. - /** - * This constructor creates a stream socket without opening it. The socket - * needs to be opened and then connected or accepted before data can be sent - * or received on it. - * - * @param io_context The io_context object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - */ - explicit basic_stream_socket(asio::io_context& io_context) - : basic_socket(io_context) - { - } - - /// Construct and open a basic_stream_socket. - /** - * This constructor creates and opens a stream socket. The socket needs to be - * connected or accepted before data can be sent or received on it. - * - * @param io_context The io_context object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::system_error Thrown on failure. - */ - basic_stream_socket(asio::io_context& io_context, - const protocol_type& protocol) - : basic_socket(io_context, protocol) - { - } - - /// Construct a basic_stream_socket, opening it and binding it to the given - /// local endpoint. - /** - * This constructor creates a stream socket and automatically opens it bound - * to the specified endpoint on the local machine. The protocol used is the - * protocol associated with the given endpoint. - * - * @param io_context The io_context object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param endpoint An endpoint on the local machine to which the stream - * socket will be bound. - * - * @throws asio::system_error Thrown on failure. - */ - basic_stream_socket(asio::io_context& io_context, - const endpoint_type& endpoint) - : basic_socket(io_context, endpoint) - { - } - - /// Construct a basic_stream_socket on an existing native socket. - /** - * This constructor creates a stream socket object to hold an existing native - * socket. - * - * @param io_context The io_context object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket The new underlying socket implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_stream_socket(asio::io_context& io_context, - const protocol_type& protocol, const native_handle_type& native_socket) - : basic_socket( - io_context, protocol, native_socket) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_stream_socket from another. - /** - * This constructor moves a stream socket from one object to another. - * - * @param other The other basic_stream_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_socket(io_context&) constructor. - */ - basic_stream_socket(basic_stream_socket&& other) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_stream_socket from another. - /** - * This assignment operator moves a stream socket from one object to another. - * - * @param other The other basic_stream_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_socket(io_context&) constructor. - */ - basic_stream_socket& operator=(basic_stream_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } - - /// Move-construct a basic_stream_socket from a socket of another protocol - /// type. - /** - * This constructor moves a stream socket from one object to another. - * - * @param other The other basic_stream_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_socket(io_context&) constructor. - */ - template - basic_stream_socket( - basic_stream_socket&& other, - typename enable_if::value>::type* = 0) - : basic_socket(std::move(other)) - { - } - - /// Move-assign a basic_stream_socket from a socket of another protocol type. - /** - * This assignment operator moves a stream socket from one object to another. - * - * @param other The other basic_stream_socket object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_socket(io_context&) constructor. - */ - template - typename enable_if::value, - basic_stream_socket>::type& operator=( - basic_stream_socket&& other) - { - basic_socket::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the socket. - /** - * This function destroys the socket, cancelling any outstanding asynchronous - * operations associated with the socket as if by calling @c cancel. - */ - ~basic_stream_socket() - { - } - - /// Send some data on the socket. - /** - * This function is used to send data on the stream socket. The function - * call will block until one or more bytes of the data has been sent - * successfully, or an until error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref write function if you need to ensure that all data - * is written before the blocking operation completes. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.send(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "send"); - return s; - } - - /// Send some data on the socket. - /** - * This function is used to send data on the stream socket. The function - * call will block until one or more bytes of the data has been sent - * successfully, or an until error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::system_error Thrown on failure. - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref write function if you need to ensure that all data - * is written before the blocking operation completes. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.send(asio::buffer(data, size), 0); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, flags, ec); - asio::detail::throw_error(ec, "send"); - return s; - } - - /// Send some data on the socket. - /** - * This function is used to send data on the stream socket. The function - * call will block until one or more bytes of the data has been sent - * successfully, or an until error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes sent. Returns 0 if an error occurred. - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref write function if you need to ensure that all data - * is written before the blocking operation completes. - */ - template - std::size_t send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return this->get_service().send( - this->get_implementation(), buffers, flags, ec); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send data on the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send( - this->get_implementation(), buffers, 0, - ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send( - this->get_implementation(), buffers, 0, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send data on the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), 0, handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send( - this->get_implementation(), buffers, flags, - ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send( - this->get_implementation(), buffers, flags, - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Receive some data on the socket. - /** - * This function is used to receive data on the stream socket. The function - * call will block until one or more bytes of data has been received - * successfully, or until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.receive(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on the socket. - /** - * This function is used to receive data on the stream socket. The function - * call will block until one or more bytes of data has been received - * successfully, or until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.receive(asio::buffer(data, size), 0); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags) - { - asio::error_code ec; - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, flags, ec); - asio::detail::throw_error(ec, "receive"); - return s; - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the stream socket. The function - * call will block until one or more bytes of data has been received - * successfully, or until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes received. Returns 0 if an error occurred. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - */ - template - std::size_t receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return this->get_service().receive( - this->get_implementation(), buffers, flags, ec); - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive data from the stream - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref async_read function if you need to ensure - * that the requested amount of data is received before the asynchronous - * operation completes. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive(this->get_implementation(), - buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive(this->get_implementation(), - buffers, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive data from the stream - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref async_read function if you need to ensure - * that the requested amount of data is received before the asynchronous - * operation completes. - * - * @par Example - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), 0, handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(const MutableBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive(this->get_implementation(), - buffers, flags, ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive(this->get_implementation(), - buffers, flags, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Write some data to the socket. - /** - * This function is used to write data to the stream socket. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the socket. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * socket.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().send( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "write_some"); - return s; - } - - /// Write some data to the socket. - /** - * This function is used to write data to the stream socket. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the socket. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().send(this->get_implementation(), buffers, 0, ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the socket. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_send(this->get_implementation(), - buffers, 0, ASIO_MOVE_CAST(WriteHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_send(this->get_implementation(), - buffers, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Read some data from the socket. - /** - * This function is used to read data from the stream socket. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * socket.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().receive( - this->get_implementation(), buffers, 0, ec); - asio::detail::throw_error(ec, "read_some"); - return s; - } - - /// Read some data from the socket. - /** - * This function is used to read data from the stream socket. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().receive( - this->get_implementation(), buffers, 0, ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_receive(this->get_implementation(), - buffers, 0, ASIO_MOVE_CAST(ReadHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_receive(this->get_implementation(), - buffers, 0, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_STREAM_SOCKET_HPP diff --git a/scout_sdk/asio/asio/basic_streambuf.hpp b/scout_sdk/asio/asio/basic_streambuf.hpp deleted file mode 100644 index 14f85d2..0000000 --- a/scout_sdk/asio/asio/basic_streambuf.hpp +++ /dev/null @@ -1,452 +0,0 @@ -// -// basic_streambuf.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_STREAMBUF_HPP -#define ASIO_BASIC_STREAMBUF_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_NO_IOSTREAM) - -#include -#include -#include -#include -#include -#include "asio/basic_streambuf_fwd.hpp" -#include "asio/buffer.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/throw_exception.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Automatically resizable buffer class based on std::streambuf. -/** - * The @c basic_streambuf class is derived from @c std::streambuf to associate - * the streambuf's input and output sequences with one or more character - * arrays. These character arrays are internal to the @c basic_streambuf - * object, but direct access to the array elements is provided to permit them - * to be used efficiently with I/O operations. Characters written to the output - * sequence of a @c basic_streambuf object are appended to the input sequence - * of the same object. - * - * The @c basic_streambuf class's public interface is intended to permit the - * following implementation strategies: - * - * @li A single contiguous character array, which is reallocated as necessary - * to accommodate changes in the size of the character sequence. This is the - * implementation approach currently used in Asio. - * - * @li A sequence of one or more character arrays, where each array is of the - * same size. Additional character array objects are appended to the sequence - * to accommodate changes in the size of the character sequence. - * - * @li A sequence of one or more character arrays of varying sizes. Additional - * character array objects are appended to the sequence to accommodate changes - * in the size of the character sequence. - * - * The constructor for basic_streambuf accepts a @c size_t argument specifying - * the maximum of the sum of the sizes of the input sequence and output - * sequence. During the lifetime of the @c basic_streambuf object, the following - * invariant holds: - * @code size() <= max_size()@endcode - * Any member function that would, if successful, cause the invariant to be - * violated shall throw an exception of class @c std::length_error. - * - * The constructor for @c basic_streambuf takes an Allocator argument. A copy - * of this argument is used for any memory allocation performed, by the - * constructor and by all member functions, during the lifetime of each @c - * basic_streambuf object. - * - * @par Examples - * Writing directly from an streambuf to a socket: - * @code - * asio::streambuf b; - * std::ostream os(&b); - * os << "Hello, World!\n"; - * - * // try sending some data in input sequence - * size_t n = sock.send(b.data()); - * - * b.consume(n); // sent data is removed from input sequence - * @endcode - * - * Reading from a socket directly into a streambuf: - * @code - * asio::streambuf b; - * - * // reserve 512 bytes in output sequence - * asio::streambuf::mutable_buffers_type bufs = b.prepare(512); - * - * size_t n = sock.receive(bufs); - * - * // received data is "committed" from output sequence to input sequence - * b.commit(n); - * - * std::istream is(&b); - * std::string s; - * is >> s; - * @endcode - */ -#if defined(GENERATING_DOCUMENTATION) -template > -#else -template -#endif -class basic_streambuf - : public std::streambuf, - private noncopyable -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The type used to represent the input sequence as a list of buffers. - typedef implementation_defined const_buffers_type; - - /// The type used to represent the output sequence as a list of buffers. - typedef implementation_defined mutable_buffers_type; -#else - typedef ASIO_CONST_BUFFER const_buffers_type; - typedef ASIO_MUTABLE_BUFFER mutable_buffers_type; -#endif - - /// Construct a basic_streambuf object. - /** - * Constructs a streambuf with the specified maximum size. The initial size - * of the streambuf's input sequence is 0. - */ - explicit basic_streambuf( - std::size_t maximum_size = (std::numeric_limits::max)(), - const Allocator& allocator = Allocator()) - : max_size_(maximum_size), - buffer_(allocator) - { - std::size_t pend = (std::min)(max_size_, buffer_delta); - buffer_.resize((std::max)(pend, 1)); - setg(&buffer_[0], &buffer_[0], &buffer_[0]); - setp(&buffer_[0], &buffer_[0] + pend); - } - - /// Get the size of the input sequence. - /** - * @returns The size of the input sequence. The value is equal to that - * calculated for @c s in the following code: - * @code - * size_t s = 0; - * const_buffers_type bufs = data(); - * const_buffers_type::const_iterator i = bufs.begin(); - * while (i != bufs.end()) - * { - * const_buffer buf(*i++); - * s += buf.size(); - * } - * @endcode - */ - std::size_t size() const ASIO_NOEXCEPT - { - return pptr() - gptr(); - } - - /// Get the maximum size of the basic_streambuf. - /** - * @returns The allowed maximum of the sum of the sizes of the input sequence - * and output sequence. - */ - std::size_t max_size() const ASIO_NOEXCEPT - { - return max_size_; - } - - /// Get the current capacity of the basic_streambuf. - /** - * @returns The current total capacity of the streambuf, i.e. for both the - * input sequence and output sequence. - */ - std::size_t capacity() const ASIO_NOEXCEPT - { - return buffer_.capacity(); - } - - /// Get a list of buffers that represents the input sequence. - /** - * @returns An object of type @c const_buffers_type that satisfies - * ConstBufferSequence requirements, representing all character arrays in the - * input sequence. - * - * @note The returned object is invalidated by any @c basic_streambuf member - * function that modifies the input sequence or output sequence. - */ - const_buffers_type data() const ASIO_NOEXCEPT - { - return asio::buffer(asio::const_buffer(gptr(), - (pptr() - gptr()) * sizeof(char_type))); - } - - /// Get a list of buffers that represents the output sequence, with the given - /// size. - /** - * Ensures that the output sequence can accommodate @c n characters, - * reallocating character array objects as necessary. - * - * @returns An object of type @c mutable_buffers_type that satisfies - * MutableBufferSequence requirements, representing character array objects - * at the start of the output sequence such that the sum of the buffer sizes - * is @c n. - * - * @throws std::length_error If size() + n > max_size(). - * - * @note The returned object is invalidated by any @c basic_streambuf member - * function that modifies the input sequence or output sequence. - */ - mutable_buffers_type prepare(std::size_t n) - { - reserve(n); - return asio::buffer(asio::mutable_buffer( - pptr(), n * sizeof(char_type))); - } - - /// Move characters from the output sequence to the input sequence. - /** - * Appends @c n characters from the start of the output sequence to the input - * sequence. The beginning of the output sequence is advanced by @c n - * characters. - * - * Requires a preceding call prepare(x) where x >= n, and - * no intervening operations that modify the input or output sequence. - * - * @note If @c n is greater than the size of the output sequence, the entire - * output sequence is moved to the input sequence and no error is issued. - */ - void commit(std::size_t n) - { - n = std::min(n, epptr() - pptr()); - pbump(static_cast(n)); - setg(eback(), gptr(), pptr()); - } - - /// Remove characters from the input sequence. - /** - * Removes @c n characters from the beginning of the input sequence. - * - * @note If @c n is greater than the size of the input sequence, the entire - * input sequence is consumed and no error is issued. - */ - void consume(std::size_t n) - { - if (egptr() < pptr()) - setg(&buffer_[0], gptr(), pptr()); - if (gptr() + n > pptr()) - n = pptr() - gptr(); - gbump(static_cast(n)); - } - -protected: - enum { buffer_delta = 128 }; - - /// Override std::streambuf behaviour. - /** - * Behaves according to the specification of @c std::streambuf::underflow(). - */ - int_type underflow() - { - if (gptr() < pptr()) - { - setg(&buffer_[0], gptr(), pptr()); - return traits_type::to_int_type(*gptr()); - } - else - { - return traits_type::eof(); - } - } - - /// Override std::streambuf behaviour. - /** - * Behaves according to the specification of @c std::streambuf::overflow(), - * with the specialisation that @c std::length_error is thrown if appending - * the character to the input sequence would require the condition - * size() > max_size() to be true. - */ - int_type overflow(int_type c) - { - if (!traits_type::eq_int_type(c, traits_type::eof())) - { - if (pptr() == epptr()) - { - std::size_t buffer_size = pptr() - gptr(); - if (buffer_size < max_size_ && max_size_ - buffer_size < buffer_delta) - { - reserve(max_size_ - buffer_size); - } - else - { - reserve(buffer_delta); - } - } - - *pptr() = traits_type::to_char_type(c); - pbump(1); - return c; - } - - return traits_type::not_eof(c); - } - - void reserve(std::size_t n) - { - // Get current stream positions as offsets. - std::size_t gnext = gptr() - &buffer_[0]; - std::size_t pnext = pptr() - &buffer_[0]; - std::size_t pend = epptr() - &buffer_[0]; - - // Check if there is already enough space in the put area. - if (n <= pend - pnext) - { - return; - } - - // Shift existing contents of get area to start of buffer. - if (gnext > 0) - { - pnext -= gnext; - std::memmove(&buffer_[0], &buffer_[0] + gnext, pnext); - } - - // Ensure buffer is large enough to hold at least the specified size. - if (n > pend - pnext) - { - if (n <= max_size_ && pnext <= max_size_ - n) - { - pend = pnext + n; - buffer_.resize((std::max)(pend, 1)); - } - else - { - std::length_error ex("asio::streambuf too long"); - asio::detail::throw_exception(ex); - } - } - - // Update stream positions. - setg(&buffer_[0], &buffer_[0], &buffer_[0] + pnext); - setp(&buffer_[0] + pnext, &buffer_[0] + pend); - } - -private: - std::size_t max_size_; - std::vector buffer_; - - // Helper function to get the preferred size for reading data. - friend std::size_t read_size_helper( - basic_streambuf& sb, std::size_t max_size) - { - return std::min( - std::max(512, sb.buffer_.capacity() - sb.size()), - std::min(max_size, sb.max_size() - sb.size())); - } -}; - -/// Adapts basic_streambuf to the dynamic buffer sequence type requirements. -#if defined(GENERATING_DOCUMENTATION) -template > -#else -template -#endif -class basic_streambuf_ref -{ -public: - /// The type used to represent the input sequence as a list of buffers. - typedef typename basic_streambuf::const_buffers_type - const_buffers_type; - - /// The type used to represent the output sequence as a list of buffers. - typedef typename basic_streambuf::mutable_buffers_type - mutable_buffers_type; - - /// Construct a basic_streambuf_ref for the given basic_streambuf object. - explicit basic_streambuf_ref(basic_streambuf& sb) - : sb_(sb) - { - } - - /// Copy construct a basic_streambuf_ref. - basic_streambuf_ref(const basic_streambuf_ref& other) ASIO_NOEXCEPT - : sb_(other.sb_) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move construct a basic_streambuf_ref. - basic_streambuf_ref(basic_streambuf_ref&& other) ASIO_NOEXCEPT - : sb_(other.sb_) - { - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Get the size of the input sequence. - std::size_t size() const ASIO_NOEXCEPT - { - return sb_.size(); - } - - /// Get the maximum size of the dynamic buffer. - std::size_t max_size() const ASIO_NOEXCEPT - { - return sb_.max_size(); - } - - /// Get the current capacity of the dynamic buffer. - std::size_t capacity() const ASIO_NOEXCEPT - { - return sb_.capacity(); - } - - /// Get a list of buffers that represents the input sequence. - const_buffers_type data() const ASIO_NOEXCEPT - { - return sb_.data(); - } - - /// Get a list of buffers that represents the output sequence, with the given - /// size. - mutable_buffers_type prepare(std::size_t n) - { - return sb_.prepare(n); - } - - /// Move bytes from the output sequence to the input sequence. - void commit(std::size_t n) - { - return sb_.commit(n); - } - - /// Remove characters from the input sequence. - void consume(std::size_t n) - { - return sb_.consume(n); - } - -private: - basic_streambuf& sb_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_BASIC_STREAMBUF_HPP diff --git a/scout_sdk/asio/asio/basic_streambuf_fwd.hpp b/scout_sdk/asio/asio/basic_streambuf_fwd.hpp deleted file mode 100644 index ed54fe9..0000000 --- a/scout_sdk/asio/asio/basic_streambuf_fwd.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// -// basic_streambuf_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_STREAMBUF_FWD_HPP -#define ASIO_BASIC_STREAMBUF_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_NO_IOSTREAM) - -#include - -namespace asio { - -template > -class basic_streambuf; - -template > -class basic_streambuf_ref; - -} // namespace asio - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_BASIC_STREAMBUF_FWD_HPP diff --git a/scout_sdk/asio/asio/basic_waitable_timer.hpp b/scout_sdk/asio/asio/basic_waitable_timer.hpp deleted file mode 100644 index 22b85a6..0000000 --- a/scout_sdk/asio/asio/basic_waitable_timer.hpp +++ /dev/null @@ -1,705 +0,0 @@ -// -// basic_waitable_timer.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_WAITABLE_TIMER_HPP -#define ASIO_BASIC_WAITABLE_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/wait_traits.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/waitable_timer_service.hpp" -#else // defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/detail/chrono_time_traits.hpp" -# include "asio/detail/deadline_timer_service.hpp" -# define ASIO_SVC_T \ - detail::deadline_timer_service< \ - detail::chrono_time_traits > -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) -#define ASIO_BASIC_WAITABLE_TIMER_FWD_DECL - -// Forward declaration with defaulted arguments. -template - ASIO_SVC_TPARAM_DEF2(= waitable_timer_service)> -class basic_waitable_timer; - -#endif // !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) - -/// Provides waitable timer functionality. -/** - * The basic_waitable_timer class template provides the ability to perform a - * blocking or asynchronous wait for a timer to expire. - * - * A waitable timer is always in one of two states: "expired" or "not expired". - * If the wait() or async_wait() function is called on an expired timer, the - * wait operation will complete immediately. - * - * Most applications will use one of the asio::steady_timer, - * asio::system_timer or asio::high_resolution_timer typedefs. - * - * @note This waitable timer functionality is for use with the C++11 standard - * library's @c <chrono> facility, or with the Boost.Chrono library. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Examples - * Performing a blocking wait (C++11): - * @code - * // Construct a timer without setting an expiry time. - * asio::steady_timer timer(io_context); - * - * // Set an expiry time relative to now. - * timer.expires_after(std::chrono::seconds(5)); - * - * // Wait for the timer to expire. - * timer.wait(); - * @endcode - * - * @par - * Performing an asynchronous wait (C++11): - * @code - * void handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Timer expired. - * } - * } - * - * ... - * - * // Construct a timer with an absolute expiry time. - * asio::steady_timer timer(io_context, - * std::chrono::steady_clock::now() + std::chrono::seconds(60)); - * - * // Start an asynchronous wait. - * timer.async_wait(handler); - * @endcode - * - * @par Changing an active waitable timer's expiry time - * - * Changing the expiry time of a timer while there are pending asynchronous - * waits causes those wait operations to be cancelled. To ensure that the action - * associated with the timer is performed only once, use something like this: - * used: - * - * @code - * void on_some_event() - * { - * if (my_timer.expires_after(seconds(5)) > 0) - * { - * // We managed to cancel the timer. Start new asynchronous wait. - * my_timer.async_wait(on_timeout); - * } - * else - * { - * // Too late, timer has already expired! - * } - * } - * - * void on_timeout(const asio::error_code& e) - * { - * if (e != asio::error::operation_aborted) - * { - * // Timer was not cancelled, take necessary action. - * } - * } - * @endcode - * - * @li The asio::basic_waitable_timer::expires_after() function - * cancels any pending asynchronous waits, and returns the number of - * asynchronous waits that were cancelled. If it returns 0 then you were too - * late and the wait handler has already been executed, or will soon be - * executed. If it returns 1 then the wait handler was successfully cancelled. - * - * @li If a wait handler is cancelled, the asio::error_code passed to - * it contains the value asio::error::operation_aborted. - */ -template -class basic_waitable_timer - : ASIO_SVC_ACCESS basic_io_object -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The clock type. - typedef Clock clock_type; - - /// The duration type of the clock. - typedef typename clock_type::duration duration; - - /// The time point type of the clock. - typedef typename clock_type::time_point time_point; - - /// The wait traits type. - typedef WaitTraits traits_type; - - /// Constructor. - /** - * This constructor creates a timer without setting an expiry time. The - * expires_at() or expires_after() functions must be called to set an expiry - * time before the timer can be waited on. - * - * @param io_context The io_context object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - */ - explicit basic_waitable_timer(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Constructor to set a particular expiry time as an absolute time. - /** - * This constructor creates a timer and sets the expiry time. - * - * @param io_context The io_context object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - * - * @param expiry_time The expiry time to be used for the timer, expressed - * as an absolute time. - */ - basic_waitable_timer(asio::io_context& io_context, - const time_point& expiry_time) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().expires_at(this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_at"); - } - - /// Constructor to set a particular expiry time relative to now. - /** - * This constructor creates a timer and sets the expiry time. - * - * @param io_context The io_context object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - * - * @param expiry_time The expiry time to be used for the timer, relative to - * now. - */ - basic_waitable_timer(asio::io_context& io_context, - const duration& expiry_time) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().expires_after( - this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_after"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_waitable_timer from another. - /** - * This constructor moves a timer from one object to another. - * - * @param other The other basic_waitable_timer object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_waitable_timer(io_context&) constructor. - */ - basic_waitable_timer(basic_waitable_timer&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign a basic_waitable_timer from another. - /** - * This assignment operator moves a timer from one object to another. Cancels - * any outstanding asynchronous operations associated with the target object. - * - * @param other The other basic_waitable_timer object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_waitable_timer(io_context&) constructor. - */ - basic_waitable_timer& operator=(basic_waitable_timer&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the timer. - /** - * This function destroys the timer, cancelling any outstanding asynchronous - * wait operations associated with the timer as if by calling @c cancel. - */ - ~basic_waitable_timer() - { - } - -#if defined(ASIO_ENABLE_OLD_SERVICES) - // These functions are provided by basic_io_object<>. -#else // defined(ASIO_ENABLE_OLD_SERVICES) -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - - /// Cancel any asynchronous operations that are waiting on the timer. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the timer. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @return The number of asynchronous operations that were cancelled. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel() - { - asio::error_code ec; - std::size_t s = this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - return s; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use non-error_code overload.) Cancel any asynchronous - /// operations that are waiting on the timer. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the timer. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. - * - * @note If the timer has already expired when cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel(asio::error_code& ec) - { - return this->get_service().cancel(this->get_implementation(), ec); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Cancels one asynchronous operation that is waiting on the timer. - /** - * This function forces the completion of one pending asynchronous wait - * operation against the timer. Handlers are cancelled in FIFO order. The - * handler for the cancelled operation will be invoked with the - * asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @return The number of asynchronous operations that were cancelled. That is, - * either 0 or 1. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when cancel_one() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel_one() - { - asio::error_code ec; - std::size_t s = this->get_service().cancel_one( - this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel_one"); - return s; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use non-error_code overload.) Cancels one asynchronous - /// operation that is waiting on the timer. - /** - * This function forces the completion of one pending asynchronous wait - * operation against the timer. Handlers are cancelled in FIFO order. The - * handler for the cancelled operation will be invoked with the - * asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. That is, - * either 0 or 1. - * - * @note If the timer has already expired when cancel_one() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t cancel_one(asio::error_code& ec) - { - return this->get_service().cancel_one(this->get_implementation(), ec); - } - - /// (Deprecated: Use expiry().) Get the timer's expiry time as an absolute - /// time. - /** - * This function may be used to obtain the timer's current expiry time. - * Whether the timer has expired or not does not affect this value. - */ - time_point expires_at() const - { - return this->get_service().expires_at(this->get_implementation()); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the timer's expiry time as an absolute time. - /** - * This function may be used to obtain the timer's current expiry time. - * Whether the timer has expired or not does not affect this value. - */ - time_point expiry() const - { - return this->get_service().expiry(this->get_implementation()); - } - - /// Set the timer's expiry time as an absolute time. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @return The number of asynchronous operations that were cancelled. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when expires_at() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_at(const time_point& expiry_time) - { - asio::error_code ec; - std::size_t s = this->get_service().expires_at( - this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_at"); - return s; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use non-error_code overload.) Set the timer's expiry time as - /// an absolute time. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. - * - * @note If the timer has already expired when expires_at() is called, then - * the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_at(const time_point& expiry_time, - asio::error_code& ec) - { - return this->get_service().expires_at( - this->get_implementation(), expiry_time, ec); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Set the timer's expiry time relative to now. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @return The number of asynchronous operations that were cancelled. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when expires_after() is called, - * then the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_after(const duration& expiry_time) - { - asio::error_code ec; - std::size_t s = this->get_service().expires_after( - this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_after"); - return s; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use expiry().) Get the timer's expiry time relative to now. - /** - * This function may be used to obtain the timer's current expiry time. - * Whether the timer has expired or not does not affect this value. - */ - duration expires_from_now() const - { - return this->get_service().expires_from_now(this->get_implementation()); - } - - /// (Deprecated: Use expires_after().) Set the timer's expiry time relative - /// to now. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @return The number of asynchronous operations that were cancelled. - * - * @throws asio::system_error Thrown on failure. - * - * @note If the timer has already expired when expires_from_now() is called, - * then the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_from_now(const duration& expiry_time) - { - asio::error_code ec; - std::size_t s = this->get_service().expires_from_now( - this->get_implementation(), expiry_time, ec); - asio::detail::throw_error(ec, "expires_from_now"); - return s; - } - - /// (Deprecated: Use expires_after().) Set the timer's expiry time relative - /// to now. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of asynchronous operations that were cancelled. - * - * @note If the timer has already expired when expires_from_now() is called, - * then the handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - std::size_t expires_from_now(const duration& expiry_time, - asio::error_code& ec) - { - return this->get_service().expires_from_now( - this->get_implementation(), expiry_time, ec); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Perform a blocking wait on the timer. - /** - * This function is used to wait for the timer to expire. This function - * blocks and does not return until the timer has expired. - * - * @throws asio::system_error Thrown on failure. - */ - void wait() - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Perform a blocking wait on the timer. - /** - * This function is used to wait for the timer to expire. This function - * blocks and does not return until the timer has expired. - * - * @param ec Set to indicate what error occurred, if any. - */ - void wait(asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), ec); - } - - /// Start an asynchronous wait on the timer. - /** - * This function may be used to initiate an asynchronous wait against the - * timer. It always returns immediately. - * - * For each call to async_wait(), the supplied handler will be called exactly - * once. The handler will be called when: - * - * @li The timer has expired. - * - * @li The timer was cancelled, in which case the handler is passed the error - * code asio::error::operation_aborted. - * - * @param handler The handler to be called when the timer expires. Copies - * will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(ASIO_MOVE_ARG(WaitHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WaitHandler. - ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_wait(this->get_implementation(), - ASIO_MOVE_CAST(WaitHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - async_completion init(handler); - - this->get_service().async_wait(this->get_implementation(), - init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - -private: - // Disallow copying and assignment. - basic_waitable_timer(const basic_waitable_timer&) ASIO_DELETED; - basic_waitable_timer& operator=( - const basic_waitable_timer&) ASIO_DELETED; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# undef ASIO_SVC_T -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_BASIC_WAITABLE_TIMER_HPP diff --git a/scout_sdk/asio/asio/bind_executor.hpp b/scout_sdk/asio/asio/bind_executor.hpp deleted file mode 100644 index 9e2094b..0000000 --- a/scout_sdk/asio/asio/bind_executor.hpp +++ /dev/null @@ -1,611 +0,0 @@ -// -// bind_executor.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BIND_EXECUTOR_HPP -#define ASIO_BIND_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/detail/variadic_templates.hpp" -#include "asio/associated_executor.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/async_result.hpp" -#include "asio/execution_context.hpp" -#include "asio/is_executor.hpp" -#include "asio/uses_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct executor_binder_check -{ - typedef void type; -}; - -// Helper to automatically define nested typedef result_type. - -template -struct executor_binder_result_type -{ -protected: - typedef void result_type_or_void; -}; - -template -struct executor_binder_result_type::type> -{ - typedef typename T::result_type result_type; -protected: - typedef result_type result_type_or_void; -}; - -template -struct executor_binder_result_type -{ - typedef R result_type; -protected: - typedef result_type result_type_or_void; -}; - -template -struct executor_binder_result_type -{ - typedef R result_type; -protected: - typedef result_type result_type_or_void; -}; - -template -struct executor_binder_result_type -{ - typedef R result_type; -protected: - typedef result_type result_type_or_void; -}; - -template -struct executor_binder_result_type -{ - typedef R result_type; -protected: - typedef result_type result_type_or_void; -}; - -template -struct executor_binder_result_type -{ - typedef R result_type; -protected: - typedef result_type result_type_or_void; -}; - -template -struct executor_binder_result_type -{ - typedef R result_type; -protected: - typedef result_type result_type_or_void; -}; - -// Helper to automatically define nested typedef argument_type. - -template -struct executor_binder_argument_type {}; - -template -struct executor_binder_argument_type::type> -{ - typedef typename T::argument_type argument_type; -}; - -template -struct executor_binder_argument_type -{ - typedef A1 argument_type; -}; - -template -struct executor_binder_argument_type -{ - typedef A1 argument_type; -}; - -// Helper to automatically define nested typedefs first_argument_type and -// second_argument_type. - -template -struct executor_binder_argument_types {}; - -template -struct executor_binder_argument_types::type> -{ - typedef typename T::first_argument_type first_argument_type; - typedef typename T::second_argument_type second_argument_type; -}; - -template -struct executor_binder_argument_type -{ - typedef A1 first_argument_type; - typedef A2 second_argument_type; -}; - -template -struct executor_binder_argument_type -{ - typedef A1 first_argument_type; - typedef A2 second_argument_type; -}; - -// Helper to: -// - Apply the empty base optimisation to the executor. -// - Perform uses_executor construction of the target type, if required. - -template -class executor_binder_base; - -template -class executor_binder_base - : protected Executor -{ -protected: - template - executor_binder_base(ASIO_MOVE_ARG(E) e, ASIO_MOVE_ARG(U) u) - : executor_(ASIO_MOVE_CAST(E)(e)), - target_(executor_arg_t(), executor_, ASIO_MOVE_CAST(U)(u)) - { - } - - Executor executor_; - T target_; -}; - -template -class executor_binder_base -{ -protected: - template - executor_binder_base(ASIO_MOVE_ARG(E) e, ASIO_MOVE_ARG(U) u) - : executor_(ASIO_MOVE_CAST(E)(e)), - target_(ASIO_MOVE_CAST(U)(u)) - { - } - - Executor executor_; - T target_; -}; - -// Helper to enable SFINAE on zero-argument operator() below. - -template -struct executor_binder_result_of0 -{ - typedef void type; -}; - -template -struct executor_binder_result_of0::type>::type> -{ - typedef typename result_of::type type; -}; - -} // namespace detail - -/// A call wrapper type to bind an executor of type @c Executor to an object of -/// type @c T. -template -class executor_binder -#if !defined(GENERATING_DOCUMENTATION) - : public detail::executor_binder_result_type, - public detail::executor_binder_argument_type, - public detail::executor_binder_argument_types, - private detail::executor_binder_base< - T, Executor, uses_executor::value> -#endif // !defined(GENERATING_DOCUMENTATION) -{ -public: - /// The type of the target object. - typedef T target_type; - - /// The type of the associated executor. - typedef Executor executor_type; - -#if defined(GENERATING_DOCUMENTATION) - /// The return type if a function. - /** - * The type of @c result_type is based on the type @c T of the wrapper's - * target object: - * - * @li if @c T is a pointer to function type, @c result_type is a synonym for - * the return type of @c T; - * - * @li if @c T is a class type with a member type @c result_type, then @c - * result_type is a synonym for @c T::result_type; - * - * @li otherwise @c result_type is not defined. - */ - typedef see_below result_type; - - /// The type of the function's argument. - /** - * The type of @c argument_type is based on the type @c T of the wrapper's - * target object: - * - * @li if @c T is a pointer to a function type accepting a single argument, - * @c argument_type is a synonym for the return type of @c T; - * - * @li if @c T is a class type with a member type @c argument_type, then @c - * argument_type is a synonym for @c T::argument_type; - * - * @li otherwise @c argument_type is not defined. - */ - typedef see_below argument_type; - - /// The type of the function's first argument. - /** - * The type of @c first_argument_type is based on the type @c T of the - * wrapper's target object: - * - * @li if @c T is a pointer to a function type accepting two arguments, @c - * first_argument_type is a synonym for the return type of @c T; - * - * @li if @c T is a class type with a member type @c first_argument_type, - * then @c first_argument_type is a synonym for @c T::first_argument_type; - * - * @li otherwise @c first_argument_type is not defined. - */ - typedef see_below first_argument_type; - - /// The type of the function's second argument. - /** - * The type of @c second_argument_type is based on the type @c T of the - * wrapper's target object: - * - * @li if @c T is a pointer to a function type accepting two arguments, @c - * second_argument_type is a synonym for the return type of @c T; - * - * @li if @c T is a class type with a member type @c first_argument_type, - * then @c second_argument_type is a synonym for @c T::second_argument_type; - * - * @li otherwise @c second_argument_type is not defined. - */ - typedef see_below second_argument_type; -#endif // defined(GENERATING_DOCUMENTATION) - - /// Construct an executor wrapper for the specified object. - /** - * This constructor is only valid if the type @c T is constructible from type - * @c U. - */ - template - executor_binder(executor_arg_t, const executor_type& e, - ASIO_MOVE_ARG(U) u) - : base_type(e, ASIO_MOVE_CAST(U)(u)) - { - } - - /// Copy constructor. - executor_binder(const executor_binder& other) - : base_type(other.get_executor(), other.get()) - { - } - - /// Construct a copy, but specify a different executor. - executor_binder(executor_arg_t, const executor_type& e, - const executor_binder& other) - : base_type(e, other.get()) - { - } - - /// Construct a copy of a different executor wrapper type. - /** - * This constructor is only valid if the @c Executor type is constructible - * from type @c OtherExecutor, and the type @c T is constructible from type - * @c U. - */ - template - executor_binder(const executor_binder& other) - : base_type(other.get_executor(), other.get()) - { - } - - /// Construct a copy of a different executor wrapper type, but specify a - /// different executor. - /** - * This constructor is only valid if the type @c T is constructible from type - * @c U. - */ - template - executor_binder(executor_arg_t, const executor_type& e, - const executor_binder& other) - : base_type(e, other.get()) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Move constructor. - executor_binder(executor_binder&& other) - : base_type(ASIO_MOVE_CAST(executor_type)(other.get_executor()), - ASIO_MOVE_CAST(T)(other.get())) - { - } - - /// Move construct the target object, but specify a different executor. - executor_binder(executor_arg_t, const executor_type& e, - executor_binder&& other) - : base_type(e, ASIO_MOVE_CAST(T)(other.get())) - { - } - - /// Move construct from a different executor wrapper type. - template - executor_binder(executor_binder&& other) - : base_type(ASIO_MOVE_CAST(OtherExecutor)(other.get_executor()), - ASIO_MOVE_CAST(U)(other.get())) - { - } - - /// Move construct from a different executor wrapper type, but specify a - /// different executor. - template - executor_binder(executor_arg_t, const executor_type& e, - executor_binder&& other) - : base_type(e, ASIO_MOVE_CAST(U)(other.get())) - { - } - -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destructor. - ~executor_binder() - { - } - - /// Obtain a reference to the target object. - target_type& get() ASIO_NOEXCEPT - { - return this->target_; - } - - /// Obtain a reference to the target object. - const target_type& get() const ASIO_NOEXCEPT - { - return this->target_; - } - - /// Obtain the associated executor. - executor_type get_executor() const ASIO_NOEXCEPT - { - return this->executor_; - } - -#if defined(GENERATING_DOCUMENTATION) - - template auto operator()(Args&& ...); - template auto operator()(Args&& ...) const; - -#elif defined(ASIO_HAS_VARIADIC_TEMPLATES) - - /// Forwarding function call operator. - template - typename result_of::type operator()( - ASIO_MOVE_ARG(Args)... args) - { - return this->target_(ASIO_MOVE_CAST(Args)(args)...); - } - - /// Forwarding function call operator. - template - typename result_of::type operator()( - ASIO_MOVE_ARG(Args)... args) const - { - return this->target_(ASIO_MOVE_CAST(Args)(args)...); - } - -#elif defined(ASIO_HAS_STD_TYPE_TRAITS) && !defined(_MSC_VER) - - typename detail::executor_binder_result_of0::type operator()() - { - return this->target_(); - } - - typename detail::executor_binder_result_of0::type operator()() const - { - return this->target_(); - } - -#define ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF(n) \ - template \ - typename result_of::type operator()( \ - ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ - } \ - \ - template \ - typename result_of::type operator()( \ - ASIO_VARIADIC_MOVE_PARAMS(n)) const \ - { \ - return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF) -#undef ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF - -#else // defined(ASIO_HAS_STD_TYPE_TRAITS) && !defined(_MSC_VER) - - typedef typename detail::executor_binder_result_type::result_type_or_void - result_type_or_void; - - result_type_or_void operator()() - { - return this->target_(); - } - - result_type_or_void operator()() const - { - return this->target_(); - } - -#define ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF(n) \ - template \ - result_type_or_void operator()( \ - ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ - } \ - \ - template \ - result_type_or_void operator()( \ - ASIO_VARIADIC_MOVE_PARAMS(n)) const \ - { \ - return this->target_(ASIO_VARIADIC_MOVE_ARGS(n)); \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF) -#undef ASIO_PRIVATE_BIND_EXECUTOR_CALL_DEF - -#endif // defined(ASIO_HAS_STD_TYPE_TRAITS) && !defined(_MSC_VER) - -private: - typedef detail::executor_binder_base::value> base_type; -}; - -/// Associate an object of type @c T with an executor of type @c Executor. -template -inline executor_binder::type, Executor> -bind_executor(const Executor& ex, ASIO_MOVE_ARG(T) t, - typename enable_if::value>::type* = 0) -{ - return executor_binder::type, Executor>( - executor_arg_t(), ex, ASIO_MOVE_CAST(T)(t)); -} - -/// Associate an object of type @c T with an execution context's executor. -template -inline executor_binder::type, - typename ExecutionContext::executor_type> -bind_executor(ExecutionContext& ctx, ASIO_MOVE_ARG(T) t, - typename enable_if::value>::type* = 0) -{ - return executor_binder::type, - typename ExecutionContext::executor_type>( - executor_arg_t(), ctx.get_executor(), ASIO_MOVE_CAST(T)(t)); -} - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct uses_executor, Executor> - : true_type {}; - -template -class async_result, Signature> -{ -public: - typedef executor_binder< - typename async_result::completion_handler_type, Executor> - completion_handler_type; - - typedef typename async_result::return_type return_type; - - explicit async_result(executor_binder& b) - : target_(b.get()) - { - } - - return_type get() - { - return target_.get(); - } - -private: - async_result(const async_result&) ASIO_DELETED; - async_result& operator=(const async_result&) ASIO_DELETED; - - async_result target_; -}; - -#if !defined(ASIO_NO_DEPRECATED) - -template -struct handler_type, Signature> -{ - typedef executor_binder< - typename handler_type::type, Executor> type; -}; - -template -class async_result > -{ -public: - typedef typename async_result::type type; - - explicit async_result(executor_binder& b) - : target_(b.get()) - { - } - - type get() - { - return target_.get(); - } - -private: - async_result target_; -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -struct associated_allocator, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const executor_binder& b, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(b.get(), a); - } -}; - -template -struct associated_executor, Executor1> -{ - typedef Executor type; - - static type get(const executor_binder& b, - const Executor1& = Executor1()) ASIO_NOEXCEPT - { - return b.get_executor(); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BIND_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/buffer.hpp b/scout_sdk/asio/asio/buffer.hpp deleted file mode 100644 index a9aa8aa..0000000 --- a/scout_sdk/asio/asio/buffer.hpp +++ /dev/null @@ -1,2162 +0,0 @@ -// -// buffer.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFER_HPP -#define ASIO_BUFFER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include -#include -#include -#include "asio/detail/array_fwd.hpp" -#include "asio/detail/is_buffer_sequence.hpp" -#include "asio/detail/string_view.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/detail/type_traits.hpp" - -#if defined(ASIO_MSVC) && (ASIO_MSVC >= 1700) -# if defined(_HAS_ITERATOR_DEBUGGING) && (_HAS_ITERATOR_DEBUGGING != 0) -# if !defined(ASIO_DISABLE_BUFFER_DEBUGGING) -# define ASIO_ENABLE_BUFFER_DEBUGGING -# endif // !defined(ASIO_DISABLE_BUFFER_DEBUGGING) -# endif // defined(_HAS_ITERATOR_DEBUGGING) -#endif // defined(ASIO_MSVC) && (ASIO_MSVC >= 1700) - -#if defined(__GNUC__) -# if defined(_GLIBCXX_DEBUG) -# if !defined(ASIO_DISABLE_BUFFER_DEBUGGING) -# define ASIO_ENABLE_BUFFER_DEBUGGING -# endif // !defined(ASIO_DISABLE_BUFFER_DEBUGGING) -# endif // defined(_GLIBCXX_DEBUG) -#endif // defined(__GNUC__) - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) -# include "asio/detail/functional.hpp" -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - -#if defined(ASIO_HAS_BOOST_WORKAROUND) -# include -# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) \ - || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) -# define ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND -# endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582)) - // || BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590)) -#endif // defined(ASIO_HAS_BOOST_WORKAROUND) - -#if defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) -# include "asio/detail/type_traits.hpp" -#endif // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -class mutable_buffer; -class const_buffer; - -/// Holds a buffer that can be modified. -/** - * The mutable_buffer class provides a safe representation of a buffer that can - * be modified. It does not own the underlying data, and so is cheap to copy or - * assign. - * - * @par Accessing Buffer Contents - * - * The contents of a buffer may be accessed using the @c data() and @c size() - * member functions: - * - * @code asio::mutable_buffer b1 = ...; - * std::size_t s1 = b1.size(); - * unsigned char* p1 = static_cast(b1.data()); - * @endcode - * - * The @c data() member function permits violations of type safety, so uses of - * it in application code should be carefully considered. - */ -class mutable_buffer -{ -public: - /// Construct an empty buffer. - mutable_buffer() ASIO_NOEXCEPT - : data_(0), - size_(0) - { - } - - /// Construct a buffer to represent a given memory range. - mutable_buffer(void* data, std::size_t size) ASIO_NOEXCEPT - : data_(data), - size_(size) - { - } - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - mutable_buffer(void* data, std::size_t size, - asio::detail::function debug_check) - : data_(data), - size_(size), - debug_check_(debug_check) - { - } - - const asio::detail::function& get_debug_check() const - { - return debug_check_; - } -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - - /// Get a pointer to the beginning of the memory range. - void* data() const ASIO_NOEXCEPT - { -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - if (size_ && debug_check_) - debug_check_(); -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - return data_; - } - - /// Get the size of the memory range. - std::size_t size() const ASIO_NOEXCEPT - { - return size_; - } - - /// Move the start of the buffer by the specified number of bytes. - mutable_buffer& operator+=(std::size_t n) ASIO_NOEXCEPT - { - std::size_t offset = n < size_ ? n : size_; - data_ = static_cast(data_) + offset; - size_ -= offset; - return *this; - } - -private: - void* data_; - std::size_t size_; - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - asio::detail::function debug_check_; -#endif // ASIO_ENABLE_BUFFER_DEBUGGING -}; - -#if !defined(ASIO_NO_DEPRECATED) - -/// (Deprecated: Use mutable_buffer.) Adapts a single modifiable buffer so that -/// it meets the requirements of the MutableBufferSequence concept. -class mutable_buffers_1 - : public mutable_buffer -{ -public: - /// The type for each element in the list of buffers. - typedef mutable_buffer value_type; - - /// A random-access iterator type that may be used to read elements. - typedef const mutable_buffer* const_iterator; - - /// Construct to represent a given memory range. - mutable_buffers_1(void* data, std::size_t size) ASIO_NOEXCEPT - : mutable_buffer(data, size) - { - } - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - mutable_buffers_1(void* data, std::size_t size, - asio::detail::function debug_check) - : mutable_buffer(data, size, debug_check) - { - } -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - - /// Construct to represent a single modifiable buffer. - explicit mutable_buffers_1(const mutable_buffer& b) ASIO_NOEXCEPT - : mutable_buffer(b) - { - } - - /// Get a random-access iterator to the first element. - const_iterator begin() const ASIO_NOEXCEPT - { - return this; - } - - /// Get a random-access iterator for one past the last element. - const_iterator end() const ASIO_NOEXCEPT - { - return begin() + 1; - } -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Holds a buffer that cannot be modified. -/** - * The const_buffer class provides a safe representation of a buffer that cannot - * be modified. It does not own the underlying data, and so is cheap to copy or - * assign. - * - * @par Accessing Buffer Contents - * - * The contents of a buffer may be accessed using the @c data() and @c size() - * member functions: - * - * @code asio::const_buffer b1 = ...; - * std::size_t s1 = b1.size(); - * const unsigned char* p1 = static_cast(b1.data()); - * @endcode - * - * The @c data() member function permits violations of type safety, so uses of - * it in application code should be carefully considered. - */ -class const_buffer -{ -public: - /// Construct an empty buffer. - const_buffer() ASIO_NOEXCEPT - : data_(0), - size_(0) - { - } - - /// Construct a buffer to represent a given memory range. - const_buffer(const void* data, std::size_t size) ASIO_NOEXCEPT - : data_(data), - size_(size) - { - } - - /// Construct a non-modifiable buffer from a modifiable one. - const_buffer(const mutable_buffer& b) ASIO_NOEXCEPT - : data_(b.data()), - size_(b.size()) -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , debug_check_(b.get_debug_check()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - { - } - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - const_buffer(const void* data, std::size_t size, - asio::detail::function debug_check) - : data_(data), - size_(size), - debug_check_(debug_check) - { - } - - const asio::detail::function& get_debug_check() const - { - return debug_check_; - } -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - - /// Get a pointer to the beginning of the memory range. - const void* data() const ASIO_NOEXCEPT - { -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - if (size_ && debug_check_) - debug_check_(); -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - return data_; - } - - /// Get the size of the memory range. - std::size_t size() const ASIO_NOEXCEPT - { - return size_; - } - - /// Move the start of the buffer by the specified number of bytes. - const_buffer& operator+=(std::size_t n) ASIO_NOEXCEPT - { - std::size_t offset = n < size_ ? n : size_; - data_ = static_cast(data_) + offset; - size_ -= offset; - return *this; - } - -private: - const void* data_; - std::size_t size_; - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - asio::detail::function debug_check_; -#endif // ASIO_ENABLE_BUFFER_DEBUGGING -}; - -#if !defined(ASIO_NO_DEPRECATED) - -/// (Deprecated: Use const_buffer.) Adapts a single non-modifiable buffer so -/// that it meets the requirements of the ConstBufferSequence concept. -class const_buffers_1 - : public const_buffer -{ -public: - /// The type for each element in the list of buffers. - typedef const_buffer value_type; - - /// A random-access iterator type that may be used to read elements. - typedef const const_buffer* const_iterator; - - /// Construct to represent a given memory range. - const_buffers_1(const void* data, std::size_t size) ASIO_NOEXCEPT - : const_buffer(data, size) - { - } - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - const_buffers_1(const void* data, std::size_t size, - asio::detail::function debug_check) - : const_buffer(data, size, debug_check) - { - } -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - - /// Construct to represent a single non-modifiable buffer. - explicit const_buffers_1(const const_buffer& b) ASIO_NOEXCEPT - : const_buffer(b) - { - } - - /// Get a random-access iterator to the first element. - const_iterator begin() const ASIO_NOEXCEPT - { - return this; - } - - /// Get a random-access iterator for one past the last element. - const_iterator end() const ASIO_NOEXCEPT - { - return begin() + 1; - } -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Trait to determine whether a type satisfies the MutableBufferSequence -/// requirements. -template -struct is_mutable_buffer_sequence -#if defined(GENERATING_DOCUMENTATION) - : integral_constant -#else // defined(GENERATING_DOCUMENTATION) - : asio::detail::is_buffer_sequence -#endif // defined(GENERATING_DOCUMENTATION) -{ -}; - -/// Trait to determine whether a type satisfies the ConstBufferSequence -/// requirements. -template -struct is_const_buffer_sequence -#if defined(GENERATING_DOCUMENTATION) - : integral_constant -#else // defined(GENERATING_DOCUMENTATION) - : asio::detail::is_buffer_sequence -#endif // defined(GENERATING_DOCUMENTATION) -{ -}; - -/// Trait to determine whether a type satisfies the DynamicBuffer requirements. -template -struct is_dynamic_buffer -#if defined(GENERATING_DOCUMENTATION) - : integral_constant -#else // defined(GENERATING_DOCUMENTATION) - : asio::detail::is_dynamic_buffer -#endif // defined(GENERATING_DOCUMENTATION) -{ -}; - -/// (Deprecated: Use the socket/descriptor wait() and async_wait() member -/// functions.) An implementation of both the ConstBufferSequence and -/// MutableBufferSequence concepts to represent a null buffer sequence. -class null_buffers -{ -public: - /// The type for each element in the list of buffers. - typedef mutable_buffer value_type; - - /// A random-access iterator type that may be used to read elements. - typedef const mutable_buffer* const_iterator; - - /// Get a random-access iterator to the first element. - const_iterator begin() const ASIO_NOEXCEPT - { - return &buf_; - } - - /// Get a random-access iterator for one past the last element. - const_iterator end() const ASIO_NOEXCEPT - { - return &buf_; - } - -private: - mutable_buffer buf_; -}; - -/** @defgroup buffer_sequence_begin asio::buffer_sequence_begin - * - * @brief The asio::buffer_sequence_begin function returns an iterator - * pointing to the first element in a buffer sequence. - */ -/*@{*/ - -/// Get an iterator to the first element in a buffer sequence. -inline const mutable_buffer* buffer_sequence_begin(const mutable_buffer& b) -{ - return &b; -} - -/// Get an iterator to the first element in a buffer sequence. -inline const const_buffer* buffer_sequence_begin(const const_buffer& b) -{ - return &b; -} - -#if defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) - -/// Get an iterator to the first element in a buffer sequence. -template -inline auto buffer_sequence_begin(C& c) -> decltype(c.begin()) -{ - return c.begin(); -} - -/// Get an iterator to the first element in a buffer sequence. -template -inline auto buffer_sequence_begin(const C& c) -> decltype(c.begin()) -{ - return c.begin(); -} - -#else // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) - -template -inline typename C::iterator buffer_sequence_begin(C& c) -{ - return c.begin(); -} - -template -inline typename C::const_iterator buffer_sequence_begin(const C& c) -{ - return c.begin(); -} - -#endif // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) - -/*@}*/ - -/** @defgroup buffer_sequence_end asio::buffer_sequence_end - * - * @brief The asio::buffer_sequence_end function returns an iterator - * pointing to one past the end element in a buffer sequence. - */ -/*@{*/ - -/// Get an iterator to one past the end element in a buffer sequence. -inline const mutable_buffer* buffer_sequence_end(const mutable_buffer& b) -{ - return &b + 1; -} - -/// Get an iterator to one past the end element in a buffer sequence. -inline const const_buffer* buffer_sequence_end(const const_buffer& b) -{ - return &b + 1; -} - -#if defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) - -/// Get an iterator to one past the end element in a buffer sequence. -template -inline auto buffer_sequence_end(C& c) -> decltype(c.end()) -{ - return c.end(); -} - -/// Get an iterator to one past the end element in a buffer sequence. -template -inline auto buffer_sequence_end(const C& c) -> decltype(c.end()) -{ - return c.end(); -} - -#else // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) - -template -inline typename C::iterator buffer_sequence_end(C& c) -{ - return c.end(); -} - -template -inline typename C::const_iterator buffer_sequence_end(const C& c) -{ - return c.end(); -} - -#endif // defined(ASIO_HAS_DECLTYPE) || defined(GENERATING_DOCUMENTATION) - -/*@}*/ - -namespace detail { - -// Tag types used to select appropriately optimised overloads. -struct one_buffer {}; -struct multiple_buffers {}; - -// Helper trait to detect single buffers. -template -struct buffer_sequence_cardinality : - conditional< - is_same::value -#if !defined(ASIO_NO_DEPRECATED) - || is_same::value - || is_same::value -#endif // !defined(ASIO_NO_DEPRECATED) - || is_same::value, - one_buffer, multiple_buffers>::type {}; - -template -inline std::size_t buffer_size(one_buffer, - Iterator begin, Iterator) ASIO_NOEXCEPT -{ - return const_buffer(*begin).size(); -} - -template -inline std::size_t buffer_size(multiple_buffers, - Iterator begin, Iterator end) ASIO_NOEXCEPT -{ - std::size_t total_buffer_size = 0; - - Iterator iter = begin; - for (; iter != end; ++iter) - { - const_buffer b(*iter); - total_buffer_size += b.size(); - } - - return total_buffer_size; -} - -} // namespace detail - -/// Get the total number of bytes in a buffer sequence. -/** - * The @c buffer_size function determines the total size of all buffers in the - * buffer sequence, as if computed as follows: - * - * @code size_t total_size = 0; - * auto i = asio::buffer_sequence_begin(buffers); - * auto end = asio::buffer_sequence_end(buffers); - * for (; i != end; ++i) - * { - * const_buffer b(*i); - * total_size += b.size(); - * } - * return total_size; @endcode - * - * The @c BufferSequence template parameter may meet either of the @c - * ConstBufferSequence or @c MutableBufferSequence type requirements. - */ -template -inline std::size_t buffer_size(const BufferSequence& b) ASIO_NOEXCEPT -{ - return detail::buffer_size( - detail::buffer_sequence_cardinality(), - asio::buffer_sequence_begin(b), - asio::buffer_sequence_end(b)); -} - -#if !defined(ASIO_NO_DEPRECATED) - -/** @defgroup buffer_cast asio::buffer_cast - * - * @brief (Deprecated: Use the @c data() member function.) The - * asio::buffer_cast function is used to obtain a pointer to the - * underlying memory region associated with a buffer. - * - * @par Examples: - * - * To access the memory of a non-modifiable buffer, use: - * @code asio::const_buffer b1 = ...; - * const unsigned char* p1 = asio::buffer_cast(b1); - * @endcode - * - * To access the memory of a modifiable buffer, use: - * @code asio::mutable_buffer b2 = ...; - * unsigned char* p2 = asio::buffer_cast(b2); - * @endcode - * - * The asio::buffer_cast function permits violations of type safety, so - * uses of it in application code should be carefully considered. - */ -/*@{*/ - -/// Cast a non-modifiable buffer to a specified pointer to POD type. -template -inline PointerToPodType buffer_cast(const mutable_buffer& b) ASIO_NOEXCEPT -{ - return static_cast(b.data()); -} - -/// Cast a non-modifiable buffer to a specified pointer to POD type. -template -inline PointerToPodType buffer_cast(const const_buffer& b) ASIO_NOEXCEPT -{ - return static_cast(b.data()); -} - -/*@}*/ - -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Create a new modifiable buffer that is offset from the start of another. -/** - * @relates mutable_buffer - */ -inline mutable_buffer operator+(const mutable_buffer& b, - std::size_t n) ASIO_NOEXCEPT -{ - std::size_t offset = n < b.size() ? n : b.size(); - char* new_data = static_cast(b.data()) + offset; - std::size_t new_size = b.size() - offset; - return mutable_buffer(new_data, new_size -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , b.get_debug_check() -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new modifiable buffer that is offset from the start of another. -/** - * @relates mutable_buffer - */ -inline mutable_buffer operator+(std::size_t n, - const mutable_buffer& b) ASIO_NOEXCEPT -{ - return b + n; -} - -/// Create a new non-modifiable buffer that is offset from the start of another. -/** - * @relates const_buffer - */ -inline const_buffer operator+(const const_buffer& b, - std::size_t n) ASIO_NOEXCEPT -{ - std::size_t offset = n < b.size() ? n : b.size(); - const char* new_data = static_cast(b.data()) + offset; - std::size_t new_size = b.size() - offset; - return const_buffer(new_data, new_size -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , b.get_debug_check() -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new non-modifiable buffer that is offset from the start of another. -/** - * @relates const_buffer - */ -inline const_buffer operator+(std::size_t n, - const const_buffer& b) ASIO_NOEXCEPT -{ - return b + n; -} - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) -namespace detail { - -template -class buffer_debug_check -{ -public: - buffer_debug_check(Iterator iter) - : iter_(iter) - { - } - - ~buffer_debug_check() - { -#if defined(ASIO_MSVC) && (ASIO_MSVC == 1400) - // MSVC 8's string iterator checking may crash in a std::string::iterator - // object's destructor when the iterator points to an already-destroyed - // std::string object, unless the iterator is cleared first. - iter_ = Iterator(); -#endif // defined(ASIO_MSVC) && (ASIO_MSVC == 1400) - } - - void operator()() - { - (void)*iter_; - } - -private: - Iterator iter_; -}; - -} // namespace detail -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - -/** @defgroup buffer asio::buffer - * - * @brief The asio::buffer function is used to create a buffer object to - * represent raw memory, an array of POD elements, a vector of POD elements, - * or a std::string. - * - * A buffer object represents a contiguous region of memory as a 2-tuple - * consisting of a pointer and size in bytes. A tuple of the form {void*, - * size_t} specifies a mutable (modifiable) region of memory. Similarly, a - * tuple of the form {const void*, size_t} specifies a const - * (non-modifiable) region of memory. These two forms correspond to the classes - * mutable_buffer and const_buffer, respectively. To mirror C++'s conversion - * rules, a mutable_buffer is implicitly convertible to a const_buffer, and the - * opposite conversion is not permitted. - * - * The simplest use case involves reading or writing a single buffer of a - * specified size: - * - * @code sock.send(asio::buffer(data, size)); @endcode - * - * In the above example, the return value of asio::buffer meets the - * requirements of the ConstBufferSequence concept so that it may be directly - * passed to the socket's write function. A buffer created for modifiable - * memory also meets the requirements of the MutableBufferSequence concept. - * - * An individual buffer may be created from a builtin array, std::vector, - * std::array or boost::array of POD elements. This helps prevent buffer - * overruns by automatically determining the size of the buffer: - * - * @code char d1[128]; - * size_t bytes_transferred = sock.receive(asio::buffer(d1)); - * - * std::vector d2(128); - * bytes_transferred = sock.receive(asio::buffer(d2)); - * - * std::array d3; - * bytes_transferred = sock.receive(asio::buffer(d3)); - * - * boost::array d4; - * bytes_transferred = sock.receive(asio::buffer(d4)); @endcode - * - * In all three cases above, the buffers created are exactly 128 bytes long. - * Note that a vector is @e never automatically resized when creating or using - * a buffer. The buffer size is determined using the vector's size() - * member function, and not its capacity. - * - * @par Accessing Buffer Contents - * - * The contents of a buffer may be accessed using the @c data() and @c size() - * member functions: - * - * @code asio::mutable_buffer b1 = ...; - * std::size_t s1 = b1.size(); - * unsigned char* p1 = static_cast(b1.data()); - * - * asio::const_buffer b2 = ...; - * std::size_t s2 = b2.size(); - * const void* p2 = b2.data(); @endcode - * - * The @c data() member function permits violations of type safety, so - * uses of it in application code should be carefully considered. - * - * For convenience, a @ref buffer_size function is provided that works with - * both buffers and buffer sequences (that is, types meeting the - * ConstBufferSequence or MutableBufferSequence type requirements). In this - * case, the function returns the total size of all buffers in the sequence. - * - * @par Buffer Copying - * - * The @ref buffer_copy function may be used to copy raw bytes between - * individual buffers and buffer sequences. -* - * In particular, when used with the @ref buffer_size function, the @ref - * buffer_copy function can be used to linearise a sequence of buffers. For - * example: - * - * @code vector buffers = ...; - * - * vector data(asio::buffer_size(buffers)); - * asio::buffer_copy(asio::buffer(data), buffers); @endcode - * - * Note that @ref buffer_copy is implemented in terms of @c memcpy, and - * consequently it cannot be used to copy between overlapping memory regions. - * - * @par Buffer Invalidation - * - * A buffer object does not have any ownership of the memory it refers to. It - * is the responsibility of the application to ensure the memory region remains - * valid until it is no longer required for an I/O operation. When the memory - * is no longer available, the buffer is said to have been invalidated. - * - * For the asio::buffer overloads that accept an argument of type - * std::vector, the buffer objects returned are invalidated by any vector - * operation that also invalidates all references, pointers and iterators - * referring to the elements in the sequence (C++ Std, 23.2.4) - * - * For the asio::buffer overloads that accept an argument of type - * std::basic_string, the buffer objects returned are invalidated according to - * the rules defined for invalidation of references, pointers and iterators - * referring to elements of the sequence (C++ Std, 21.3). - * - * @par Buffer Arithmetic - * - * Buffer objects may be manipulated using simple arithmetic in a safe way - * which helps prevent buffer overruns. Consider an array initialised as - * follows: - * - * @code boost::array a = { 'a', 'b', 'c', 'd', 'e' }; @endcode - * - * A buffer object @c b1 created using: - * - * @code b1 = asio::buffer(a); @endcode - * - * represents the entire array, { 'a', 'b', 'c', 'd', 'e' }. An - * optional second argument to the asio::buffer function may be used to - * limit the size, in bytes, of the buffer: - * - * @code b2 = asio::buffer(a, 3); @endcode - * - * such that @c b2 represents the data { 'a', 'b', 'c' }. Even if the - * size argument exceeds the actual size of the array, the size of the buffer - * object created will be limited to the array size. - * - * An offset may be applied to an existing buffer to create a new one: - * - * @code b3 = b1 + 2; @endcode - * - * where @c b3 will set to represent { 'c', 'd', 'e' }. If the offset - * exceeds the size of the existing buffer, the newly created buffer will be - * empty. - * - * Both an offset and size may be specified to create a buffer that corresponds - * to a specific range of bytes within an existing buffer: - * - * @code b4 = asio::buffer(b1 + 1, 3); @endcode - * - * so that @c b4 will refer to the bytes { 'b', 'c', 'd' }. - * - * @par Buffers and Scatter-Gather I/O - * - * To read or write using multiple buffers (i.e. scatter-gather I/O), multiple - * buffer objects may be assigned into a container that supports the - * MutableBufferSequence (for read) or ConstBufferSequence (for write) concepts: - * - * @code - * char d1[128]; - * std::vector d2(128); - * boost::array d3; - * - * boost::array bufs1 = { - * asio::buffer(d1), - * asio::buffer(d2), - * asio::buffer(d3) }; - * bytes_transferred = sock.receive(bufs1); - * - * std::vector bufs2; - * bufs2.push_back(asio::buffer(d1)); - * bufs2.push_back(asio::buffer(d2)); - * bufs2.push_back(asio::buffer(d3)); - * bytes_transferred = sock.send(bufs2); @endcode - */ -/*@{*/ - -#if defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) -# define ASIO_MUTABLE_BUFFER mutable_buffer -# define ASIO_CONST_BUFFER const_buffer -#else // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) -# define ASIO_MUTABLE_BUFFER mutable_buffers_1 -# define ASIO_CONST_BUFFER const_buffers_1 -#endif // defined(ASIO_NO_DEPRECATED) || defined(GENERATING_DOCUMENTATION) - -/// Create a new modifiable buffer from an existing buffer. -/** - * @returns mutable_buffer(b). - */ -inline ASIO_MUTABLE_BUFFER buffer( - const mutable_buffer& b) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(b); -} - -/// Create a new modifiable buffer from an existing buffer. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * b.data(), - * min(b.size(), max_size_in_bytes)); @endcode - */ -inline ASIO_MUTABLE_BUFFER buffer(const mutable_buffer& b, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER( - mutable_buffer(b.data(), - b.size() < max_size_in_bytes - ? b.size() : max_size_in_bytes -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , b.get_debug_check() -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - )); -} - -/// Create a new non-modifiable buffer from an existing buffer. -/** - * @returns const_buffer(b). - */ -inline ASIO_CONST_BUFFER buffer( - const const_buffer& b) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(b); -} - -/// Create a new non-modifiable buffer from an existing buffer. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * b.data(), - * min(b.size(), max_size_in_bytes)); @endcode - */ -inline ASIO_CONST_BUFFER buffer(const const_buffer& b, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(b.data(), - b.size() < max_size_in_bytes - ? b.size() : max_size_in_bytes -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , b.get_debug_check() -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new modifiable buffer that represents the given memory range. -/** - * @returns mutable_buffer(data, size_in_bytes). - */ -inline ASIO_MUTABLE_BUFFER buffer(void* data, - std::size_t size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data, size_in_bytes); -} - -/// Create a new non-modifiable buffer that represents the given memory range. -/** - * @returns const_buffer(data, size_in_bytes). - */ -inline ASIO_CONST_BUFFER buffer(const void* data, - std::size_t size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data, size_in_bytes); -} - -/// Create a new modifiable buffer that represents the given POD array. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * static_cast(data), - * N * sizeof(PodType)); @endcode - */ -template -inline ASIO_MUTABLE_BUFFER buffer(PodType (&data)[N]) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data, N * sizeof(PodType)); -} - -/// Create a new modifiable buffer that represents the given POD array. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * static_cast(data), - * min(N * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_MUTABLE_BUFFER buffer(PodType (&data)[N], - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data, - N * sizeof(PodType) < max_size_in_bytes - ? N * sizeof(PodType) : max_size_in_bytes); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * static_cast(data), - * N * sizeof(PodType)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer( - const PodType (&data)[N]) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data, N * sizeof(PodType)); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * static_cast(data), - * min(N * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer(const PodType (&data)[N], - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data, - N * sizeof(PodType) < max_size_in_bytes - ? N * sizeof(PodType) : max_size_in_bytes); -} - -#if defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) - -// Borland C++ and Sun Studio think the overloads: -// -// unspecified buffer(boost::array& array ...); -// -// and -// -// unspecified buffer(boost::array& array ...); -// -// are ambiguous. This will be worked around by using a buffer_types traits -// class that contains typedefs for the appropriate buffer and container -// classes, based on whether PodType is const or non-const. - -namespace detail { - -template -struct buffer_types_base; - -template <> -struct buffer_types_base -{ - typedef mutable_buffer buffer_type; - typedef ASIO_MUTABLE_BUFFER container_type; -}; - -template <> -struct buffer_types_base -{ - typedef const_buffer buffer_type; - typedef ASIO_CONST_BUFFER container_type; -}; - -template -struct buffer_types - : public buffer_types_base::value> -{ -}; - -} // namespace detail - -template -inline typename detail::buffer_types::container_type -buffer(boost::array& data) ASIO_NOEXCEPT -{ - typedef typename asio::detail::buffer_types::buffer_type - buffer_type; - typedef typename asio::detail::buffer_types::container_type - container_type; - return container_type( - buffer_type(data.c_array(), data.size() * sizeof(PodType))); -} - -template -inline typename detail::buffer_types::container_type -buffer(boost::array& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - typedef typename asio::detail::buffer_types::buffer_type - buffer_type; - typedef typename asio::detail::buffer_types::container_type - container_type; - return container_type( - buffer_type(data.c_array(), - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes)); -} - -#else // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) - -/// Create a new modifiable buffer that represents the given POD array. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.data(), - * data.size() * sizeof(PodType)); @endcode - */ -template -inline ASIO_MUTABLE_BUFFER buffer( - boost::array& data) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER( - data.c_array(), data.size() * sizeof(PodType)); -} - -/// Create a new modifiable buffer that represents the given POD array. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.data(), - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_MUTABLE_BUFFER buffer(boost::array& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data.c_array(), - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * data.size() * sizeof(PodType)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer( - boost::array& data) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer(boost::array& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes); -} - -#endif // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND) - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * data.size() * sizeof(PodType)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer( - const boost::array& data) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer(const boost::array& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes); -} - -#if defined(ASIO_HAS_STD_ARRAY) || defined(GENERATING_DOCUMENTATION) - -/// Create a new modifiable buffer that represents the given POD array. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.data(), - * data.size() * sizeof(PodType)); @endcode - */ -template -inline ASIO_MUTABLE_BUFFER buffer( - std::array& data) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data.data(), data.size() * sizeof(PodType)); -} - -/// Create a new modifiable buffer that represents the given POD array. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.data(), - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_MUTABLE_BUFFER buffer(std::array& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data.data(), - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * data.size() * sizeof(PodType)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer( - std::array& data) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer(std::array& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * data.size() * sizeof(PodType)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer( - const std::array& data) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(PodType)); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer(const std::array& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes); -} - -#endif // defined(ASIO_HAS_STD_ARRAY) || defined(GENERATING_DOCUMENTATION) - -/// Create a new modifiable buffer that represents the given POD vector. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.size() ? &data[0] : 0, - * data.size() * sizeof(PodType)); @endcode - * - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline ASIO_MUTABLE_BUFFER buffer( - std::vector& data) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER( - data.size() ? &data[0] : 0, data.size() * sizeof(PodType) -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::vector::iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new modifiable buffer that represents the given POD vector. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.size() ? &data[0] : 0, - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - * - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline ASIO_MUTABLE_BUFFER buffer(std::vector& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data.size() ? &data[0] : 0, - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::vector::iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new non-modifiable buffer that represents the given POD vector. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.size() ? &data[0] : 0, - * data.size() * sizeof(PodType)); @endcode - * - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline ASIO_CONST_BUFFER buffer( - const std::vector& data) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER( - data.size() ? &data[0] : 0, data.size() * sizeof(PodType) -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::vector::const_iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new non-modifiable buffer that represents the given POD vector. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.size() ? &data[0] : 0, - * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode - * - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline ASIO_CONST_BUFFER buffer( - const std::vector& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.size() ? &data[0] : 0, - data.size() * sizeof(PodType) < max_size_in_bytes - ? data.size() * sizeof(PodType) : max_size_in_bytes -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::vector::const_iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new modifiable buffer that represents the given string. -/** - * @returns mutable_buffer(data.size() ? &data[0] : 0, - * data.size() * sizeof(Elem)). - * - * @note The buffer is invalidated by any non-const operation called on the - * given string object. - */ -template -inline ASIO_MUTABLE_BUFFER buffer( - std::basic_string& data) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data.size() ? &data[0] : 0, - data.size() * sizeof(Elem) -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::basic_string::iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new non-modifiable buffer that represents the given string. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.size() ? &data[0] : 0, - * min(data.size() * sizeof(Elem), max_size_in_bytes)); @endcode - * - * @note The buffer is invalidated by any non-const operation called on the - * given string object. - */ -template -inline ASIO_MUTABLE_BUFFER buffer( - std::basic_string& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_MUTABLE_BUFFER(data.size() ? &data[0] : 0, - data.size() * sizeof(Elem) < max_size_in_bytes - ? data.size() * sizeof(Elem) : max_size_in_bytes -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::basic_string::iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new non-modifiable buffer that represents the given string. -/** - * @returns const_buffer(data.data(), data.size() * sizeof(Elem)). - * - * @note The buffer is invalidated by any non-const operation called on the - * given string object. - */ -template -inline ASIO_CONST_BUFFER buffer( - const std::basic_string& data) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), data.size() * sizeof(Elem) -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::basic_string::const_iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new non-modifiable buffer that represents the given string. -/** - * @returns A const_buffer value equivalent to: - * @code const_buffer( - * data.data(), - * min(data.size() * sizeof(Elem), max_size_in_bytes)); @endcode - * - * @note The buffer is invalidated by any non-const operation called on the - * given string object. - */ -template -inline ASIO_CONST_BUFFER buffer( - const std::basic_string& data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.data(), - data.size() * sizeof(Elem) < max_size_in_bytes - ? data.size() * sizeof(Elem) : max_size_in_bytes -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename std::basic_string::const_iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -#if defined(ASIO_HAS_STRING_VIEW) \ - || defined(GENERATING_DOCUMENTATION) - -/// Create a new modifiable buffer that represents the given string_view. -/** - * @returns mutable_buffer(data.size() ? &data[0] : 0, - * data.size() * sizeof(Elem)). - */ -template -inline ASIO_CONST_BUFFER buffer( - basic_string_view data) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.size() ? &data[0] : 0, - data.size() * sizeof(Elem) -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename basic_string_view::iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -/// Create a new non-modifiable buffer that represents the given string. -/** - * @returns A mutable_buffer value equivalent to: - * @code mutable_buffer( - * data.size() ? &data[0] : 0, - * min(data.size() * sizeof(Elem), max_size_in_bytes)); @endcode - */ -template -inline ASIO_CONST_BUFFER buffer( - basic_string_view data, - std::size_t max_size_in_bytes) ASIO_NOEXCEPT -{ - return ASIO_CONST_BUFFER(data.size() ? &data[0] : 0, - data.size() * sizeof(Elem) < max_size_in_bytes - ? data.size() * sizeof(Elem) : max_size_in_bytes -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - , detail::buffer_debug_check< - typename basic_string_view::iterator - >(data.begin()) -#endif // ASIO_ENABLE_BUFFER_DEBUGGING - ); -} - -#endif // defined(ASIO_HAS_STRING_VIEW) - // || defined(GENERATING_DOCUMENTATION) - -/*@}*/ - -/// Adapt a basic_string to the DynamicBuffer requirements. -/** - * Requires that sizeof(Elem) == 1. - */ -template -class dynamic_string_buffer -{ -public: - /// The type used to represent the input sequence as a list of buffers. - typedef ASIO_CONST_BUFFER const_buffers_type; - - /// The type used to represent the output sequence as a list of buffers. - typedef ASIO_MUTABLE_BUFFER mutable_buffers_type; - - /// Construct a dynamic buffer from a string. - /** - * @param s The string to be used as backing storage for the dynamic buffer. - * Any existing data in the string is treated as the dynamic buffer's input - * sequence. The object stores a reference to the string and the user is - * responsible for ensuring that the string object remains valid until the - * dynamic_string_buffer object is destroyed. - * - * @param maximum_size Specifies a maximum size for the buffer, in bytes. - */ - explicit dynamic_string_buffer(std::basic_string& s, - std::size_t maximum_size = - (std::numeric_limits::max)()) ASIO_NOEXCEPT - : string_(s), - size_(string_.size()), - max_size_(maximum_size) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move construct a dynamic buffer. - dynamic_string_buffer(dynamic_string_buffer&& other) ASIO_NOEXCEPT - : string_(other.string_), - size_(other.size_), - max_size_(other.max_size_) - { - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Get the size of the input sequence. - std::size_t size() const ASIO_NOEXCEPT - { - return size_; - } - - /// Get the maximum size of the dynamic buffer. - /** - * @returns The allowed maximum of the sum of the sizes of the input sequence - * and output sequence. - */ - std::size_t max_size() const ASIO_NOEXCEPT - { - return max_size_; - } - - /// Get the current capacity of the dynamic buffer. - /** - * @returns The current total capacity of the buffer, i.e. for both the input - * sequence and output sequence. - */ - std::size_t capacity() const ASIO_NOEXCEPT - { - return string_.capacity(); - } - - /// Get a list of buffers that represents the input sequence. - /** - * @returns An object of type @c const_buffers_type that satisfies - * ConstBufferSequence requirements, representing the basic_string memory in - * input sequence. - * - * @note The returned object is invalidated by any @c dynamic_string_buffer - * or @c basic_string member function that modifies the input sequence or - * output sequence. - */ - const_buffers_type data() const ASIO_NOEXCEPT - { - return const_buffers_type(asio::buffer(string_, size_)); - } - - /// Get a list of buffers that represents the output sequence, with the given - /// size. - /** - * Ensures that the output sequence can accommodate @c n bytes, resizing the - * basic_string object as necessary. - * - * @returns An object of type @c mutable_buffers_type that satisfies - * MutableBufferSequence requirements, representing basic_string memory - * at the start of the output sequence of size @c n. - * - * @throws std::length_error If size() + n > max_size(). - * - * @note The returned object is invalidated by any @c dynamic_string_buffer - * or @c basic_string member function that modifies the input sequence or - * output sequence. - */ - mutable_buffers_type prepare(std::size_t n) - { - if (size () > max_size() || max_size() - size() < n) - { - std::length_error ex("dynamic_string_buffer too long"); - asio::detail::throw_exception(ex); - } - - string_.resize(size_ + n); - - return asio::buffer(asio::buffer(string_) + size_, n); - } - - /// Move bytes from the output sequence to the input sequence. - /** - * @param n The number of bytes to append from the start of the output - * sequence to the end of the input sequence. The remainder of the output - * sequence is discarded. - * - * Requires a preceding call prepare(x) where x >= n, and - * no intervening operations that modify the input or output sequence. - * - * @note If @c n is greater than the size of the output sequence, the entire - * output sequence is moved to the input sequence and no error is issued. - */ - void commit(std::size_t n) - { - size_ += (std::min)(n, string_.size() - size_); - string_.resize(size_); - } - - /// Remove characters from the input sequence. - /** - * Removes @c n characters from the beginning of the input sequence. - * - * @note If @c n is greater than the size of the input sequence, the entire - * input sequence is consumed and no error is issued. - */ - void consume(std::size_t n) - { - std::size_t consume_length = (std::min)(n, size_); - string_.erase(0, consume_length); - size_ -= consume_length; - } - -private: - std::basic_string& string_; - std::size_t size_; - const std::size_t max_size_; -}; - -/// Adapt a vector to the DynamicBuffer requirements. -/** - * Requires that sizeof(Elem) == 1. - */ -template -class dynamic_vector_buffer -{ -public: - /// The type used to represent the input sequence as a list of buffers. - typedef ASIO_CONST_BUFFER const_buffers_type; - - /// The type used to represent the output sequence as a list of buffers. - typedef ASIO_MUTABLE_BUFFER mutable_buffers_type; - - /// Construct a dynamic buffer from a string. - /** - * @param v The vector to be used as backing storage for the dynamic buffer. - * Any existing data in the vector is treated as the dynamic buffer's input - * sequence. The object stores a reference to the vector and the user is - * responsible for ensuring that the vector object remains valid until the - * dynamic_vector_buffer object is destroyed. - * - * @param maximum_size Specifies a maximum size for the buffer, in bytes. - */ - explicit dynamic_vector_buffer(std::vector& v, - std::size_t maximum_size = - (std::numeric_limits::max)()) ASIO_NOEXCEPT - : vector_(v), - size_(vector_.size()), - max_size_(maximum_size) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move construct a dynamic buffer. - dynamic_vector_buffer(dynamic_vector_buffer&& other) ASIO_NOEXCEPT - : vector_(other.vector_), - size_(other.size_), - max_size_(other.max_size_) - { - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Get the size of the input sequence. - std::size_t size() const ASIO_NOEXCEPT - { - return size_; - } - - /// Get the maximum size of the dynamic buffer. - /** - * @returns The allowed maximum of the sum of the sizes of the input sequence - * and output sequence. - */ - std::size_t max_size() const ASIO_NOEXCEPT - { - return max_size_; - } - - /// Get the current capacity of the dynamic buffer. - /** - * @returns The current total capacity of the buffer, i.e. for both the input - * sequence and output sequence. - */ - std::size_t capacity() const ASIO_NOEXCEPT - { - return vector_.capacity(); - } - - /// Get a list of buffers that represents the input sequence. - /** - * @returns An object of type @c const_buffers_type that satisfies - * ConstBufferSequence requirements, representing the basic_string memory in - * input sequence. - * - * @note The returned object is invalidated by any @c dynamic_vector_buffer - * or @c basic_string member function that modifies the input sequence or - * output sequence. - */ - const_buffers_type data() const ASIO_NOEXCEPT - { - return const_buffers_type(asio::buffer(vector_, size_)); - } - - /// Get a list of buffers that represents the output sequence, with the given - /// size. - /** - * Ensures that the output sequence can accommodate @c n bytes, resizing the - * basic_string object as necessary. - * - * @returns An object of type @c mutable_buffers_type that satisfies - * MutableBufferSequence requirements, representing basic_string memory - * at the start of the output sequence of size @c n. - * - * @throws std::length_error If size() + n > max_size(). - * - * @note The returned object is invalidated by any @c dynamic_vector_buffer - * or @c basic_string member function that modifies the input sequence or - * output sequence. - */ - mutable_buffers_type prepare(std::size_t n) - { - if (size () > max_size() || max_size() - size() < n) - { - std::length_error ex("dynamic_vector_buffer too long"); - asio::detail::throw_exception(ex); - } - - vector_.resize(size_ + n); - - return asio::buffer(asio::buffer(vector_) + size_, n); - } - - /// Move bytes from the output sequence to the input sequence. - /** - * @param n The number of bytes to append from the start of the output - * sequence to the end of the input sequence. The remainder of the output - * sequence is discarded. - * - * Requires a preceding call prepare(x) where x >= n, and - * no intervening operations that modify the input or output sequence. - * - * @note If @c n is greater than the size of the output sequence, the entire - * output sequence is moved to the input sequence and no error is issued. - */ - void commit(std::size_t n) - { - size_ += (std::min)(n, vector_.size() - size_); - vector_.resize(size_); - } - - /// Remove characters from the input sequence. - /** - * Removes @c n characters from the beginning of the input sequence. - * - * @note If @c n is greater than the size of the input sequence, the entire - * input sequence is consumed and no error is issued. - */ - void consume(std::size_t n) - { - std::size_t consume_length = (std::min)(n, size_); - vector_.erase(vector_.begin(), vector_.begin() + consume_length); - size_ -= consume_length; - } - -private: - std::vector& vector_; - std::size_t size_; - const std::size_t max_size_; -}; - -/** @defgroup dynamic_buffer asio::dynamic_buffer - * - * @brief The asio::dynamic_buffer function is used to create a - * dynamically resized buffer from a @c std::basic_string or @c std::vector. - */ -/*@{*/ - -/// Create a new dynamic buffer that represents the given string. -/** - * @returns dynamic_string_buffer(data). - */ -template -inline dynamic_string_buffer dynamic_buffer( - std::basic_string& data) ASIO_NOEXCEPT -{ - return dynamic_string_buffer(data); -} - -/// Create a new dynamic buffer that represents the given string. -/** - * @returns dynamic_string_buffer(data, - * max_size). - */ -template -inline dynamic_string_buffer dynamic_buffer( - std::basic_string& data, - std::size_t max_size) ASIO_NOEXCEPT -{ - return dynamic_string_buffer(data, max_size); -} - -/// Create a new dynamic buffer that represents the given vector. -/** - * @returns dynamic_vector_buffer(data). - */ -template -inline dynamic_vector_buffer dynamic_buffer( - std::vector& data) ASIO_NOEXCEPT -{ - return dynamic_vector_buffer(data); -} - -/// Create a new dynamic buffer that represents the given vector. -/** - * @returns dynamic_vector_buffer(data, max_size). - */ -template -inline dynamic_vector_buffer dynamic_buffer( - std::vector& data, - std::size_t max_size) ASIO_NOEXCEPT -{ - return dynamic_vector_buffer(data, max_size); -} - -/*@}*/ - -/** @defgroup buffer_copy asio::buffer_copy - * - * @brief The asio::buffer_copy function is used to copy bytes from a - * source buffer (or buffer sequence) to a target buffer (or buffer sequence). - * - * The @c buffer_copy function is available in two forms: - * - * @li A 2-argument form: @c buffer_copy(target, source) - * - * @li A 3-argument form: @c buffer_copy(target, source, max_bytes_to_copy) - * - * Both forms return the number of bytes actually copied. The number of bytes - * copied is the lesser of: - * - * @li @c buffer_size(target) - * - * @li @c buffer_size(source) - * - * @li @c If specified, @c max_bytes_to_copy. - * - * This prevents buffer overflow, regardless of the buffer sizes used in the - * copy operation. - * - * Note that @ref buffer_copy is implemented in terms of @c memcpy, and - * consequently it cannot be used to copy between overlapping memory regions. - */ -/*@{*/ - -namespace detail { - -inline std::size_t buffer_copy_1(const mutable_buffer& target, - const const_buffer& source) -{ - using namespace std; // For memcpy. - std::size_t target_size = target.size(); - std::size_t source_size = source.size(); - std::size_t n = target_size < source_size ? target_size : source_size; - if (n > 0) - memcpy(target.data(), source.data(), n); - return n; -} - -template -inline std::size_t buffer_copy(one_buffer, one_buffer, - TargetIterator target_begin, TargetIterator, - SourceIterator source_begin, SourceIterator) ASIO_NOEXCEPT -{ - return (buffer_copy_1)(*target_begin, *source_begin); -} - -template -inline std::size_t buffer_copy(one_buffer, one_buffer, - TargetIterator target_begin, TargetIterator, - SourceIterator source_begin, SourceIterator, - std::size_t max_bytes_to_copy) ASIO_NOEXCEPT -{ - return (buffer_copy_1)(*target_begin, - asio::buffer(*source_begin, max_bytes_to_copy)); -} - -template -std::size_t buffer_copy(one_buffer, multiple_buffers, - TargetIterator target_begin, TargetIterator, - SourceIterator source_begin, SourceIterator source_end, - std::size_t max_bytes_to_copy - = (std::numeric_limits::max)()) ASIO_NOEXCEPT -{ - std::size_t total_bytes_copied = 0; - SourceIterator source_iter = source_begin; - - for (mutable_buffer target_buffer( - asio::buffer(*target_begin, max_bytes_to_copy)); - target_buffer.size() && source_iter != source_end; ++source_iter) - { - const_buffer source_buffer(*source_iter); - std::size_t bytes_copied = (buffer_copy_1)(target_buffer, source_buffer); - total_bytes_copied += bytes_copied; - target_buffer += bytes_copied; - } - - return total_bytes_copied; -} - -template -std::size_t buffer_copy(multiple_buffers, one_buffer, - TargetIterator target_begin, TargetIterator target_end, - SourceIterator source_begin, SourceIterator, - std::size_t max_bytes_to_copy - = (std::numeric_limits::max)()) ASIO_NOEXCEPT -{ - std::size_t total_bytes_copied = 0; - TargetIterator target_iter = target_begin; - - for (const_buffer source_buffer( - asio::buffer(*source_begin, max_bytes_to_copy)); - source_buffer.size() && target_iter != target_end; ++target_iter) - { - mutable_buffer target_buffer(*target_iter); - std::size_t bytes_copied = (buffer_copy_1)(target_buffer, source_buffer); - total_bytes_copied += bytes_copied; - source_buffer += bytes_copied; - } - - return total_bytes_copied; -} - -template -std::size_t buffer_copy(multiple_buffers, multiple_buffers, - TargetIterator target_begin, TargetIterator target_end, - SourceIterator source_begin, SourceIterator source_end) ASIO_NOEXCEPT -{ - std::size_t total_bytes_copied = 0; - - TargetIterator target_iter = target_begin; - std::size_t target_buffer_offset = 0; - - SourceIterator source_iter = source_begin; - std::size_t source_buffer_offset = 0; - - while (target_iter != target_end && source_iter != source_end) - { - mutable_buffer target_buffer = - mutable_buffer(*target_iter) + target_buffer_offset; - - const_buffer source_buffer = - const_buffer(*source_iter) + source_buffer_offset; - - std::size_t bytes_copied = (buffer_copy_1)(target_buffer, source_buffer); - total_bytes_copied += bytes_copied; - - if (bytes_copied == target_buffer.size()) - { - ++target_iter; - target_buffer_offset = 0; - } - else - target_buffer_offset += bytes_copied; - - if (bytes_copied == source_buffer.size()) - { - ++source_iter; - source_buffer_offset = 0; - } - else - source_buffer_offset += bytes_copied; - } - - return total_bytes_copied; -} - -template -std::size_t buffer_copy(multiple_buffers, multiple_buffers, - TargetIterator target_begin, TargetIterator target_end, - SourceIterator source_begin, SourceIterator source_end, - std::size_t max_bytes_to_copy) ASIO_NOEXCEPT -{ - std::size_t total_bytes_copied = 0; - - TargetIterator target_iter = target_begin; - std::size_t target_buffer_offset = 0; - - SourceIterator source_iter = source_begin; - std::size_t source_buffer_offset = 0; - - while (total_bytes_copied != max_bytes_to_copy - && target_iter != target_end && source_iter != source_end) - { - mutable_buffer target_buffer = - mutable_buffer(*target_iter) + target_buffer_offset; - - const_buffer source_buffer = - const_buffer(*source_iter) + source_buffer_offset; - - std::size_t bytes_copied = (buffer_copy_1)( - target_buffer, asio::buffer(source_buffer, - max_bytes_to_copy - total_bytes_copied)); - total_bytes_copied += bytes_copied; - - if (bytes_copied == target_buffer.size()) - { - ++target_iter; - target_buffer_offset = 0; - } - else - target_buffer_offset += bytes_copied; - - if (bytes_copied == source_buffer.size()) - { - ++source_iter; - source_buffer_offset = 0; - } - else - source_buffer_offset += bytes_copied; - } - - return total_bytes_copied; -} - -} // namespace detail - -/// Copies bytes from a source buffer sequence to a target buffer sequence. -/** - * @param target A modifiable buffer sequence representing the memory regions to - * which the bytes will be copied. - * - * @param source A non-modifiable buffer sequence representing the memory - * regions from which the bytes will be copied. - * - * @returns The number of bytes copied. - * - * @note The number of bytes copied is the lesser of: - * - * @li @c buffer_size(target) - * - * @li @c buffer_size(source) - * - * This function is implemented in terms of @c memcpy, and consequently it - * cannot be used to copy between overlapping memory regions. - */ -template -inline std::size_t buffer_copy(const MutableBufferSequence& target, - const ConstBufferSequence& source) ASIO_NOEXCEPT -{ - return detail::buffer_copy( - detail::buffer_sequence_cardinality(), - detail::buffer_sequence_cardinality(), - asio::buffer_sequence_begin(target), - asio::buffer_sequence_end(target), - asio::buffer_sequence_begin(source), - asio::buffer_sequence_end(source)); -} - -/// Copies a limited number of bytes from a source buffer sequence to a target -/// buffer sequence. -/** - * @param target A modifiable buffer sequence representing the memory regions to - * which the bytes will be copied. - * - * @param source A non-modifiable buffer sequence representing the memory - * regions from which the bytes will be copied. - * - * @param max_bytes_to_copy The maximum number of bytes to be copied. - * - * @returns The number of bytes copied. - * - * @note The number of bytes copied is the lesser of: - * - * @li @c buffer_size(target) - * - * @li @c buffer_size(source) - * - * @li @c max_bytes_to_copy - * - * This function is implemented in terms of @c memcpy, and consequently it - * cannot be used to copy between overlapping memory regions. - */ -template -inline std::size_t buffer_copy(const MutableBufferSequence& target, - const ConstBufferSequence& source, - std::size_t max_bytes_to_copy) ASIO_NOEXCEPT -{ - return detail::buffer_copy( - detail::buffer_sequence_cardinality(), - detail::buffer_sequence_cardinality(), - asio::buffer_sequence_begin(target), - asio::buffer_sequence_end(target), - asio::buffer_sequence_begin(source), - asio::buffer_sequence_end(source), max_bytes_to_copy); -} - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFER_HPP diff --git a/scout_sdk/asio/asio/buffered_read_stream.hpp b/scout_sdk/asio/asio/buffered_read_stream.hpp deleted file mode 100644 index c3e7f0b..0000000 --- a/scout_sdk/asio/asio/buffered_read_stream.hpp +++ /dev/null @@ -1,257 +0,0 @@ -// -// buffered_read_stream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_READ_STREAM_HPP -#define ASIO_BUFFERED_READ_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/buffered_read_stream_fwd.hpp" -#include "asio/buffer.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_resize_guard.hpp" -#include "asio/detail/buffered_stream_storage.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Adds buffering to the read-related operations of a stream. -/** - * The buffered_read_stream class template can be used to add buffering to the - * synchronous and asynchronous read operations of a stream. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -template -class buffered_read_stream - : private noncopyable -{ -public: - /// The type of the next layer. - typedef typename remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type of the executor associated with the object. - typedef typename lowest_layer_type::executor_type executor_type; - -#if defined(GENERATING_DOCUMENTATION) - /// The default buffer size. - static const std::size_t default_buffer_size = implementation_defined; -#else - ASIO_STATIC_CONSTANT(std::size_t, default_buffer_size = 1024); -#endif - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_read_stream(Arg& a) - : next_layer_(a), - storage_(default_buffer_size) - { - } - - /// Construct, passing the specified argument to initialise the next layer. - template - buffered_read_stream(Arg& a, std::size_t buffer_size) - : next_layer_(a), - storage_(buffer_size) - { - } - - /// Get a reference to the next layer. - next_layer_type& next_layer() - { - return next_layer_; - } - - /// Get a reference to the lowest layer. - lowest_layer_type& lowest_layer() - { - return next_layer_.lowest_layer(); - } - - /// Get a const reference to the lowest layer. - const lowest_layer_type& lowest_layer() const - { - return next_layer_.lowest_layer(); - } - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return next_layer_.lowest_layer().get_executor(); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_context() - { - return next_layer_.get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_service() - { - return next_layer_.get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Close the stream. - void close() - { - next_layer_.close(); - } - - /// Close the stream. - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - next_layer_.close(ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Write the given data to the stream. Returns the number of bytes written. - /// Throws an exception on failure. - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - return next_layer_.write_some(buffers); - } - - /// Write the given data to the stream. Returns the number of bytes written, - /// or 0 if an error occurred. - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return next_layer_.write_some(buffers, ec); - } - - /// Start an asynchronous write. The data being written must be valid for the - /// lifetime of the asynchronous operation. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - return next_layer_.async_write_some(buffers, - ASIO_MOVE_CAST(WriteHandler)(handler)); - } - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation. Throws an exception on failure. - std::size_t fill(); - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation, or 0 if an error occurred. - std::size_t fill(asio::error_code& ec); - - /// Start an asynchronous fill. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_fill(ASIO_MOVE_ARG(ReadHandler) handler); - - /// Read some data from the stream. Returns the number of bytes read. Throws - /// an exception on failure. - template - std::size_t read_some(const MutableBufferSequence& buffers); - - /// Read some data from the stream. Returns the number of bytes read or 0 if - /// an error occurred. - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec); - - /// Start an asynchronous read. The buffer into which the data will be read - /// must be valid for the lifetime of the asynchronous operation. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler); - - /// Peek at the incoming data on the stream. Returns the number of bytes read. - /// Throws an exception on failure. - template - std::size_t peek(const MutableBufferSequence& buffers); - - /// Peek at the incoming data on the stream. Returns the number of bytes read, - /// or 0 if an error occurred. - template - std::size_t peek(const MutableBufferSequence& buffers, - asio::error_code& ec); - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail() - { - return storage_.size(); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail(asio::error_code& ec) - { - ec = asio::error_code(); - return storage_.size(); - } - -private: - /// Copy data out of the internal buffer to the specified target buffer. - /// Returns the number of bytes copied. - template - std::size_t copy(const MutableBufferSequence& buffers) - { - std::size_t bytes_copied = asio::buffer_copy( - buffers, storage_.data(), storage_.size()); - storage_.consume(bytes_copied); - return bytes_copied; - } - - /// Copy data from the internal buffer to the specified target buffer, without - /// removing the data from the internal buffer. Returns the number of bytes - /// copied. - template - std::size_t peek_copy(const MutableBufferSequence& buffers) - { - return asio::buffer_copy(buffers, storage_.data(), storage_.size()); - } - - /// The next layer. - Stream next_layer_; - - // The data in the buffer. - detail::buffered_stream_storage storage_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/buffered_read_stream.hpp" - -#endif // ASIO_BUFFERED_READ_STREAM_HPP diff --git a/scout_sdk/asio/asio/buffered_read_stream_fwd.hpp b/scout_sdk/asio/asio/buffered_read_stream_fwd.hpp deleted file mode 100644 index 334b88a..0000000 --- a/scout_sdk/asio/asio/buffered_read_stream_fwd.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// buffered_read_stream_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_READ_STREAM_FWD_HPP -#define ASIO_BUFFERED_READ_STREAM_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -namespace asio { - -template -class buffered_read_stream; - -} // namespace asio - -#endif // ASIO_BUFFERED_READ_STREAM_FWD_HPP diff --git a/scout_sdk/asio/asio/buffered_stream.hpp b/scout_sdk/asio/asio/buffered_stream.hpp deleted file mode 100644 index 8014fa4..0000000 --- a/scout_sdk/asio/asio/buffered_stream.hpp +++ /dev/null @@ -1,278 +0,0 @@ -// -// buffered_stream.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_STREAM_HPP -#define ASIO_BUFFERED_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/buffered_read_stream.hpp" -#include "asio/buffered_write_stream.hpp" -#include "asio/buffered_stream_fwd.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Adds buffering to the read- and write-related operations of a stream. -/** - * The buffered_stream class template can be used to add buffering to the - * synchronous and asynchronous read and write operations of a stream. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -template -class buffered_stream - : private noncopyable -{ -public: - /// The type of the next layer. - typedef typename remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type of the executor associated with the object. - typedef typename lowest_layer_type::executor_type executor_type; - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_stream(Arg& a) - : inner_stream_impl_(a), - stream_impl_(inner_stream_impl_) - { - } - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_stream(Arg& a, std::size_t read_buffer_size, - std::size_t write_buffer_size) - : inner_stream_impl_(a, write_buffer_size), - stream_impl_(inner_stream_impl_, read_buffer_size) - { - } - - /// Get a reference to the next layer. - next_layer_type& next_layer() - { - return stream_impl_.next_layer().next_layer(); - } - - /// Get a reference to the lowest layer. - lowest_layer_type& lowest_layer() - { - return stream_impl_.lowest_layer(); - } - - /// Get a const reference to the lowest layer. - const lowest_layer_type& lowest_layer() const - { - return stream_impl_.lowest_layer(); - } - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return stream_impl_.lowest_layer().get_executor(); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_context() - { - return stream_impl_.get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_service() - { - return stream_impl_.get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Close the stream. - void close() - { - stream_impl_.close(); - } - - /// Close the stream. - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - stream_impl_.close(ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation. Throws an - /// exception on failure. - std::size_t flush() - { - return stream_impl_.next_layer().flush(); - } - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation, or 0 if an - /// error occurred. - std::size_t flush(asio::error_code& ec) - { - return stream_impl_.next_layer().flush(ec); - } - - /// Start an asynchronous flush. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_flush(ASIO_MOVE_ARG(WriteHandler) handler) - { - return stream_impl_.next_layer().async_flush( - ASIO_MOVE_CAST(WriteHandler)(handler)); - } - - /// Write the given data to the stream. Returns the number of bytes written. - /// Throws an exception on failure. - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - return stream_impl_.write_some(buffers); - } - - /// Write the given data to the stream. Returns the number of bytes written, - /// or 0 if an error occurred. - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return stream_impl_.write_some(buffers, ec); - } - - /// Start an asynchronous write. The data being written must be valid for the - /// lifetime of the asynchronous operation. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - return stream_impl_.async_write_some(buffers, - ASIO_MOVE_CAST(WriteHandler)(handler)); - } - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation. Throws an exception on failure. - std::size_t fill() - { - return stream_impl_.fill(); - } - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation, or 0 if an error occurred. - std::size_t fill(asio::error_code& ec) - { - return stream_impl_.fill(ec); - } - - /// Start an asynchronous fill. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_fill(ASIO_MOVE_ARG(ReadHandler) handler) - { - return stream_impl_.async_fill(ASIO_MOVE_CAST(ReadHandler)(handler)); - } - - /// Read some data from the stream. Returns the number of bytes read. Throws - /// an exception on failure. - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - return stream_impl_.read_some(buffers); - } - - /// Read some data from the stream. Returns the number of bytes read or 0 if - /// an error occurred. - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return stream_impl_.read_some(buffers, ec); - } - - /// Start an asynchronous read. The buffer into which the data will be read - /// must be valid for the lifetime of the asynchronous operation. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - return stream_impl_.async_read_some(buffers, - ASIO_MOVE_CAST(ReadHandler)(handler)); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read. - /// Throws an exception on failure. - template - std::size_t peek(const MutableBufferSequence& buffers) - { - return stream_impl_.peek(buffers); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read, - /// or 0 if an error occurred. - template - std::size_t peek(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return stream_impl_.peek(buffers, ec); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail() - { - return stream_impl_.in_avail(); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail(asio::error_code& ec) - { - return stream_impl_.in_avail(ec); - } - -private: - // The buffered write stream. - typedef buffered_write_stream write_stream_type; - write_stream_type inner_stream_impl_; - - // The buffered read stream. - typedef buffered_read_stream read_stream_type; - read_stream_type stream_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERED_STREAM_HPP diff --git a/scout_sdk/asio/asio/buffered_stream_fwd.hpp b/scout_sdk/asio/asio/buffered_stream_fwd.hpp deleted file mode 100644 index 3492979..0000000 --- a/scout_sdk/asio/asio/buffered_stream_fwd.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// buffered_stream_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_STREAM_FWD_HPP -#define ASIO_BUFFERED_STREAM_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -namespace asio { - -template -class buffered_stream; - -} // namespace asio - -#endif // ASIO_BUFFERED_STREAM_FWD_HPP diff --git a/scout_sdk/asio/asio/buffered_write_stream.hpp b/scout_sdk/asio/asio/buffered_write_stream.hpp deleted file mode 100644 index aac33d3..0000000 --- a/scout_sdk/asio/asio/buffered_write_stream.hpp +++ /dev/null @@ -1,249 +0,0 @@ -// -// buffered_write_stream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_WRITE_STREAM_HPP -#define ASIO_BUFFERED_WRITE_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/buffered_write_stream_fwd.hpp" -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffered_stream_storage.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/write.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Adds buffering to the write-related operations of a stream. -/** - * The buffered_write_stream class template can be used to add buffering to the - * synchronous and asynchronous write operations of a stream. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -template -class buffered_write_stream - : private noncopyable -{ -public: - /// The type of the next layer. - typedef typename remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type of the executor associated with the object. - typedef typename lowest_layer_type::executor_type executor_type; - -#if defined(GENERATING_DOCUMENTATION) - /// The default buffer size. - static const std::size_t default_buffer_size = implementation_defined; -#else - ASIO_STATIC_CONSTANT(std::size_t, default_buffer_size = 1024); -#endif - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_write_stream(Arg& a) - : next_layer_(a), - storage_(default_buffer_size) - { - } - - /// Construct, passing the specified argument to initialise the next layer. - template - buffered_write_stream(Arg& a, std::size_t buffer_size) - : next_layer_(a), - storage_(buffer_size) - { - } - - /// Get a reference to the next layer. - next_layer_type& next_layer() - { - return next_layer_; - } - - /// Get a reference to the lowest layer. - lowest_layer_type& lowest_layer() - { - return next_layer_.lowest_layer(); - } - - /// Get a const reference to the lowest layer. - const lowest_layer_type& lowest_layer() const - { - return next_layer_.lowest_layer(); - } - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return next_layer_.lowest_layer().get_executor(); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_context() - { - return next_layer_.get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_service() - { - return next_layer_.get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Close the stream. - void close() - { - next_layer_.close(); - } - - /// Close the stream. - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - next_layer_.close(ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation. Throws an - /// exception on failure. - std::size_t flush(); - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation, or 0 if an - /// error occurred. - std::size_t flush(asio::error_code& ec); - - /// Start an asynchronous flush. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_flush(ASIO_MOVE_ARG(WriteHandler) handler); - - /// Write the given data to the stream. Returns the number of bytes written. - /// Throws an exception on failure. - template - std::size_t write_some(const ConstBufferSequence& buffers); - - /// Write the given data to the stream. Returns the number of bytes written, - /// or 0 if an error occurred and the error handler did not throw. - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec); - - /// Start an asynchronous write. The data being written must be valid for the - /// lifetime of the asynchronous operation. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler); - - /// Read some data from the stream. Returns the number of bytes read. Throws - /// an exception on failure. - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - return next_layer_.read_some(buffers); - } - - /// Read some data from the stream. Returns the number of bytes read or 0 if - /// an error occurred. - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return next_layer_.read_some(buffers, ec); - } - - /// Start an asynchronous read. The buffer into which the data will be read - /// must be valid for the lifetime of the asynchronous operation. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - return next_layer_.async_read_some(buffers, - ASIO_MOVE_CAST(ReadHandler)(handler)); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read. - /// Throws an exception on failure. - template - std::size_t peek(const MutableBufferSequence& buffers) - { - return next_layer_.peek(buffers); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read, - /// or 0 if an error occurred. - template - std::size_t peek(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return next_layer_.peek(buffers, ec); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail() - { - return next_layer_.in_avail(); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail(asio::error_code& ec) - { - return next_layer_.in_avail(ec); - } - -private: - /// Copy data into the internal buffer from the specified source buffer. - /// Returns the number of bytes copied. - template - std::size_t copy(const ConstBufferSequence& buffers); - - /// The next layer. - Stream next_layer_; - - // The data in the buffer. - detail::buffered_stream_storage storage_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/buffered_write_stream.hpp" - -#endif // ASIO_BUFFERED_WRITE_STREAM_HPP diff --git a/scout_sdk/asio/asio/buffered_write_stream_fwd.hpp b/scout_sdk/asio/asio/buffered_write_stream_fwd.hpp deleted file mode 100644 index 6ef54ba..0000000 --- a/scout_sdk/asio/asio/buffered_write_stream_fwd.hpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// buffered_write_stream_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_WRITE_STREAM_FWD_HPP -#define ASIO_BUFFERED_WRITE_STREAM_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -namespace asio { - -template -class buffered_write_stream; - -} // namespace asio - -#endif // ASIO_BUFFERED_WRITE_STREAM_FWD_HPP diff --git a/scout_sdk/asio/asio/buffers_iterator.hpp b/scout_sdk/asio/asio/buffers_iterator.hpp deleted file mode 100644 index f5c9d4c..0000000 --- a/scout_sdk/asio/asio/buffers_iterator.hpp +++ /dev/null @@ -1,521 +0,0 @@ -// -// buffers_iterator.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERS_ITERATOR_HPP -#define ASIO_BUFFERS_ITERATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include "asio/buffer.hpp" -#include "asio/detail/assert.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - template - struct buffers_iterator_types_helper; - - template <> - struct buffers_iterator_types_helper - { - typedef const_buffer buffer_type; - template - struct byte_type - { - typedef typename add_const::type type; - }; - }; - - template <> - struct buffers_iterator_types_helper - { - typedef mutable_buffer buffer_type; - template - struct byte_type - { - typedef ByteType type; - }; - }; - - template - struct buffers_iterator_types - { - enum - { - is_mutable = is_convertible< - typename BufferSequence::value_type, - mutable_buffer>::value - }; - typedef buffers_iterator_types_helper helper; - typedef typename helper::buffer_type buffer_type; - typedef typename helper::template byte_type::type byte_type; - typedef typename BufferSequence::const_iterator const_iterator; - }; - - template - struct buffers_iterator_types - { - typedef mutable_buffer buffer_type; - typedef ByteType byte_type; - typedef const mutable_buffer* const_iterator; - }; - - template - struct buffers_iterator_types - { - typedef const_buffer buffer_type; - typedef typename add_const::type byte_type; - typedef const const_buffer* const_iterator; - }; - -#if !defined(ASIO_NO_DEPRECATED) - - template - struct buffers_iterator_types - { - typedef mutable_buffer buffer_type; - typedef ByteType byte_type; - typedef const mutable_buffer* const_iterator; - }; - - template - struct buffers_iterator_types - { - typedef const_buffer buffer_type; - typedef typename add_const::type byte_type; - typedef const const_buffer* const_iterator; - }; - -#endif // !defined(ASIO_NO_DEPRECATED) -} - -/// A random access iterator over the bytes in a buffer sequence. -template -class buffers_iterator -{ -private: - typedef typename detail::buffers_iterator_types< - BufferSequence, ByteType>::buffer_type buffer_type; - - typedef typename detail::buffers_iterator_types::const_iterator buffer_sequence_iterator_type; - -public: - /// The type used for the distance between two iterators. - typedef std::ptrdiff_t difference_type; - - /// The type of the value pointed to by the iterator. - typedef ByteType value_type; - -#if defined(GENERATING_DOCUMENTATION) - /// The type of the result of applying operator->() to the iterator. - /** - * If the buffer sequence stores buffer objects that are convertible to - * mutable_buffer, this is a pointer to a non-const ByteType. Otherwise, a - * pointer to a const ByteType. - */ - typedef const_or_non_const_ByteType* pointer; -#else // defined(GENERATING_DOCUMENTATION) - typedef typename detail::buffers_iterator_types< - BufferSequence, ByteType>::byte_type* pointer; -#endif // defined(GENERATING_DOCUMENTATION) - -#if defined(GENERATING_DOCUMENTATION) - /// The type of the result of applying operator*() to the iterator. - /** - * If the buffer sequence stores buffer objects that are convertible to - * mutable_buffer, this is a reference to a non-const ByteType. Otherwise, a - * reference to a const ByteType. - */ - typedef const_or_non_const_ByteType& reference; -#else // defined(GENERATING_DOCUMENTATION) - typedef typename detail::buffers_iterator_types< - BufferSequence, ByteType>::byte_type& reference; -#endif // defined(GENERATING_DOCUMENTATION) - - /// The iterator category. - typedef std::random_access_iterator_tag iterator_category; - - /// Default constructor. Creates an iterator in an undefined state. - buffers_iterator() - : current_buffer_(), - current_buffer_position_(0), - begin_(), - current_(), - end_(), - position_(0) - { - } - - /// Construct an iterator representing the beginning of the buffers' data. - static buffers_iterator begin(const BufferSequence& buffers) -#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) - __attribute__ ((__noinline__)) -#endif // defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) - { - buffers_iterator new_iter; - new_iter.begin_ = asio::buffer_sequence_begin(buffers); - new_iter.current_ = asio::buffer_sequence_begin(buffers); - new_iter.end_ = asio::buffer_sequence_end(buffers); - while (new_iter.current_ != new_iter.end_) - { - new_iter.current_buffer_ = *new_iter.current_; - if (new_iter.current_buffer_.size() > 0) - break; - ++new_iter.current_; - } - return new_iter; - } - - /// Construct an iterator representing the end of the buffers' data. - static buffers_iterator end(const BufferSequence& buffers) -#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) - __attribute__ ((__noinline__)) -#endif // defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) - { - buffers_iterator new_iter; - new_iter.begin_ = asio::buffer_sequence_begin(buffers); - new_iter.current_ = asio::buffer_sequence_begin(buffers); - new_iter.end_ = asio::buffer_sequence_end(buffers); - while (new_iter.current_ != new_iter.end_) - { - buffer_type buffer = *new_iter.current_; - new_iter.position_ += buffer.size(); - ++new_iter.current_; - } - return new_iter; - } - - /// Dereference an iterator. - reference operator*() const - { - return dereference(); - } - - /// Dereference an iterator. - pointer operator->() const - { - return &dereference(); - } - - /// Access an individual element. - reference operator[](std::ptrdiff_t difference) const - { - buffers_iterator tmp(*this); - tmp.advance(difference); - return *tmp; - } - - /// Increment operator (prefix). - buffers_iterator& operator++() - { - increment(); - return *this; - } - - /// Increment operator (postfix). - buffers_iterator operator++(int) - { - buffers_iterator tmp(*this); - ++*this; - return tmp; - } - - /// Decrement operator (prefix). - buffers_iterator& operator--() - { - decrement(); - return *this; - } - - /// Decrement operator (postfix). - buffers_iterator operator--(int) - { - buffers_iterator tmp(*this); - --*this; - return tmp; - } - - /// Addition operator. - buffers_iterator& operator+=(std::ptrdiff_t difference) - { - advance(difference); - return *this; - } - - /// Subtraction operator. - buffers_iterator& operator-=(std::ptrdiff_t difference) - { - advance(-difference); - return *this; - } - - /// Addition operator. - friend buffers_iterator operator+(const buffers_iterator& iter, - std::ptrdiff_t difference) - { - buffers_iterator tmp(iter); - tmp.advance(difference); - return tmp; - } - - /// Addition operator. - friend buffers_iterator operator+(std::ptrdiff_t difference, - const buffers_iterator& iter) - { - buffers_iterator tmp(iter); - tmp.advance(difference); - return tmp; - } - - /// Subtraction operator. - friend buffers_iterator operator-(const buffers_iterator& iter, - std::ptrdiff_t difference) - { - buffers_iterator tmp(iter); - tmp.advance(-difference); - return tmp; - } - - /// Subtraction operator. - friend std::ptrdiff_t operator-(const buffers_iterator& a, - const buffers_iterator& b) - { - return b.distance_to(a); - } - - /// Test two iterators for equality. - friend bool operator==(const buffers_iterator& a, const buffers_iterator& b) - { - return a.equal(b); - } - - /// Test two iterators for inequality. - friend bool operator!=(const buffers_iterator& a, const buffers_iterator& b) - { - return !a.equal(b); - } - - /// Compare two iterators. - friend bool operator<(const buffers_iterator& a, const buffers_iterator& b) - { - return a.distance_to(b) > 0; - } - - /// Compare two iterators. - friend bool operator<=(const buffers_iterator& a, const buffers_iterator& b) - { - return !(b < a); - } - - /// Compare two iterators. - friend bool operator>(const buffers_iterator& a, const buffers_iterator& b) - { - return b < a; - } - - /// Compare two iterators. - friend bool operator>=(const buffers_iterator& a, const buffers_iterator& b) - { - return !(a < b); - } - -private: - // Dereference the iterator. - reference dereference() const - { - return static_cast( - current_buffer_.data())[current_buffer_position_]; - } - - // Compare two iterators for equality. - bool equal(const buffers_iterator& other) const - { - return position_ == other.position_; - } - - // Increment the iterator. - void increment() - { - ASIO_ASSERT(current_ != end_ && "iterator out of bounds"); - ++position_; - - // Check if the increment can be satisfied by the current buffer. - ++current_buffer_position_; - if (current_buffer_position_ != current_buffer_.size()) - return; - - // Find the next non-empty buffer. - ++current_; - current_buffer_position_ = 0; - while (current_ != end_) - { - current_buffer_ = *current_; - if (current_buffer_.size() > 0) - return; - ++current_; - } - } - - // Decrement the iterator. - void decrement() - { - ASIO_ASSERT(position_ > 0 && "iterator out of bounds"); - --position_; - - // Check if the decrement can be satisfied by the current buffer. - if (current_buffer_position_ != 0) - { - --current_buffer_position_; - return; - } - - // Find the previous non-empty buffer. - buffer_sequence_iterator_type iter = current_; - while (iter != begin_) - { - --iter; - buffer_type buffer = *iter; - std::size_t buffer_size = buffer.size(); - if (buffer_size > 0) - { - current_ = iter; - current_buffer_ = buffer; - current_buffer_position_ = buffer_size - 1; - return; - } - } - } - - // Advance the iterator by the specified distance. - void advance(std::ptrdiff_t n) - { - if (n > 0) - { - ASIO_ASSERT(current_ != end_ && "iterator out of bounds"); - for (;;) - { - std::ptrdiff_t current_buffer_balance - = current_buffer_.size() - current_buffer_position_; - - // Check if the advance can be satisfied by the current buffer. - if (current_buffer_balance > n) - { - position_ += n; - current_buffer_position_ += n; - return; - } - - // Update position. - n -= current_buffer_balance; - position_ += current_buffer_balance; - - // Move to next buffer. If it is empty then it will be skipped on the - // next iteration of this loop. - if (++current_ == end_) - { - ASIO_ASSERT(n == 0 && "iterator out of bounds"); - current_buffer_ = buffer_type(); - current_buffer_position_ = 0; - return; - } - current_buffer_ = *current_; - current_buffer_position_ = 0; - } - } - else if (n < 0) - { - std::size_t abs_n = -n; - ASIO_ASSERT(position_ >= abs_n && "iterator out of bounds"); - for (;;) - { - // Check if the advance can be satisfied by the current buffer. - if (current_buffer_position_ >= abs_n) - { - position_ -= abs_n; - current_buffer_position_ -= abs_n; - return; - } - - // Update position. - abs_n -= current_buffer_position_; - position_ -= current_buffer_position_; - - // Check if we've reached the beginning of the buffers. - if (current_ == begin_) - { - ASIO_ASSERT(abs_n == 0 && "iterator out of bounds"); - current_buffer_position_ = 0; - return; - } - - // Find the previous non-empty buffer. - buffer_sequence_iterator_type iter = current_; - while (iter != begin_) - { - --iter; - buffer_type buffer = *iter; - std::size_t buffer_size = buffer.size(); - if (buffer_size > 0) - { - current_ = iter; - current_buffer_ = buffer; - current_buffer_position_ = buffer_size; - break; - } - } - } - } - } - - // Determine the distance between two iterators. - std::ptrdiff_t distance_to(const buffers_iterator& other) const - { - return other.position_ - position_; - } - - buffer_type current_buffer_; - std::size_t current_buffer_position_; - buffer_sequence_iterator_type begin_; - buffer_sequence_iterator_type current_; - buffer_sequence_iterator_type end_; - std::size_t position_; -}; - -/// Construct an iterator representing the beginning of the buffers' data. -template -inline buffers_iterator buffers_begin( - const BufferSequence& buffers) -{ - return buffers_iterator::begin(buffers); -} - -/// Construct an iterator representing the end of the buffers' data. -template -inline buffers_iterator buffers_end( - const BufferSequence& buffers) -{ - return buffers_iterator::end(buffers); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERS_ITERATOR_HPP diff --git a/scout_sdk/asio/asio/completion_condition.hpp b/scout_sdk/asio/asio/completion_condition.hpp deleted file mode 100644 index 563f417..0000000 --- a/scout_sdk/asio/asio/completion_condition.hpp +++ /dev/null @@ -1,218 +0,0 @@ -// -// completion_condition.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_COMPLETION_CONDITION_HPP -#define ASIO_COMPLETION_CONDITION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail { - -// The default maximum number of bytes to transfer in a single operation. -enum default_max_transfer_size_t { default_max_transfer_size = 65536 }; - -// Adapt result of old-style completion conditions (which had a bool result -// where true indicated that the operation was complete). -inline std::size_t adapt_completion_condition_result(bool result) -{ - return result ? 0 : default_max_transfer_size; -} - -// Adapt result of current completion conditions (which have a size_t result -// where 0 means the operation is complete, and otherwise the result is the -// maximum number of bytes to transfer on the next underlying operation). -inline std::size_t adapt_completion_condition_result(std::size_t result) -{ - return result; -} - -class transfer_all_t -{ -public: - typedef std::size_t result_type; - - template - std::size_t operator()(const Error& err, std::size_t) - { - return !!err ? 0 : default_max_transfer_size; - } -}; - -class transfer_at_least_t -{ -public: - typedef std::size_t result_type; - - explicit transfer_at_least_t(std::size_t minimum) - : minimum_(minimum) - { - } - - template - std::size_t operator()(const Error& err, std::size_t bytes_transferred) - { - return (!!err || bytes_transferred >= minimum_) - ? 0 : default_max_transfer_size; - } - -private: - std::size_t minimum_; -}; - -class transfer_exactly_t -{ -public: - typedef std::size_t result_type; - - explicit transfer_exactly_t(std::size_t size) - : size_(size) - { - } - - template - std::size_t operator()(const Error& err, std::size_t bytes_transferred) - { - return (!!err || bytes_transferred >= size_) ? 0 : - (size_ - bytes_transferred < default_max_transfer_size - ? size_ - bytes_transferred : std::size_t(default_max_transfer_size)); - } - -private: - std::size_t size_; -}; - -} // namespace detail - -/** - * @defgroup completion_condition Completion Condition Function Objects - * - * Function objects used for determining when a read or write operation should - * complete. - */ -/*@{*/ - -/// Return a completion condition function object that indicates that a read or -/// write operation should continue until all of the data has been transferred, -/// or until an error occurs. -/** - * This function is used to create an object, of unspecified type, that meets - * CompletionCondition requirements. - * - * @par Example - * Reading until a buffer is full: - * @code - * boost::array buf; - * asio::error_code ec; - * std::size_t n = asio::read( - * sock, asio::buffer(buf), - * asio::transfer_all(), ec); - * if (ec) - * { - * // An error occurred. - * } - * else - * { - * // n == 128 - * } - * @endcode - */ -#if defined(GENERATING_DOCUMENTATION) -unspecified transfer_all(); -#else -inline detail::transfer_all_t transfer_all() -{ - return detail::transfer_all_t(); -} -#endif - -/// Return a completion condition function object that indicates that a read or -/// write operation should continue until a minimum number of bytes has been -/// transferred, or until an error occurs. -/** - * This function is used to create an object, of unspecified type, that meets - * CompletionCondition requirements. - * - * @par Example - * Reading until a buffer is full or contains at least 64 bytes: - * @code - * boost::array buf; - * asio::error_code ec; - * std::size_t n = asio::read( - * sock, asio::buffer(buf), - * asio::transfer_at_least(64), ec); - * if (ec) - * { - * // An error occurred. - * } - * else - * { - * // n >= 64 && n <= 128 - * } - * @endcode - */ -#if defined(GENERATING_DOCUMENTATION) -unspecified transfer_at_least(std::size_t minimum); -#else -inline detail::transfer_at_least_t transfer_at_least(std::size_t minimum) -{ - return detail::transfer_at_least_t(minimum); -} -#endif - -/// Return a completion condition function object that indicates that a read or -/// write operation should continue until an exact number of bytes has been -/// transferred, or until an error occurs. -/** - * This function is used to create an object, of unspecified type, that meets - * CompletionCondition requirements. - * - * @par Example - * Reading until a buffer is full or contains exactly 64 bytes: - * @code - * boost::array buf; - * asio::error_code ec; - * std::size_t n = asio::read( - * sock, asio::buffer(buf), - * asio::transfer_exactly(64), ec); - * if (ec) - * { - * // An error occurred. - * } - * else - * { - * // n == 64 - * } - * @endcode - */ -#if defined(GENERATING_DOCUMENTATION) -unspecified transfer_exactly(std::size_t size); -#else -inline detail::transfer_exactly_t transfer_exactly(std::size_t size) -{ - return detail::transfer_exactly_t(size); -} -#endif - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_COMPLETION_CONDITION_HPP diff --git a/scout_sdk/asio/asio/connect.hpp b/scout_sdk/asio/asio/connect.hpp deleted file mode 100644 index 487ce3e..0000000 --- a/scout_sdk/asio/asio/connect.hpp +++ /dev/null @@ -1,1059 +0,0 @@ -// -// connect.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_CONNECT_HPP -#define ASIO_CONNECT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/async_result.hpp" -#include "asio/basic_socket.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - char (&has_iterator_helper(...))[2]; - - template - char has_iterator_helper(T*, typename T::iterator* = 0); - - template - struct has_iterator_typedef - { - enum { value = (sizeof((has_iterator_helper)((T*)(0))) == 1) }; - }; -} // namespace detail - -/// Type trait used to determine whether a type is an endpoint sequence that can -/// be used with with @c connect and @c async_connect. -template -struct is_endpoint_sequence -{ -#if defined(GENERATING_DOCUMENTATION) - /// The value member is true if the type may be used as an endpoint sequence. - static const bool value; -#else - enum - { - value = detail::has_iterator_typedef::value - }; -#endif -}; - -/** - * @defgroup connect asio::connect - * - * @brief Establishes a socket connection by trying each endpoint in a sequence. - */ -/*@{*/ - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param endpoints A sequence of endpoints. - * - * @returns The successfully connected endpoint. - * - * @throws asio::system_error Thrown on failure. If the sequence is - * empty, the associated @c error_code is asio::error::not_found. - * Otherwise, contains the error from the last connection attempt. - * - * @par Example - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::socket s(io_context); - * asio::connect(s, r.resolve(q)); @endcode - */ -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, - typename enable_if::value>::type* = 0); - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param endpoints A sequence of endpoints. - * - * @param ec Set to indicate what error occurred, if any. If the sequence is - * empty, set to asio::error::not_found. Otherwise, contains the error - * from the last connection attempt. - * - * @returns On success, the successfully connected endpoint. Otherwise, a - * default-constructed endpoint. - * - * @par Example - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::socket s(io_context); - * asio::error_code ec; - * asio::connect(s, r.resolve(q), ec); - * if (ec) - * { - * // An error occurred. - * } @endcode - */ -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, asio::error_code& ec, - typename enable_if::value>::type* = 0); - -#if !defined(ASIO_NO_DEPRECATED) -/// (Deprecated.) Establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @returns On success, an iterator denoting the successfully connected - * endpoint. Otherwise, the end iterator. - * - * @throws asio::system_error Thrown on failure. If the sequence is - * empty, the associated @c error_code is asio::error::not_found. - * Otherwise, contains the error from the last connection attempt. - * - * @note This overload assumes that a default constructed object of type @c - * Iterator represents the end of the sequence. This is a valid assumption for - * iterator types such as @c asio::ip::tcp::resolver::iterator. - */ -template -Iterator connect(basic_socket& s, Iterator begin, - typename enable_if::value>::type* = 0); - -/// (Deprecated.) Establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param ec Set to indicate what error occurred, if any. If the sequence is - * empty, set to asio::error::not_found. Otherwise, contains the error - * from the last connection attempt. - * - * @returns On success, an iterator denoting the successfully connected - * endpoint. Otherwise, the end iterator. - * - * @note This overload assumes that a default constructed object of type @c - * Iterator represents the end of the sequence. This is a valid assumption for - * iterator types such as @c asio::ip::tcp::resolver::iterator. - */ -template -Iterator connect(basic_socket& s, - Iterator begin, asio::error_code& ec, - typename enable_if::value>::type* = 0); -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param end An iterator pointing to the end of a sequence of endpoints. - * - * @returns An iterator denoting the successfully connected endpoint. - * - * @throws asio::system_error Thrown on failure. If the sequence is - * empty, the associated @c error_code is asio::error::not_found. - * Otherwise, contains the error from the last connection attempt. - * - * @par Example - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::resolver::results_type e = r.resolve(q); - * tcp::socket s(io_context); - * asio::connect(s, e.begin(), e.end()); @endcode - */ -template -Iterator connect(basic_socket& s, - Iterator begin, Iterator end); - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param end An iterator pointing to the end of a sequence of endpoints. - * - * @param ec Set to indicate what error occurred, if any. If the sequence is - * empty, set to asio::error::not_found. Otherwise, contains the error - * from the last connection attempt. - * - * @returns On success, an iterator denoting the successfully connected - * endpoint. Otherwise, the end iterator. - * - * @par Example - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::resolver::results_type e = r.resolve(q); - * tcp::socket s(io_context); - * asio::error_code ec; - * asio::connect(s, e.begin(), e.end(), ec); - * if (ec) - * { - * // An error occurred. - * } @endcode - */ -template -Iterator connect(basic_socket& s, - Iterator begin, Iterator end, asio::error_code& ec); - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param endpoints A sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @returns The successfully connected endpoint. - * - * @throws asio::system_error Thrown on failure. If the sequence is - * empty, the associated @c error_code is asio::error::not_found. - * Otherwise, contains the error from the last connection attempt. - * - * @par Example - * The following connect condition function object can be used to output - * information about the individual connection attempts: - * @code struct my_connect_condition - * { - * bool operator()( - * const asio::error_code& ec, - * const::tcp::endpoint& next) - * { - * if (ec) std::cout << "Error: " << ec.message() << std::endl; - * std::cout << "Trying: " << next << std::endl; - * return true; - * } - * }; @endcode - * It would be used with the asio::connect function as follows: - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::socket s(io_context); - * tcp::endpoint e = asio::connect(s, - * r.resolve(q), my_connect_condition()); - * std::cout << "Connected to: " << e << std::endl; @endcode - */ -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, ConnectCondition connect_condition, - typename enable_if::value>::type* = 0); - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param endpoints A sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @param ec Set to indicate what error occurred, if any. If the sequence is - * empty, set to asio::error::not_found. Otherwise, contains the error - * from the last connection attempt. - * - * @returns On success, the successfully connected endpoint. Otherwise, a - * default-constructed endpoint. - * - * @par Example - * The following connect condition function object can be used to output - * information about the individual connection attempts: - * @code struct my_connect_condition - * { - * bool operator()( - * const asio::error_code& ec, - * const::tcp::endpoint& next) - * { - * if (ec) std::cout << "Error: " << ec.message() << std::endl; - * std::cout << "Trying: " << next << std::endl; - * return true; - * } - * }; @endcode - * It would be used with the asio::connect function as follows: - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::socket s(io_context); - * asio::error_code ec; - * tcp::endpoint e = asio::connect(s, - * r.resolve(q), my_connect_condition(), ec); - * if (ec) - * { - * // An error occurred. - * } - * else - * { - * std::cout << "Connected to: " << e << std::endl; - * } @endcode - */ -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, ConnectCondition connect_condition, - asio::error_code& ec, - typename enable_if::value>::type* = 0); - -#if !defined(ASIO_NO_DEPRECATED) -/// (Deprecated.) Establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @returns On success, an iterator denoting the successfully connected - * endpoint. Otherwise, the end iterator. - * - * @throws asio::system_error Thrown on failure. If the sequence is - * empty, the associated @c error_code is asio::error::not_found. - * Otherwise, contains the error from the last connection attempt. - * - * @note This overload assumes that a default constructed object of type @c - * Iterator represents the end of the sequence. This is a valid assumption for - * iterator types such as @c asio::ip::tcp::resolver::iterator. - */ -template -Iterator connect(basic_socket& s, - Iterator begin, ConnectCondition connect_condition, - typename enable_if::value>::type* = 0); - -/// (Deprecated.) Establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @param ec Set to indicate what error occurred, if any. If the sequence is - * empty, set to asio::error::not_found. Otherwise, contains the error - * from the last connection attempt. - * - * @returns On success, an iterator denoting the successfully connected - * endpoint. Otherwise, the end iterator. - * - * @note This overload assumes that a default constructed object of type @c - * Iterator represents the end of the sequence. This is a valid assumption for - * iterator types such as @c asio::ip::tcp::resolver::iterator. - */ -template -Iterator connect(basic_socket& s, Iterator begin, - ConnectCondition connect_condition, asio::error_code& ec, - typename enable_if::value>::type* = 0); -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param end An iterator pointing to the end of a sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @returns An iterator denoting the successfully connected endpoint. - * - * @throws asio::system_error Thrown on failure. If the sequence is - * empty, the associated @c error_code is asio::error::not_found. - * Otherwise, contains the error from the last connection attempt. - * - * @par Example - * The following connect condition function object can be used to output - * information about the individual connection attempts: - * @code struct my_connect_condition - * { - * bool operator()( - * const asio::error_code& ec, - * const::tcp::endpoint& next) - * { - * if (ec) std::cout << "Error: " << ec.message() << std::endl; - * std::cout << "Trying: " << next << std::endl; - * return true; - * } - * }; @endcode - * It would be used with the asio::connect function as follows: - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::resolver::results_type e = r.resolve(q); - * tcp::socket s(io_context); - * tcp::resolver::results_type::iterator i = asio::connect( - * s, e.begin(), e.end(), my_connect_condition()); - * std::cout << "Connected to: " << i->endpoint() << std::endl; @endcode - */ -template -Iterator connect(basic_socket& s, Iterator begin, - Iterator end, ConnectCondition connect_condition); - -/// Establishes a socket connection by trying each endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c connect member - * function, once for each endpoint in the sequence, until a connection is - * successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param end An iterator pointing to the end of a sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @param ec Set to indicate what error occurred, if any. If the sequence is - * empty, set to asio::error::not_found. Otherwise, contains the error - * from the last connection attempt. - * - * @returns On success, an iterator denoting the successfully connected - * endpoint. Otherwise, the end iterator. - * - * @par Example - * The following connect condition function object can be used to output - * information about the individual connection attempts: - * @code struct my_connect_condition - * { - * bool operator()( - * const asio::error_code& ec, - * const::tcp::endpoint& next) - * { - * if (ec) std::cout << "Error: " << ec.message() << std::endl; - * std::cout << "Trying: " << next << std::endl; - * return true; - * } - * }; @endcode - * It would be used with the asio::connect function as follows: - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::resolver::results_type e = r.resolve(q); - * tcp::socket s(io_context); - * asio::error_code ec; - * tcp::resolver::results_type::iterator i = asio::connect( - * s, e.begin(), e.end(), my_connect_condition()); - * if (ec) - * { - * // An error occurred. - * } - * else - * { - * std::cout << "Connected to: " << i->endpoint() << std::endl; - * } @endcode - */ -template -Iterator connect(basic_socket& s, - Iterator begin, Iterator end, ConnectCondition connect_condition, - asio::error_code& ec); - -/*@}*/ - -/** - * @defgroup async_connect asio::async_connect - * - * @brief Asynchronously establishes a socket connection by trying each - * endpoint in a sequence. - */ -/*@{*/ - -/// Asynchronously establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c async_connect - * member function, once for each endpoint in the sequence, until a connection - * is successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param endpoints A sequence of endpoints. - * - * @param handler The handler to be called when the connect operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * // Result of operation. if the sequence is empty, set to - * // asio::error::not_found. Otherwise, contains the - * // error from the last connection attempt. - * const asio::error_code& error, - * - * // On success, the successfully connected endpoint. - * // Otherwise, a default-constructed endpoint. - * const typename Protocol::endpoint& endpoint - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::socket s(io_context); - * - * // ... - * - * r.async_resolve(q, resolve_handler); - * - * // ... - * - * void resolve_handler( - * const asio::error_code& ec, - * tcp::resolver::results_type results) - * { - * if (!ec) - * { - * asio::async_connect(s, results, connect_handler); - * } - * } - * - * // ... - * - * void connect_handler( - * const asio::error_code& ec, - * const tcp::endpoint& endpoint) - * { - * // ... - * } @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, - void (asio::error_code, typename Protocol::endpoint)) -async_connect(basic_socket& s, - const EndpointSequence& endpoints, - ASIO_MOVE_ARG(RangeConnectHandler) handler, - typename enable_if::value>::type* = 0); - -#if !defined(ASIO_NO_DEPRECATED) -/// (Deprecated.) Asynchronously establishes a socket connection by trying each -/// endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c async_connect - * member function, once for each endpoint in the sequence, until a connection - * is successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param handler The handler to be called when the connect operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * // Result of operation. if the sequence is empty, set to - * // asio::error::not_found. Otherwise, contains the - * // error from the last connection attempt. - * const asio::error_code& error, - * - * // On success, an iterator denoting the successfully - * // connected endpoint. Otherwise, the end iterator. - * Iterator iterator - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note This overload assumes that a default constructed object of type @c - * Iterator represents the end of the sequence. This is a valid assumption for - * iterator types such as @c asio::ip::tcp::resolver::iterator. - */ -template -ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, - Iterator begin, ASIO_MOVE_ARG(IteratorConnectHandler) handler, - typename enable_if::value>::type* = 0); -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Asynchronously establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c async_connect - * member function, once for each endpoint in the sequence, until a connection - * is successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param end An iterator pointing to the end of a sequence of endpoints. - * - * @param handler The handler to be called when the connect operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * // Result of operation. if the sequence is empty, set to - * // asio::error::not_found. Otherwise, contains the - * // error from the last connection attempt. - * const asio::error_code& error, - * - * // On success, an iterator denoting the successfully - * // connected endpoint. Otherwise, the end iterator. - * Iterator iterator - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code std::vector endpoints = ...; - * tcp::socket s(io_context); - * asio::async_connect(s, - * endpoints.begin(), endpoints.end(), - * connect_handler); - * - * // ... - * - * void connect_handler( - * const asio::error_code& ec, - * std::vector::iterator i) - * { - * // ... - * } @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, - Iterator begin, Iterator end, - ASIO_MOVE_ARG(IteratorConnectHandler) handler); - -/// Asynchronously establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c async_connect - * member function, once for each endpoint in the sequence, until a connection - * is successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param endpoints A sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @param handler The handler to be called when the connect operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * // Result of operation. if the sequence is empty, set to - * // asio::error::not_found. Otherwise, contains the - * // error from the last connection attempt. - * const asio::error_code& error, - * - * // On success, an iterator denoting the successfully - * // connected endpoint. Otherwise, the end iterator. - * Iterator iterator - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * The following connect condition function object can be used to output - * information about the individual connection attempts: - * @code struct my_connect_condition - * { - * bool operator()( - * const asio::error_code& ec, - * const::tcp::endpoint& next) - * { - * if (ec) std::cout << "Error: " << ec.message() << std::endl; - * std::cout << "Trying: " << next << std::endl; - * return true; - * } - * }; @endcode - * It would be used with the asio::connect function as follows: - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::socket s(io_context); - * - * // ... - * - * r.async_resolve(q, resolve_handler); - * - * // ... - * - * void resolve_handler( - * const asio::error_code& ec, - * tcp::resolver::results_type results) - * { - * if (!ec) - * { - * asio::async_connect(s, results, - * my_connect_condition(), - * connect_handler); - * } - * } - * - * // ... - * - * void connect_handler( - * const asio::error_code& ec, - * const tcp::endpoint& endpoint) - * { - * if (ec) - * { - * // An error occurred. - * } - * else - * { - * std::cout << "Connected to: " << endpoint << std::endl; - * } - * } @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, - void (asio::error_code, typename Protocol::endpoint)) -async_connect(basic_socket& s, - const EndpointSequence& endpoints, ConnectCondition connect_condition, - ASIO_MOVE_ARG(RangeConnectHandler) handler, - typename enable_if::value>::type* = 0); - -#if !defined(ASIO_NO_DEPRECATED) -/// (Deprecated.) Asynchronously establishes a socket connection by trying each -/// endpoint in a sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c async_connect - * member function, once for each endpoint in the sequence, until a connection - * is successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @param handler The handler to be called when the connect operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * // Result of operation. if the sequence is empty, set to - * // asio::error::not_found. Otherwise, contains the - * // error from the last connection attempt. - * const asio::error_code& error, - * - * // On success, an iterator denoting the successfully - * // connected endpoint. Otherwise, the end iterator. - * Iterator iterator - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note This overload assumes that a default constructed object of type @c - * Iterator represents the end of the sequence. This is a valid assumption for - * iterator types such as @c asio::ip::tcp::resolver::iterator. - */ -template -ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, Iterator begin, - ConnectCondition connect_condition, - ASIO_MOVE_ARG(IteratorConnectHandler) handler, - typename enable_if::value>::type* = 0); -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Asynchronously establishes a socket connection by trying each endpoint in a -/// sequence. -/** - * This function attempts to connect a socket to one of a sequence of - * endpoints. It does this by repeated calls to the socket's @c async_connect - * member function, once for each endpoint in the sequence, until a connection - * is successfully established. - * - * @param s The socket to be connected. If the socket is already open, it will - * be closed. - * - * @param begin An iterator pointing to the start of a sequence of endpoints. - * - * @param end An iterator pointing to the end of a sequence of endpoints. - * - * @param connect_condition A function object that is called prior to each - * connection attempt. The signature of the function object must be: - * @code bool connect_condition( - * const asio::error_code& ec, - * const typename Protocol::endpoint& next); @endcode - * The @c ec parameter contains the result from the most recent connect - * operation. Before the first connection attempt, @c ec is always set to - * indicate success. The @c next parameter is the next endpoint to be tried. - * The function object should return true if the next endpoint should be tried, - * and false if it should be skipped. - * - * @param handler The handler to be called when the connect operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * // Result of operation. if the sequence is empty, set to - * // asio::error::not_found. Otherwise, contains the - * // error from the last connection attempt. - * const asio::error_code& error, - * - * // On success, an iterator denoting the successfully - * // connected endpoint. Otherwise, the end iterator. - * Iterator iterator - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * The following connect condition function object can be used to output - * information about the individual connection attempts: - * @code struct my_connect_condition - * { - * bool operator()( - * const asio::error_code& ec, - * const::tcp::endpoint& next) - * { - * if (ec) std::cout << "Error: " << ec.message() << std::endl; - * std::cout << "Trying: " << next << std::endl; - * return true; - * } - * }; @endcode - * It would be used with the asio::connect function as follows: - * @code tcp::resolver r(io_context); - * tcp::resolver::query q("host", "service"); - * tcp::socket s(io_context); - * - * // ... - * - * r.async_resolve(q, resolve_handler); - * - * // ... - * - * void resolve_handler( - * const asio::error_code& ec, - * tcp::resolver::iterator i) - * { - * if (!ec) - * { - * tcp::resolver::iterator end; - * asio::async_connect(s, i, end, - * my_connect_condition(), - * connect_handler); - * } - * } - * - * // ... - * - * void connect_handler( - * const asio::error_code& ec, - * tcp::resolver::iterator i) - * { - * if (ec) - * { - * // An error occurred. - * } - * else - * { - * std::cout << "Connected to: " << i->endpoint() << std::endl; - * } - * } @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, - Iterator begin, Iterator end, ConnectCondition connect_condition, - ASIO_MOVE_ARG(IteratorConnectHandler) handler); - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/connect.hpp" - -#endif diff --git a/scout_sdk/asio/asio/coroutine.hpp b/scout_sdk/asio/asio/coroutine.hpp deleted file mode 100644 index cd2d99e..0000000 --- a/scout_sdk/asio/asio/coroutine.hpp +++ /dev/null @@ -1,328 +0,0 @@ -// -// coroutine.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_COROUTINE_HPP -#define ASIO_COROUTINE_HPP - -namespace asio { -namespace detail { - -class coroutine_ref; - -} // namespace detail - -/// Provides support for implementing stackless coroutines. -/** - * The @c coroutine class may be used to implement stackless coroutines. The - * class itself is used to store the current state of the coroutine. - * - * Coroutines are copy-constructible and assignable, and the space overhead is - * a single int. They can be used as a base class: - * - * @code class session : coroutine - * { - * ... - * }; @endcode - * - * or as a data member: - * - * @code class session - * { - * ... - * coroutine coro_; - * }; @endcode - * - * or even bound in as a function argument using lambdas or @c bind(). The - * important thing is that as the application maintains a copy of the object - * for as long as the coroutine must be kept alive. - * - * @par Pseudo-keywords - * - * A coroutine is used in conjunction with certain "pseudo-keywords", which - * are implemented as macros. These macros are defined by a header file: - * - * @code #include @endcode - * - * and may conversely be undefined as follows: - * - * @code #include @endcode - * - * reenter - * - * The @c reenter macro is used to define the body of a coroutine. It takes a - * single argument: a pointer or reference to a coroutine object. For example, - * if the base class is a coroutine object you may write: - * - * @code reenter (this) - * { - * ... coroutine body ... - * } @endcode - * - * and if a data member or other variable you can write: - * - * @code reenter (coro_) - * { - * ... coroutine body ... - * } @endcode - * - * When @c reenter is executed at runtime, control jumps to the location of the - * last @c yield or @c fork. - * - * The coroutine body may also be a single statement, such as: - * - * @code reenter (this) for (;;) - * { - * ... - * } @endcode - * - * @b Limitation: The @c reenter macro is implemented using a switch. This - * means that you must take care when using local variables within the - * coroutine body. The local variable is not allowed in a position where - * reentering the coroutine could bypass the variable definition. - * - * yield statement - * - * This form of the @c yield keyword is often used with asynchronous operations: - * - * @code yield socket_->async_read_some(buffer(*buffer_), *this); @endcode - * - * This divides into four logical steps: - * - * @li @c yield saves the current state of the coroutine. - * @li The statement initiates the asynchronous operation. - * @li The resume point is defined immediately following the statement. - * @li Control is transferred to the end of the coroutine body. - * - * When the asynchronous operation completes, the function object is invoked - * and @c reenter causes control to transfer to the resume point. It is - * important to remember to carry the coroutine state forward with the - * asynchronous operation. In the above snippet, the current class is a - * function object object with a coroutine object as base class or data member. - * - * The statement may also be a compound statement, and this permits us to - * define local variables with limited scope: - * - * @code yield - * { - * mutable_buffers_1 b = buffer(*buffer_); - * socket_->async_read_some(b, *this); - * } @endcode - * - * yield return expression ; - * - * This form of @c yield is often used in generators or coroutine-based parsers. - * For example, the function object: - * - * @code struct interleave : coroutine - * { - * istream& is1; - * istream& is2; - * char operator()(char c) - * { - * reenter (this) for (;;) - * { - * yield return is1.get(); - * yield return is2.get(); - * } - * } - * }; @endcode - * - * defines a trivial coroutine that interleaves the characters from two input - * streams. - * - * This type of @c yield divides into three logical steps: - * - * @li @c yield saves the current state of the coroutine. - * @li The resume point is defined immediately following the semicolon. - * @li The value of the expression is returned from the function. - * - * yield ; - * - * This form of @c yield is equivalent to the following steps: - * - * @li @c yield saves the current state of the coroutine. - * @li The resume point is defined immediately following the semicolon. - * @li Control is transferred to the end of the coroutine body. - * - * This form might be applied when coroutines are used for cooperative - * threading and scheduling is explicitly managed. For example: - * - * @code struct task : coroutine - * { - * ... - * void operator()() - * { - * reenter (this) - * { - * while (... not finished ...) - * { - * ... do something ... - * yield; - * ... do some more ... - * yield; - * } - * } - * } - * ... - * }; - * ... - * task t1, t2; - * for (;;) - * { - * t1(); - * t2(); - * } @endcode - * - * yield break ; - * - * The final form of @c yield is used to explicitly terminate the coroutine. - * This form is comprised of two steps: - * - * @li @c yield sets the coroutine state to indicate termination. - * @li Control is transferred to the end of the coroutine body. - * - * Once terminated, calls to is_complete() return true and the coroutine cannot - * be reentered. - * - * Note that a coroutine may also be implicitly terminated if the coroutine - * body is exited without a yield, e.g. by return, throw or by running to the - * end of the body. - * - * fork statement - * - * The @c fork pseudo-keyword is used when "forking" a coroutine, i.e. splitting - * it into two (or more) copies. One use of @c fork is in a server, where a new - * coroutine is created to handle each client connection: - * - * @code reenter (this) - * { - * do - * { - * socket_.reset(new tcp::socket(io_context_)); - * yield acceptor->async_accept(*socket_, *this); - * fork server(*this)(); - * } while (is_parent()); - * ... client-specific handling follows ... - * } @endcode - * - * The logical steps involved in a @c fork are: - * - * @li @c fork saves the current state of the coroutine. - * @li The statement creates a copy of the coroutine and either executes it - * immediately or schedules it for later execution. - * @li The resume point is defined immediately following the semicolon. - * @li For the "parent", control immediately continues from the next line. - * - * The functions is_parent() and is_child() can be used to differentiate - * between parent and child. You would use these functions to alter subsequent - * control flow. - * - * Note that @c fork doesn't do the actual forking by itself. It is the - * application's responsibility to create a clone of the coroutine and call it. - * The clone can be called immediately, as above, or scheduled for delayed - * execution using something like io_context::post(). - * - * @par Alternate macro names - * - * If preferred, an application can use macro names that follow a more typical - * naming convention, rather than the pseudo-keywords. These are: - * - * @li @c ASIO_CORO_REENTER instead of @c reenter - * @li @c ASIO_CORO_YIELD instead of @c yield - * @li @c ASIO_CORO_FORK instead of @c fork - */ -class coroutine -{ -public: - /// Constructs a coroutine in its initial state. - coroutine() : value_(0) {} - - /// Returns true if the coroutine is the child of a fork. - bool is_child() const { return value_ < 0; } - - /// Returns true if the coroutine is the parent of a fork. - bool is_parent() const { return !is_child(); } - - /// Returns true if the coroutine has reached its terminal state. - bool is_complete() const { return value_ == -1; } - -private: - friend class detail::coroutine_ref; - int value_; -}; - - -namespace detail { - -class coroutine_ref -{ -public: - coroutine_ref(coroutine& c) : value_(c.value_), modified_(false) {} - coroutine_ref(coroutine* c) : value_(c->value_), modified_(false) {} - ~coroutine_ref() { if (!modified_) value_ = -1; } - operator int() const { return value_; } - int& operator=(int v) { modified_ = true; return value_ = v; } -private: - void operator=(const coroutine_ref&); - int& value_; - bool modified_; -}; - -} // namespace detail -} // namespace asio - -#define ASIO_CORO_REENTER(c) \ - switch (::asio::detail::coroutine_ref _coro_value = c) \ - case -1: if (_coro_value) \ - { \ - goto terminate_coroutine; \ - terminate_coroutine: \ - _coro_value = -1; \ - goto bail_out_of_coroutine; \ - bail_out_of_coroutine: \ - break; \ - } \ - else /* fall-through */ case 0: - -#define ASIO_CORO_YIELD_IMPL(n) \ - for (_coro_value = (n);;) \ - if (_coro_value == 0) \ - { \ - case (n): ; \ - break; \ - } \ - else \ - switch (_coro_value ? 0 : 1) \ - for (;;) \ - /* fall-through */ case -1: if (_coro_value) \ - goto terminate_coroutine; \ - else for (;;) \ - /* fall-through */ case 1: if (_coro_value) \ - goto bail_out_of_coroutine; \ - else /* fall-through */ case 0: - -#define ASIO_CORO_FORK_IMPL(n) \ - for (_coro_value = -(n);; _coro_value = (n)) \ - if (_coro_value == (n)) \ - { \ - case -(n): ; \ - break; \ - } \ - else - -#if defined(_MSC_VER) -# define ASIO_CORO_YIELD ASIO_CORO_YIELD_IMPL(__COUNTER__ + 1) -# define ASIO_CORO_FORK ASIO_CORO_FORK_IMPL(__COUNTER__ + 1) -#else // defined(_MSC_VER) -# define ASIO_CORO_YIELD ASIO_CORO_YIELD_IMPL(__LINE__) -# define ASIO_CORO_FORK ASIO_CORO_FORK_IMPL(__LINE__) -#endif // defined(_MSC_VER) - -#endif // ASIO_COROUTINE_HPP diff --git a/scout_sdk/asio/asio/datagram_socket_service.hpp b/scout_sdk/asio/asio/datagram_socket_service.hpp deleted file mode 100644 index 7dc1a3b..0000000 --- a/scout_sdk/asio/asio/datagram_socket_service.hpp +++ /dev/null @@ -1,466 +0,0 @@ -// -// datagram_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DATAGRAM_SOCKET_SERVICE_HPP -#define ASIO_DATAGRAM_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/null_socket_service.hpp" -#elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_socket_service.hpp" -#else -# include "asio/detail/reactive_socket_service.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a datagram socket. -template -class datagram_socket_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_WINDOWS_RUNTIME) - typedef detail::null_socket_service service_impl_type; -#elif defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#else - typedef detail::reactive_socket_service service_impl_type; -#endif - -public: - /// The type of a datagram socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native socket type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new datagram socket service for the specified io_context. - explicit datagram_socket_service(asio::io_context& io_context) - : asio::detail::service_base< - datagram_socket_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new datagram socket implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new datagram socket implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another datagram socket implementation. - void move_assign(implementation_type& impl, - datagram_socket_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } - - // All socket services have access to each other's implementations. - template friend class datagram_socket_service; - - /// Move-construct a new datagram socket implementation from another protocol - /// type. - template - void converting_move_construct(implementation_type& impl, - datagram_socket_service& other_service, - typename datagram_socket_service< - Protocol1>::implementation_type& other_impl, - typename enable_if::value>::type* = 0) - { - service_impl_.template converting_move_construct( - impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a datagram socket implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - // Open a new datagram socket implementation. - ASIO_SYNC_OP_VOID open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - if (protocol.type() == ASIO_OS_DEF(SOCK_DGRAM)) - service_impl_.open(impl, protocol, ec); - else - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native socket to a datagram socket. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_socket, - asio::error_code& ec) - { - service_impl_.assign(impl, protocol, native_socket, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a datagram socket implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Release ownership of the underlying socket. - native_handle_type release(implementation_type& impl, - asio::error_code& ec) - { - return service_impl_.release(impl, ec); - } - - /// Get the native socket implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the socket. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is at the out-of-band data mark. - bool at_mark(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.at_mark(impl, ec); - } - - /// Determine the number of bytes available for reading. - std::size_t available(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.available(impl, ec); - } - - // Bind the datagram socket to the specified local endpoint. - ASIO_SYNC_OP_VOID bind(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - service_impl_.bind(impl, endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Connect the datagram socket to the specified endpoint. - ASIO_SYNC_OP_VOID connect(implementation_type& impl, - const endpoint_type& peer_endpoint, asio::error_code& ec) - { - service_impl_.connect(impl, peer_endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous connect. - template - ASIO_INITFN_RESULT_TYPE(ConnectHandler, - void (asio::error_code)) - async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, - ASIO_MOVE_ARG(ConnectHandler) handler) - { - async_completion init(handler); - - service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); - - return init.result.get(); - } - - /// Set a socket option. - template - ASIO_SYNC_OP_VOID set_option(implementation_type& impl, - const SettableSocketOption& option, asio::error_code& ec) - { - service_impl_.set_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get a socket option. - template - ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, - GettableSocketOption& option, asio::error_code& ec) const - { - service_impl_.get_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the socket. - template - ASIO_SYNC_OP_VOID io_control(implementation_type& impl, - IoControlCommand& command, asio::error_code& ec) - { - service_impl_.io_control(impl, command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the socket. - bool non_blocking(const implementation_type& impl) const - { - return service_impl_.non_blocking(impl); - } - - /// Sets the non-blocking mode of the socket. - ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const implementation_type& impl) const - { - return service_impl_.native_non_blocking(impl); - } - - /// Sets the non-blocking mode of the native socket implementation. - ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.native_non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.local_endpoint(impl, ec); - } - - /// Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.remote_endpoint(impl, ec); - } - - /// Disable sends or receives on the socket. - ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, - socket_base::shutdown_type what, asio::error_code& ec) - { - service_impl_.shutdown(impl, what, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the socket to become ready to read, ready to write, or to have - /// pending error conditions. - ASIO_SYNC_OP_VOID wait(implementation_type& impl, - socket_base::wait_type w, asio::error_code& ec) - { - service_impl_.wait(impl, w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the socket to become ready to read, ready to - /// write, or to have pending error conditions. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, socket_base::wait_type w, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, w, init.completion_handler); - - return init.result.get(); - } - - /// Send the given data to the peer. - template - std::size_t send(implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.send(impl, buffers, flags, ec); - } - - /// Start an asynchronous send. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(implementation_type& impl, const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - async_completion init(handler); - - service_impl_.async_send(impl, buffers, flags, init.completion_handler); - - return init.result.get(); - } - - /// Send a datagram to the specified endpoint. - template - std::size_t send_to(implementation_type& impl, - const ConstBufferSequence& buffers, const endpoint_type& destination, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.send_to(impl, buffers, destination, flags, ec); - } - - /// Start an asynchronous send. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send_to(implementation_type& impl, - const ConstBufferSequence& buffers, const endpoint_type& destination, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - async_completion init(handler); - - service_impl_.async_send_to(impl, buffers, - destination, flags, init.completion_handler); - - return init.result.get(); - } - - /// Receive some data from the peer. - template - std::size_t receive(implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.receive(impl, buffers, flags, ec); - } - - /// Start an asynchronous receive. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - async_completion init(handler); - - service_impl_.async_receive(impl, buffers, flags, init.completion_handler); - - return init.result.get(); - } - - /// Receive a datagram with the endpoint of the sender. - template - std::size_t receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.receive_from(impl, buffers, sender_endpoint, flags, - ec); - } - - /// Start an asynchronous receive that will get the endpoint of the sender. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - async_completion init(handler); - - service_impl_.async_receive_from(impl, buffers, - sender_endpoint, flags, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_DATAGRAM_SOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/deadline_timer.hpp b/scout_sdk/asio/asio/deadline_timer.hpp deleted file mode 100644 index 5a21554..0000000 --- a/scout_sdk/asio/asio/deadline_timer.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// deadline_timer.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DEADLINE_TIMER_HPP -#define ASIO_DEADLINE_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/detail/socket_types.hpp" // Must come before posix_time. -#include "asio/basic_deadline_timer.hpp" - -#include - -namespace asio { - -/// Typedef for the typical usage of timer. Uses a UTC clock. -typedef basic_deadline_timer deadline_timer; - -} // namespace asio - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_DEADLINE_TIMER_HPP diff --git a/scout_sdk/asio/asio/deadline_timer_service.hpp b/scout_sdk/asio/asio/deadline_timer_service.hpp deleted file mode 100644 index 2dcc83e..0000000 --- a/scout_sdk/asio/asio/deadline_timer_service.hpp +++ /dev/null @@ -1,173 +0,0 @@ -// -// deadline_timer_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DEADLINE_TIMER_SERVICE_HPP -#define ASIO_DEADLINE_TIMER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/deadline_timer_service.hpp" -#include "asio/io_context.hpp" -#include "asio/time_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a timer. -template > -class deadline_timer_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base< - deadline_timer_service > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The time traits type. - typedef TimeTraits traits_type; - - /// The time type. - typedef typename traits_type::time_type time_type; - - /// The duration type. - typedef typename traits_type::duration_type duration_type; - -private: - // The type of the platform-specific implementation. - typedef detail::deadline_timer_service service_impl_type; - -public: - /// The implementation type of the deadline timer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// Construct a new timer service for the specified io_context. - explicit deadline_timer_service(asio::io_context& io_context) - : asio::detail::service_base< - deadline_timer_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new timer implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a timer implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Cancel any asynchronous wait operations associated with the timer. - std::size_t cancel(implementation_type& impl, asio::error_code& ec) - { - return service_impl_.cancel(impl, ec); - } - - /// Cancels one asynchronous wait operation associated with the timer. - std::size_t cancel_one(implementation_type& impl, - asio::error_code& ec) - { - return service_impl_.cancel_one(impl, ec); - } - - /// Get the expiry time for the timer as an absolute time. - time_type expires_at(const implementation_type& impl) const - { - return service_impl_.expiry(impl); - } - - /// Set the expiry time for the timer as an absolute time. - std::size_t expires_at(implementation_type& impl, - const time_type& expiry_time, asio::error_code& ec) - { - return service_impl_.expires_at(impl, expiry_time, ec); - } - - /// Get the expiry time for the timer relative to now. - duration_type expires_from_now(const implementation_type& impl) const - { - return TimeTraits::subtract(service_impl_.expiry(impl), TimeTraits::now()); - } - - /// Set the expiry time for the timer relative to now. - std::size_t expires_from_now(implementation_type& impl, - const duration_type& expiry_time, asio::error_code& ec) - { - return service_impl_.expires_after(impl, expiry_time, ec); - } - - // Perform a blocking wait on the timer. - void wait(implementation_type& impl, asio::error_code& ec) - { - service_impl_.wait(impl, ec); - } - - // Start an asynchronous wait on the timer. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_DEADLINE_TIMER_SERVICE_HPP diff --git a/scout_sdk/asio/asio/defer.hpp b/scout_sdk/asio/asio/defer.hpp deleted file mode 100644 index a0897f2..0000000 --- a/scout_sdk/asio/asio/defer.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// -// defer.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DEFER_HPP -#define ASIO_DEFER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/execution_context.hpp" -#include "asio/is_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Submits a completion token or function object for execution. -/** - * This function submits an object for execution using the object's associated - * executor. The function object is queued for execution, and is never called - * from the current thread prior to returning from defer(). - * - * This function has the following effects: - * - * @li Constructs a function object handler of type @c Handler, initialized - * with handler(forward(token)). - * - * @li Constructs an object @c result of type async_result, - * initializing the object as result(handler). - * - * @li Obtains the handler's associated executor object @c ex by performing - * get_associated_executor(handler). - * - * @li Obtains the handler's associated allocator object @c alloc by performing - * get_associated_allocator(handler). - * - * @li Performs ex.defer(std::move(handler), alloc). - * - * @li Returns result.get(). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - ASIO_MOVE_ARG(CompletionToken) token); - -/// Submits a completion token or function object for execution. -/** - * This function submits an object for execution using the specified executor. - * The function object is queued for execution, and is never called from the - * current thread prior to returning from defer(). - * - * This function has the following effects: - * - * @li Constructs a function object handler of type @c Handler, initialized - * with handler(forward(token)). - * - * @li Constructs an object @c result of type async_result, - * initializing the object as result(handler). - * - * @li Obtains the handler's associated executor object @c ex1 by performing - * get_associated_executor(handler). - * - * @li Creates a work object @c w by performing make_work(ex1). - * - * @li Obtains the handler's associated allocator object @c alloc by performing - * get_associated_allocator(handler). - * - * @li Constructs a function object @c f with a function call operator that - * performs ex1.dispatch(std::move(handler), alloc) followed by - * w.reset(). - * - * @li Performs Executor(ex).defer(std::move(f), alloc). - * - * @li Returns result.get(). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type* = 0); - -/// Submits a completion token or function object for execution. -/** - * @returns defer(ctx.get_executor(), forward(token)). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type* = 0); - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/defer.hpp" - -#endif // ASIO_DEFER_HPP diff --git a/scout_sdk/asio/asio/detail/array.hpp b/scout_sdk/asio/asio/detail/array.hpp deleted file mode 100644 index ba42974..0000000 --- a/scout_sdk/asio/asio/detail/array.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// detail/array.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_ARRAY_HPP -#define ASIO_DETAIL_ARRAY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_ARRAY) -# include -#else // defined(ASIO_HAS_STD_ARRAY) -# include -#endif // defined(ASIO_HAS_STD_ARRAY) - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_STD_ARRAY) -using std::array; -#else // defined(ASIO_HAS_STD_ARRAY) -using boost::array; -#endif // defined(ASIO_HAS_STD_ARRAY) - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_ARRAY_HPP diff --git a/scout_sdk/asio/asio/detail/array_fwd.hpp b/scout_sdk/asio/asio/detail/array_fwd.hpp deleted file mode 100644 index 4161db0..0000000 --- a/scout_sdk/asio/asio/detail/array_fwd.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// detail/array_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_ARRAY_FWD_HPP -#define ASIO_DETAIL_ARRAY_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -namespace boost { - -template -class array; - -} // namespace boost - -// Standard library components can't be forward declared, so we'll have to -// include the array header. Fortunately, it's fairly lightweight and doesn't -// add significantly to the compile time. -#if defined(ASIO_HAS_STD_ARRAY) -# include -#endif // defined(ASIO_HAS_STD_ARRAY) - -#endif // ASIO_DETAIL_ARRAY_FWD_HPP diff --git a/scout_sdk/asio/asio/detail/assert.hpp b/scout_sdk/asio/asio/detail/assert.hpp deleted file mode 100644 index a952a44..0000000 --- a/scout_sdk/asio/asio/detail/assert.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// -// detail/assert.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_ASSERT_HPP -#define ASIO_DETAIL_ASSERT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_ASSERT) -# include -#else // defined(ASIO_HAS_BOOST_ASSERT) -# include -#endif // defined(ASIO_HAS_BOOST_ASSERT) - -#if defined(ASIO_HAS_BOOST_ASSERT) -# define ASIO_ASSERT(expr) BOOST_ASSERT(expr) -#else // defined(ASIO_HAS_BOOST_ASSERT) -# define ASIO_ASSERT(expr) assert(expr) -#endif // defined(ASIO_HAS_BOOST_ASSERT) - -#endif // ASIO_DETAIL_ASSERT_HPP diff --git a/scout_sdk/asio/asio/detail/atomic_count.hpp b/scout_sdk/asio/asio/detail/atomic_count.hpp deleted file mode 100644 index 2bf75a5..0000000 --- a/scout_sdk/asio/asio/detail/atomic_count.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// detail/atomic_count.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_ATOMIC_COUNT_HPP -#define ASIO_DETAIL_ATOMIC_COUNT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) -// Nothing to include. -#elif defined(ASIO_HAS_STD_ATOMIC) -# include -#else // defined(ASIO_HAS_STD_ATOMIC) -# include -#endif // defined(ASIO_HAS_STD_ATOMIC) - -namespace asio { -namespace detail { - -#if !defined(ASIO_HAS_THREADS) -typedef long atomic_count; -inline void increment(atomic_count& a, long b) { a += b; } -#elif defined(ASIO_HAS_STD_ATOMIC) -typedef std::atomic atomic_count; -inline void increment(atomic_count& a, long b) { a += b; } -#else // defined(ASIO_HAS_STD_ATOMIC) -typedef boost::detail::atomic_count atomic_count; -inline void increment(atomic_count& a, long b) { while (b > 0) ++a, --b; } -#endif // defined(ASIO_HAS_STD_ATOMIC) - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_ATOMIC_COUNT_HPP diff --git a/scout_sdk/asio/asio/detail/base_from_completion_cond.hpp b/scout_sdk/asio/asio/detail/base_from_completion_cond.hpp deleted file mode 100644 index 73b4a95..0000000 --- a/scout_sdk/asio/asio/detail/base_from_completion_cond.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// detail/base_from_completion_cond.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BASE_FROM_COMPLETION_COND_HPP -#define ASIO_DETAIL_BASE_FROM_COMPLETION_COND_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/completion_condition.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class base_from_completion_cond -{ -protected: - explicit base_from_completion_cond(CompletionCondition completion_condition) - : completion_condition_(completion_condition) - { - } - - std::size_t check_for_completion( - const asio::error_code& ec, - std::size_t total_transferred) - { - return detail::adapt_completion_condition_result( - completion_condition_(ec, total_transferred)); - } - -private: - CompletionCondition completion_condition_; -}; - -template <> -class base_from_completion_cond -{ -protected: - explicit base_from_completion_cond(transfer_all_t) - { - } - - static std::size_t check_for_completion( - const asio::error_code& ec, - std::size_t total_transferred) - { - return transfer_all_t()(ec, total_transferred); - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_BASE_FROM_COMPLETION_COND_HPP diff --git a/scout_sdk/asio/asio/detail/bind_handler.hpp b/scout_sdk/asio/asio/detail/bind_handler.hpp deleted file mode 100644 index 0f4f066..0000000 --- a/scout_sdk/asio/asio/detail/bind_handler.hpp +++ /dev/null @@ -1,816 +0,0 @@ -// -// detail/bind_handler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BIND_HANDLER_HPP -#define ASIO_DETAIL_BIND_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class binder1 -{ -public: - template - binder1(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1) - : handler_(ASIO_MOVE_CAST(T)(handler)), - arg1_(arg1) - { - } - - binder1(Handler& handler, const Arg1& arg1) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1) - { - } - -#if defined(ASIO_HAS_MOVE) - binder1(const binder1& other) - : handler_(other.handler_), - arg1_(other.arg1_) - { - } - - binder1(binder1&& other) - : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), - arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - handler_(static_cast(arg1_)); - } - - void operator()() const - { - handler_(arg1_); - } - -//private: - Handler handler_; - Arg1 arg1_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder1* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder1* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - binder1* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - binder1* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder1* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline binder1::type, Arg1> bind_handler( - ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1) -{ - return binder1::type, Arg1>(0, - ASIO_MOVE_CAST(Handler)(handler), arg1); -} - -template -class binder2 -{ -public: - template - binder2(int, ASIO_MOVE_ARG(T) handler, - const Arg1& arg1, const Arg2& arg2) - : handler_(ASIO_MOVE_CAST(T)(handler)), - arg1_(arg1), - arg2_(arg2) - { - } - - binder2(Handler& handler, const Arg1& arg1, const Arg2& arg2) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(arg2) - { - } - -#if defined(ASIO_HAS_MOVE) - binder2(const binder2& other) - : handler_(other.handler_), - arg1_(other.arg1_), - arg2_(other.arg2_) - { - } - - binder2(binder2&& other) - : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), - arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), - arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - handler_(static_cast(arg1_), - static_cast(arg2_)); - } - - void operator()() const - { - handler_(arg1_, arg2_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder2* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder2* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - binder2* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - binder2* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder2* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline binder2::type, Arg1, Arg2> bind_handler( - ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2) -{ - return binder2::type, Arg1, Arg2>(0, - ASIO_MOVE_CAST(Handler)(handler), arg1, arg2); -} - -template -class binder3 -{ -public: - template - binder3(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1, - const Arg2& arg2, const Arg3& arg3) - : handler_(ASIO_MOVE_CAST(T)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3) - { - } - - binder3(Handler& handler, const Arg1& arg1, - const Arg2& arg2, const Arg3& arg3) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3) - { - } - -#if defined(ASIO_HAS_MOVE) - binder3(const binder3& other) - : handler_(other.handler_), - arg1_(other.arg1_), - arg2_(other.arg2_), - arg3_(other.arg3_) - { - } - - binder3(binder3&& other) - : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), - arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), - arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)), - arg3_(ASIO_MOVE_CAST(Arg3)(other.arg3_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - handler_(static_cast(arg1_), - static_cast(arg2_), static_cast(arg3_)); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder3* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder3* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - binder3* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - binder3* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder3* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline binder3::type, Arg1, Arg2, Arg3> bind_handler( - ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3) -{ - return binder3::type, Arg1, Arg2, Arg3>(0, - ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3); -} - -template -class binder4 -{ -public: - template - binder4(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1, - const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) - : handler_(ASIO_MOVE_CAST(T)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4) - { - } - - binder4(Handler& handler, const Arg1& arg1, - const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4) - { - } - -#if defined(ASIO_HAS_MOVE) - binder4(const binder4& other) - : handler_(other.handler_), - arg1_(other.arg1_), - arg2_(other.arg2_), - arg3_(other.arg3_), - arg4_(other.arg4_) - { - } - - binder4(binder4&& other) - : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), - arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), - arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)), - arg3_(ASIO_MOVE_CAST(Arg3)(other.arg3_)), - arg4_(ASIO_MOVE_CAST(Arg4)(other.arg4_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - handler_(static_cast(arg1_), - static_cast(arg2_), static_cast(arg3_), - static_cast(arg4_)); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_, arg4_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; - Arg4 arg4_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder4* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder4* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - binder4* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - binder4* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder4* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline binder4::type, Arg1, Arg2, Arg3, Arg4> -bind_handler(ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, - const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) -{ - return binder4::type, Arg1, Arg2, Arg3, Arg4>(0, - ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4); -} - -template -class binder5 -{ -public: - template - binder5(int, ASIO_MOVE_ARG(T) handler, const Arg1& arg1, - const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) - : handler_(ASIO_MOVE_CAST(T)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4), - arg5_(arg5) - { - } - - binder5(Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4), - arg5_(arg5) - { - } - -#if defined(ASIO_HAS_MOVE) - binder5(const binder5& other) - : handler_(other.handler_), - arg1_(other.arg1_), - arg2_(other.arg2_), - arg3_(other.arg3_), - arg4_(other.arg4_), - arg5_(other.arg5_) - { - } - - binder5(binder5&& other) - : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), - arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), - arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)), - arg3_(ASIO_MOVE_CAST(Arg3)(other.arg3_)), - arg4_(ASIO_MOVE_CAST(Arg4)(other.arg4_)), - arg5_(ASIO_MOVE_CAST(Arg5)(other.arg5_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - handler_(static_cast(arg1_), - static_cast(arg2_), static_cast(arg3_), - static_cast(arg4_), static_cast(arg5_)); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_, arg4_, arg5_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; - Arg4 arg4_; - Arg5 arg5_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder5* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder5* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - binder5* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - binder5* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder5* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline binder5::type, Arg1, Arg2, Arg3, Arg4, Arg5> -bind_handler(ASIO_MOVE_ARG(Handler) handler, const Arg1& arg1, - const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) -{ - return binder5::type, Arg1, Arg2, Arg3, Arg4, Arg5>(0, - ASIO_MOVE_CAST(Handler)(handler), arg1, arg2, arg3, arg4, arg5); -} - -#if defined(ASIO_HAS_MOVE) - -template -class move_binder1 -{ -public: - move_binder1(int, ASIO_MOVE_ARG(Handler) handler, - ASIO_MOVE_ARG(Arg1) arg1) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(ASIO_MOVE_CAST(Arg1)(arg1)) - { - } - - move_binder1(move_binder1&& other) - : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), - arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)) - { - } - - void operator()() - { - handler_(ASIO_MOVE_CAST(Arg1)(arg1_)); - } - -//private: - Handler handler_; - Arg1 arg1_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - move_binder1* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - move_binder1* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - move_binder1* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(ASIO_MOVE_ARG(Function) function, - move_binder1* this_handler) -{ - asio_handler_invoke_helpers::invoke( - ASIO_MOVE_CAST(Function)(function), this_handler->handler_); -} - -template -class move_binder2 -{ -public: - move_binder2(int, ASIO_MOVE_ARG(Handler) handler, - const Arg1& arg1, ASIO_MOVE_ARG(Arg2) arg2) - : handler_(ASIO_MOVE_CAST(Handler)(handler)), - arg1_(arg1), - arg2_(ASIO_MOVE_CAST(Arg2)(arg2)) - { - } - - move_binder2(move_binder2&& other) - : handler_(ASIO_MOVE_CAST(Handler)(other.handler_)), - arg1_(ASIO_MOVE_CAST(Arg1)(other.arg1_)), - arg2_(ASIO_MOVE_CAST(Arg2)(other.arg2_)) - { - } - - void operator()() - { - handler_(static_cast(arg1_), - ASIO_MOVE_CAST(Arg2)(arg2_)); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - move_binder2* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - move_binder2* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - move_binder2* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(ASIO_MOVE_ARG(Function) function, - move_binder2* this_handler) -{ - asio_handler_invoke_helpers::invoke( - ASIO_MOVE_CAST(Function)(function), this_handler->handler_); -} - -#endif // defined(ASIO_HAS_MOVE) - -} // namespace detail - -template -struct associated_allocator, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const detail::binder1& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_allocator, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const detail::binder2& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const detail::binder1& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -template -struct associated_executor, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const detail::binder2& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#if defined(ASIO_HAS_MOVE) - -template -struct associated_allocator, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const detail::move_binder1& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_allocator< - detail::move_binder2, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const detail::move_binder2& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const detail::move_binder1& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -template -struct associated_executor, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const detail::move_binder2& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // defined(ASIO_HAS_MOVE) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_BIND_HANDLER_HPP diff --git a/scout_sdk/asio/asio/detail/buffer_resize_guard.hpp b/scout_sdk/asio/asio/detail/buffer_resize_guard.hpp deleted file mode 100644 index 58ebc4c..0000000 --- a/scout_sdk/asio/asio/detail/buffer_resize_guard.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// detail/buffer_resize_guard.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP -#define ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/limits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Helper class to manage buffer resizing in an exception safe way. -template -class buffer_resize_guard -{ -public: - // Constructor. - buffer_resize_guard(Buffer& buffer) - : buffer_(buffer), - old_size_(buffer.size()) - { - } - - // Destructor rolls back the buffer resize unless commit was called. - ~buffer_resize_guard() - { - if (old_size_ != (std::numeric_limits::max)()) - { - buffer_.resize(old_size_); - } - } - - // Commit the resize transaction. - void commit() - { - old_size_ = (std::numeric_limits::max)(); - } - -private: - // The buffer being managed. - Buffer& buffer_; - - // The size of the buffer at the time the guard was constructed. - size_t old_size_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP diff --git a/scout_sdk/asio/asio/detail/buffer_sequence_adapter.hpp b/scout_sdk/asio/asio/detail/buffer_sequence_adapter.hpp deleted file mode 100644 index 92a8e3d..0000000 --- a/scout_sdk/asio/asio/detail/buffer_sequence_adapter.hpp +++ /dev/null @@ -1,544 +0,0 @@ -// -// detail/buffer_sequence_adapter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP -#define ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/buffer.hpp" -#include "asio/detail/array_fwd.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class buffer_sequence_adapter_base -{ -#if defined(ASIO_WINDOWS_RUNTIME) -public: - // The maximum number of buffers to support in a single operation. - enum { max_buffers = 1 }; - -protected: - typedef Windows::Storage::Streams::IBuffer^ native_buffer_type; - - ASIO_DECL static void init_native_buffer( - native_buffer_type& buf, - const asio::mutable_buffer& buffer); - - ASIO_DECL static void init_native_buffer( - native_buffer_type& buf, - const asio::const_buffer& buffer); -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) -public: - // The maximum number of buffers to support in a single operation. - enum { max_buffers = 64 < max_iov_len ? 64 : max_iov_len }; - -protected: - typedef WSABUF native_buffer_type; - - static void init_native_buffer(WSABUF& buf, - const asio::mutable_buffer& buffer) - { - buf.buf = static_cast(buffer.data()); - buf.len = static_cast(buffer.size()); - } - - static void init_native_buffer(WSABUF& buf, - const asio::const_buffer& buffer) - { - buf.buf = const_cast(static_cast(buffer.data())); - buf.len = static_cast(buffer.size()); - } -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -public: - // The maximum number of buffers to support in a single operation. - enum { max_buffers = 64 < max_iov_len ? 64 : max_iov_len }; - -protected: - typedef iovec native_buffer_type; - - static void init_iov_base(void*& base, void* addr) - { - base = addr; - } - - template - static void init_iov_base(T& base, void* addr) - { - base = static_cast(addr); - } - - static void init_native_buffer(iovec& iov, - const asio::mutable_buffer& buffer) - { - init_iov_base(iov.iov_base, buffer.data()); - iov.iov_len = buffer.size(); - } - - static void init_native_buffer(iovec& iov, - const asio::const_buffer& buffer) - { - init_iov_base(iov.iov_base, const_cast(buffer.data())); - iov.iov_len = buffer.size(); - } -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -}; - -// Helper class to translate buffers into the native buffer representation. -template -class buffer_sequence_adapter - : buffer_sequence_adapter_base -{ -public: - explicit buffer_sequence_adapter(const Buffers& buffer_sequence) - : count_(0), total_buffer_size_(0) - { - buffer_sequence_adapter::init( - asio::buffer_sequence_begin(buffer_sequence), - asio::buffer_sequence_end(buffer_sequence)); - } - - native_buffer_type* buffers() - { - return buffers_; - } - - std::size_t count() const - { - return count_; - } - - std::size_t total_size() const - { - return total_buffer_size_; - } - - bool all_empty() const - { - return total_buffer_size_ == 0; - } - - static bool all_empty(const Buffers& buffer_sequence) - { - return buffer_sequence_adapter::all_empty( - asio::buffer_sequence_begin(buffer_sequence), - asio::buffer_sequence_end(buffer_sequence)); - } - - static void validate(const Buffers& buffer_sequence) - { - buffer_sequence_adapter::validate( - asio::buffer_sequence_begin(buffer_sequence), - asio::buffer_sequence_end(buffer_sequence)); - } - - static Buffer first(const Buffers& buffer_sequence) - { - return buffer_sequence_adapter::first( - asio::buffer_sequence_begin(buffer_sequence), - asio::buffer_sequence_end(buffer_sequence)); - } - -private: - template - void init(Iterator begin, Iterator end) - { - Iterator iter = begin; - for (; iter != end && count_ < max_buffers; ++iter, ++count_) - { - Buffer buffer(*iter); - init_native_buffer(buffers_[count_], buffer); - total_buffer_size_ += buffer.size(); - } - } - - template - static bool all_empty(Iterator begin, Iterator end) - { - Iterator iter = begin; - std::size_t i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - if (Buffer(*iter).size() > 0) - return false; - return true; - } - - template - static void validate(Iterator begin, Iterator end) - { - Iterator iter = begin; - for (; iter != end; ++iter) - { - Buffer buffer(*iter); - buffer.data(); - } - } - - template - static Buffer first(Iterator begin, Iterator end) - { - Iterator iter = begin; - for (; iter != end; ++iter) - { - Buffer buffer(*iter); - if (buffer.size() != 0) - return buffer; - } - return Buffer(); - } - - native_buffer_type buffers_[max_buffers]; - std::size_t count_; - std::size_t total_buffer_size_; -}; - -template -class buffer_sequence_adapter - : buffer_sequence_adapter_base -{ -public: - explicit buffer_sequence_adapter( - const asio::mutable_buffer& buffer_sequence) - { - init_native_buffer(buffer_, Buffer(buffer_sequence)); - total_buffer_size_ = buffer_sequence.size(); - } - - native_buffer_type* buffers() - { - return &buffer_; - } - - std::size_t count() const - { - return 1; - } - - std::size_t total_size() const - { - return total_buffer_size_; - } - - bool all_empty() const - { - return total_buffer_size_ == 0; - } - - static bool all_empty(const asio::mutable_buffer& buffer_sequence) - { - return buffer_sequence.size() == 0; - } - - static void validate(const asio::mutable_buffer& buffer_sequence) - { - buffer_sequence.data(); - } - - static Buffer first(const asio::mutable_buffer& buffer_sequence) - { - return Buffer(buffer_sequence); - } - -private: - native_buffer_type buffer_; - std::size_t total_buffer_size_; -}; - -template -class buffer_sequence_adapter - : buffer_sequence_adapter_base -{ -public: - explicit buffer_sequence_adapter( - const asio::const_buffer& buffer_sequence) - { - init_native_buffer(buffer_, Buffer(buffer_sequence)); - total_buffer_size_ = buffer_sequence.size(); - } - - native_buffer_type* buffers() - { - return &buffer_; - } - - std::size_t count() const - { - return 1; - } - - std::size_t total_size() const - { - return total_buffer_size_; - } - - bool all_empty() const - { - return total_buffer_size_ == 0; - } - - static bool all_empty(const asio::const_buffer& buffer_sequence) - { - return buffer_sequence.size() == 0; - } - - static void validate(const asio::const_buffer& buffer_sequence) - { - buffer_sequence.data(); - } - - static Buffer first(const asio::const_buffer& buffer_sequence) - { - return Buffer(buffer_sequence); - } - -private: - native_buffer_type buffer_; - std::size_t total_buffer_size_; -}; - -#if !defined(ASIO_NO_DEPRECATED) - -template -class buffer_sequence_adapter - : buffer_sequence_adapter_base -{ -public: - explicit buffer_sequence_adapter( - const asio::mutable_buffers_1& buffer_sequence) - { - init_native_buffer(buffer_, Buffer(buffer_sequence)); - total_buffer_size_ = buffer_sequence.size(); - } - - native_buffer_type* buffers() - { - return &buffer_; - } - - std::size_t count() const - { - return 1; - } - - std::size_t total_size() const - { - return total_buffer_size_; - } - - bool all_empty() const - { - return total_buffer_size_ == 0; - } - - static bool all_empty(const asio::mutable_buffers_1& buffer_sequence) - { - return buffer_sequence.size() == 0; - } - - static void validate(const asio::mutable_buffers_1& buffer_sequence) - { - buffer_sequence.data(); - } - - static Buffer first(const asio::mutable_buffers_1& buffer_sequence) - { - return Buffer(buffer_sequence); - } - -private: - native_buffer_type buffer_; - std::size_t total_buffer_size_; -}; - -template -class buffer_sequence_adapter - : buffer_sequence_adapter_base -{ -public: - explicit buffer_sequence_adapter( - const asio::const_buffers_1& buffer_sequence) - { - init_native_buffer(buffer_, Buffer(buffer_sequence)); - total_buffer_size_ = buffer_sequence.size(); - } - - native_buffer_type* buffers() - { - return &buffer_; - } - - std::size_t count() const - { - return 1; - } - - std::size_t total_size() const - { - return total_buffer_size_; - } - - bool all_empty() const - { - return total_buffer_size_ == 0; - } - - static bool all_empty(const asio::const_buffers_1& buffer_sequence) - { - return buffer_sequence.size() == 0; - } - - static void validate(const asio::const_buffers_1& buffer_sequence) - { - buffer_sequence.data(); - } - - static Buffer first(const asio::const_buffers_1& buffer_sequence) - { - return Buffer(buffer_sequence); - } - -private: - native_buffer_type buffer_; - std::size_t total_buffer_size_; -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -class buffer_sequence_adapter > - : buffer_sequence_adapter_base -{ -public: - explicit buffer_sequence_adapter( - const boost::array& buffer_sequence) - { - init_native_buffer(buffers_[0], Buffer(buffer_sequence[0])); - init_native_buffer(buffers_[1], Buffer(buffer_sequence[1])); - total_buffer_size_ = buffer_sequence[0].size() + buffer_sequence[1].size(); - } - - native_buffer_type* buffers() - { - return buffers_; - } - - std::size_t count() const - { - return 2; - } - - std::size_t total_size() const - { - return total_buffer_size_; - } - - bool all_empty() const - { - return total_buffer_size_ == 0; - } - - static bool all_empty(const boost::array& buffer_sequence) - { - return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0; - } - - static void validate(const boost::array& buffer_sequence) - { - buffer_sequence[0].data(); - buffer_sequence[1].data(); - } - - static Buffer first(const boost::array& buffer_sequence) - { - return Buffer(buffer_sequence[0].size() != 0 - ? buffer_sequence[0] : buffer_sequence[1]); - } - -private: - native_buffer_type buffers_[2]; - std::size_t total_buffer_size_; -}; - -#if defined(ASIO_HAS_STD_ARRAY) - -template -class buffer_sequence_adapter > - : buffer_sequence_adapter_base -{ -public: - explicit buffer_sequence_adapter( - const std::array& buffer_sequence) - { - init_native_buffer(buffers_[0], Buffer(buffer_sequence[0])); - init_native_buffer(buffers_[1], Buffer(buffer_sequence[1])); - total_buffer_size_ = buffer_sequence[0].size() + buffer_sequence[1].size(); - } - - native_buffer_type* buffers() - { - return buffers_; - } - - std::size_t count() const - { - return 2; - } - - std::size_t total_size() const - { - return total_buffer_size_; - } - - bool all_empty() const - { - return total_buffer_size_ == 0; - } - - static bool all_empty(const std::array& buffer_sequence) - { - return buffer_sequence[0].size() == 0 && buffer_sequence[1].size() == 0; - } - - static void validate(const std::array& buffer_sequence) - { - buffer_sequence[0].data(); - buffer_sequence[1].data(); - } - - static Buffer first(const std::array& buffer_sequence) - { - return Buffer(buffer_sequence[0].size() != 0 - ? buffer_sequence[0] : buffer_sequence[1]); - } - -private: - native_buffer_type buffers_[2]; - std::size_t total_buffer_size_; -}; - -#endif // defined(ASIO_HAS_STD_ARRAY) - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/buffer_sequence_adapter.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_BUFFER_SEQUENCE_ADAPTER_HPP diff --git a/scout_sdk/asio/asio/detail/buffered_stream_storage.hpp b/scout_sdk/asio/asio/detail/buffered_stream_storage.hpp deleted file mode 100644 index c5eb081..0000000 --- a/scout_sdk/asio/asio/detail/buffered_stream_storage.hpp +++ /dev/null @@ -1,126 +0,0 @@ -// -// detail/buffered_stream_storage.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP -#define ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/buffer.hpp" -#include "asio/detail/assert.hpp" -#include -#include -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class buffered_stream_storage -{ -public: - // The type of the bytes stored in the buffer. - typedef unsigned char byte_type; - - // The type used for offsets into the buffer. - typedef std::size_t size_type; - - // Constructor. - explicit buffered_stream_storage(std::size_t buffer_capacity) - : begin_offset_(0), - end_offset_(0), - buffer_(buffer_capacity) - { - } - - /// Clear the buffer. - void clear() - { - begin_offset_ = 0; - end_offset_ = 0; - } - - // Return a pointer to the beginning of the unread data. - mutable_buffer data() - { - return asio::buffer(buffer_) + begin_offset_; - } - - // Return a pointer to the beginning of the unread data. - const_buffer data() const - { - return asio::buffer(buffer_) + begin_offset_; - } - - // Is there no unread data in the buffer. - bool empty() const - { - return begin_offset_ == end_offset_; - } - - // Return the amount of unread data the is in the buffer. - size_type size() const - { - return end_offset_ - begin_offset_; - } - - // Resize the buffer to the specified length. - void resize(size_type length) - { - ASIO_ASSERT(length <= capacity()); - if (begin_offset_ + length <= capacity()) - { - end_offset_ = begin_offset_ + length; - } - else - { - using namespace std; // For memmove. - memmove(&buffer_[0], &buffer_[0] + begin_offset_, size()); - end_offset_ = length; - begin_offset_ = 0; - } - } - - // Return the maximum size for data in the buffer. - size_type capacity() const - { - return buffer_.size(); - } - - // Consume multiple bytes from the beginning of the buffer. - void consume(size_type count) - { - ASIO_ASSERT(begin_offset_ + count <= end_offset_); - begin_offset_ += count; - if (empty()) - clear(); - } - -private: - // The offset to the beginning of the unread data. - size_type begin_offset_; - - // The offset to the end of the unread data. - size_type end_offset_; - - // The data in the buffer. - std::vector buffer_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP diff --git a/scout_sdk/asio/asio/detail/call_stack.hpp b/scout_sdk/asio/asio/detail/call_stack.hpp deleted file mode 100644 index 5725a10..0000000 --- a/scout_sdk/asio/asio/detail/call_stack.hpp +++ /dev/null @@ -1,125 +0,0 @@ -// -// detail/call_stack.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CALL_STACK_HPP -#define ASIO_DETAIL_CALL_STACK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/tss_ptr.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Helper class to determine whether or not the current thread is inside an -// invocation of io_context::run() for a specified io_context object. -template -class call_stack -{ -public: - // Context class automatically pushes the key/value pair on to the stack. - class context - : private noncopyable - { - public: - // Push the key on to the stack. - explicit context(Key* k) - : key_(k), - next_(call_stack::top_) - { - value_ = reinterpret_cast(this); - call_stack::top_ = this; - } - - // Push the key/value pair on to the stack. - context(Key* k, Value& v) - : key_(k), - value_(&v), - next_(call_stack::top_) - { - call_stack::top_ = this; - } - - // Pop the key/value pair from the stack. - ~context() - { - call_stack::top_ = next_; - } - - // Find the next context with the same key. - Value* next_by_key() const - { - context* elem = next_; - while (elem) - { - if (elem->key_ == key_) - return elem->value_; - elem = elem->next_; - } - return 0; - } - - private: - friend class call_stack; - - // The key associated with the context. - Key* key_; - - // The value associated with the context. - Value* value_; - - // The next element in the stack. - context* next_; - }; - - friend class context; - - // Determine whether the specified owner is on the stack. Returns address of - // key if present, 0 otherwise. - static Value* contains(Key* k) - { - context* elem = top_; - while (elem) - { - if (elem->key_ == k) - return elem->value_; - elem = elem->next_; - } - return 0; - } - - // Obtain the value at the top of the stack. - static Value* top() - { - context* elem = top_; - return elem ? elem->value_ : 0; - } - -private: - // The top of the stack of calls for the current thread. - static tss_ptr top_; -}; - -template -tss_ptr::context> -call_stack::top_; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CALL_STACK_HPP diff --git a/scout_sdk/asio/asio/detail/chrono.hpp b/scout_sdk/asio/asio/detail/chrono.hpp deleted file mode 100644 index 8f56bee..0000000 --- a/scout_sdk/asio/asio/detail/chrono.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// detail/chrono.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CHRONO_HPP -#define ASIO_DETAIL_CHRONO_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_CHRONO) -# include -#elif defined(ASIO_HAS_BOOST_CHRONO) -# include -#endif // defined(ASIO_HAS_BOOST_CHRONO) - -namespace asio { -namespace chrono { - -#if defined(ASIO_HAS_STD_CHRONO) -using std::chrono::duration; -using std::chrono::time_point; -using std::chrono::duration_cast; -using std::chrono::nanoseconds; -using std::chrono::microseconds; -using std::chrono::milliseconds; -using std::chrono::seconds; -using std::chrono::minutes; -using std::chrono::hours; -using std::chrono::time_point_cast; -#if defined(ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK) -typedef std::chrono::monotonic_clock steady_clock; -#else // defined(ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK) -using std::chrono::steady_clock; -#endif // defined(ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK) -using std::chrono::system_clock; -using std::chrono::high_resolution_clock; -#elif defined(ASIO_HAS_BOOST_CHRONO) -using boost::chrono::duration; -using boost::chrono::time_point; -using boost::chrono::duration_cast; -using boost::chrono::nanoseconds; -using boost::chrono::microseconds; -using boost::chrono::milliseconds; -using boost::chrono::seconds; -using boost::chrono::minutes; -using boost::chrono::hours; -using boost::chrono::time_point_cast; -using boost::chrono::system_clock; -using boost::chrono::steady_clock; -using boost::chrono::high_resolution_clock; -#endif // defined(ASIO_HAS_BOOST_CHRONO) - -} // namespace chrono -} // namespace asio - -#endif // ASIO_DETAIL_CHRONO_HPP diff --git a/scout_sdk/asio/asio/detail/chrono_time_traits.hpp b/scout_sdk/asio/asio/detail/chrono_time_traits.hpp deleted file mode 100644 index d1528f7..0000000 --- a/scout_sdk/asio/asio/detail/chrono_time_traits.hpp +++ /dev/null @@ -1,190 +0,0 @@ -// -// detail/chrono_time_traits.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP -#define ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/cstdint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Helper template to compute the greatest common divisor. -template -struct gcd { enum { value = gcd::value }; }; - -template -struct gcd { enum { value = v1 }; }; - -// Adapts std::chrono clocks for use with a deadline timer. -template -struct chrono_time_traits -{ - // The clock type. - typedef Clock clock_type; - - // The duration type of the clock. - typedef typename clock_type::duration duration_type; - - // The time point type of the clock. - typedef typename clock_type::time_point time_type; - - // The period of the clock. - typedef typename duration_type::period period_type; - - // Get the current time. - static time_type now() - { - return clock_type::now(); - } - - // Add a duration to a time. - static time_type add(const time_type& t, const duration_type& d) - { - const time_type epoch; - if (t >= epoch) - { - if ((time_type::max)() - t < d) - return (time_type::max)(); - } - else // t < epoch - { - if (-(t - (time_type::min)()) > d) - return (time_type::min)(); - } - - return t + d; - } - - // Subtract one time from another. - static duration_type subtract(const time_type& t1, const time_type& t2) - { - const time_type epoch; - if (t1 >= epoch) - { - if (t2 >= epoch) - { - return t1 - t2; - } - else if (t2 == (time_type::min)()) - { - return (duration_type::max)(); - } - else if ((time_type::max)() - t1 < epoch - t2) - { - return (duration_type::max)(); - } - else - { - return t1 - t2; - } - } - else // t1 < epoch - { - if (t2 < epoch) - { - return t1 - t2; - } - else if (t1 == (time_type::min)()) - { - return (duration_type::min)(); - } - else if ((time_type::max)() - t2 < epoch - t1) - { - return (duration_type::min)(); - } - else - { - return -(t2 - t1); - } - } - } - - // Test whether one time is less than another. - static bool less_than(const time_type& t1, const time_type& t2) - { - return t1 < t2; - } - - // Implement just enough of the posix_time::time_duration interface to supply - // what the timer_queue requires. - class posix_time_duration - { - public: - explicit posix_time_duration(const duration_type& d) - : d_(d) - { - } - - int64_t ticks() const - { - return d_.count(); - } - - int64_t total_seconds() const - { - return duration_cast<1, 1>(); - } - - int64_t total_milliseconds() const - { - return duration_cast<1, 1000>(); - } - - int64_t total_microseconds() const - { - return duration_cast<1, 1000000>(); - } - - private: - template - int64_t duration_cast() const - { - const int64_t num1 = period_type::num / gcd::value; - const int64_t num2 = Num / gcd::value; - - const int64_t den1 = period_type::den / gcd::value; - const int64_t den2 = Den / gcd::value; - - const int64_t num = num1 * den2; - const int64_t den = num2 * den1; - - if (num == 1 && den == 1) - return ticks(); - else if (num != 1 && den == 1) - return ticks() * num; - else if (num == 1 && period_type::den != 1) - return ticks() / den; - else - return ticks() * num / den; - } - - duration_type d_; - }; - - // Convert to POSIX duration type. - static posix_time_duration to_posix_duration(const duration_type& d) - { - return posix_time_duration(WaitTraits::to_wait_duration(d)); - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CHRONO_TIME_TRAITS_HPP diff --git a/scout_sdk/asio/asio/detail/completion_handler.hpp b/scout_sdk/asio/asio/detail/completion_handler.hpp deleted file mode 100644 index 58a2e6d..0000000 --- a/scout_sdk/asio/asio/detail/completion_handler.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// -// detail/completion_handler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_COMPLETION_HANDLER_HPP -#define ASIO_DETAIL_COMPLETION_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_work.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class completion_handler : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(completion_handler); - - completion_handler(Handler& h) - : operation(&completion_handler::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(h)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - completion_handler* h(static_cast(base)); - ptr p = { asio::detail::addressof(h->handler_), h, h }; - handler_work w(h->handler_); - - ASIO_HANDLER_COMPLETION((*h)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - Handler handler(ASIO_MOVE_CAST(Handler)(h->handler_)); - p.h = asio::detail::addressof(handler); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN(()); - w.complete(handler, handler); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_COMPLETION_HANDLER_HPP diff --git a/scout_sdk/asio/asio/detail/concurrency_hint.hpp b/scout_sdk/asio/asio/detail/concurrency_hint.hpp deleted file mode 100644 index 229124d..0000000 --- a/scout_sdk/asio/asio/detail/concurrency_hint.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// detail/concurrency_hint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CONCURRENCY_HINT_HPP -#define ASIO_DETAIL_CONCURRENCY_HINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/noncopyable.hpp" - -// The concurrency hint ID and mask are used to identify when a "well-known" -// concurrency hint value has been passed to the io_context. -#define ASIO_CONCURRENCY_HINT_ID 0xA5100000u -#define ASIO_CONCURRENCY_HINT_ID_MASK 0xFFFF0000u - -// If set, this bit indicates that the scheduler should perform locking. -#define ASIO_CONCURRENCY_HINT_LOCKING_SCHEDULER 0x1u - -// If set, this bit indicates that the reactor should perform locking when -// managing descriptor registrations. -#define ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_REGISTRATION 0x2u - -// If set, this bit indicates that the reactor should perform locking for I/O. -#define ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_IO 0x4u - -// Helper macro to determine if we have a special concurrency hint. -#define ASIO_CONCURRENCY_HINT_IS_SPECIAL(hint) \ - ((static_cast(hint) \ - & ASIO_CONCURRENCY_HINT_ID_MASK) \ - == ASIO_CONCURRENCY_HINT_ID) - -// Helper macro to determine if locking is enabled for a given facility. -#define ASIO_CONCURRENCY_HINT_IS_LOCKING(facility, hint) \ - (((static_cast(hint) \ - & (ASIO_CONCURRENCY_HINT_ID_MASK \ - | ASIO_CONCURRENCY_HINT_LOCKING_ ## facility)) \ - ^ ASIO_CONCURRENCY_HINT_ID) != 0) - -// This special concurrency hint disables locking in both the scheduler and -// reactor I/O. This hint has the following restrictions: -// -// - Care must be taken to ensure that all operations on the io_context and any -// of its associated I/O objects (such as sockets and timers) occur in only -// one thread at a time. -// -// - Asynchronous resolve operations fail with operation_not_supported. -// -// - If a signal_set is used with the io_context, signal_set objects cannot be -// used with any other io_context in the program. -#define ASIO_CONCURRENCY_HINT_UNSAFE \ - static_cast(ASIO_CONCURRENCY_HINT_ID) - -// This special concurrency hint disables locking in the reactor I/O. This hint -// has the following restrictions: -// -// - Care must be taken to ensure that run functions on the io_context, and all -// operations on the io_context's associated I/O objects (such as sockets and -// timers), occur in only one thread at a time. -#define ASIO_CONCURRENCY_HINT_UNSAFE_IO \ - static_cast(ASIO_CONCURRENCY_HINT_ID \ - | ASIO_CONCURRENCY_HINT_LOCKING_SCHEDULER \ - | ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_REGISTRATION) - -// The special concurrency hint provides full thread safety. -#define ASIO_CONCURRENCY_HINT_SAFE \ - static_cast(ASIO_CONCURRENCY_HINT_ID \ - | ASIO_CONCURRENCY_HINT_LOCKING_SCHEDULER \ - | ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_REGISTRATION \ - | ASIO_CONCURRENCY_HINT_LOCKING_REACTOR_IO) - -// This #define may be overridden at compile time to specify a program-wide -// default concurrency hint, used by the zero-argument io_context constructor. -#if !defined(ASIO_CONCURRENCY_HINT_DEFAULT) -# define ASIO_CONCURRENCY_HINT_DEFAULT -1 -#endif // !defined(ASIO_CONCURRENCY_HINT_DEFAULT) - -// This #define may be overridden at compile time to specify a program-wide -// concurrency hint, used by the one-argument io_context constructor when -// passed a value of 1. -#if !defined(ASIO_CONCURRENCY_HINT_1) -# define ASIO_CONCURRENCY_HINT_1 1 -#endif // !defined(ASIO_CONCURRENCY_HINT_DEFAULT) - -#endif // ASIO_DETAIL_CONCURRENCY_HINT_HPP diff --git a/scout_sdk/asio/asio/detail/conditionally_enabled_event.hpp b/scout_sdk/asio/asio/detail/conditionally_enabled_event.hpp deleted file mode 100644 index 0fda401..0000000 --- a/scout_sdk/asio/asio/detail/conditionally_enabled_event.hpp +++ /dev/null @@ -1,112 +0,0 @@ -// -// detail/conditionally_enabled_event.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP -#define ASIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/conditionally_enabled_mutex.hpp" -#include "asio/detail/event.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/null_event.hpp" -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Mutex adapter used to conditionally enable or disable locking. -class conditionally_enabled_event - : private noncopyable -{ -public: - // Constructor. - conditionally_enabled_event() - { - } - - // Destructor. - ~conditionally_enabled_event() - { - } - - // Signal the event. (Retained for backward compatibility.) - void signal(conditionally_enabled_mutex::scoped_lock& lock) - { - if (lock.mutex_.enabled_) - event_.signal(lock); - } - - // Signal all waiters. - void signal_all(conditionally_enabled_mutex::scoped_lock& lock) - { - if (lock.mutex_.enabled_) - event_.signal_all(lock); - } - - // Unlock the mutex and signal one waiter. - void unlock_and_signal_one( - conditionally_enabled_mutex::scoped_lock& lock) - { - if (lock.mutex_.enabled_) - event_.unlock_and_signal_one(lock); - } - - // If there's a waiter, unlock the mutex and signal it. - bool maybe_unlock_and_signal_one( - conditionally_enabled_mutex::scoped_lock& lock) - { - if (lock.mutex_.enabled_) - return event_.maybe_unlock_and_signal_one(lock); - else - return false; - } - - // Reset the event. - void clear(conditionally_enabled_mutex::scoped_lock& lock) - { - if (lock.mutex_.enabled_) - event_.clear(lock); - } - - // Wait for the event to become signalled. - void wait(conditionally_enabled_mutex::scoped_lock& lock) - { - if (lock.mutex_.enabled_) - event_.wait(lock); - else - null_event().wait(lock); - } - - // Timed wait for the event to become signalled. - bool wait_for_usec( - conditionally_enabled_mutex::scoped_lock& lock, long usec) - { - if (lock.mutex_.enabled_) - return event_.wait_for_usec(lock, usec); - else - return null_event().wait_for_usec(lock, usec); - } - -private: - asio::detail::event event_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CONDITIONALLY_ENABLED_EVENT_HPP diff --git a/scout_sdk/asio/asio/detail/conditionally_enabled_mutex.hpp b/scout_sdk/asio/asio/detail/conditionally_enabled_mutex.hpp deleted file mode 100644 index 2872db9..0000000 --- a/scout_sdk/asio/asio/detail/conditionally_enabled_mutex.hpp +++ /dev/null @@ -1,149 +0,0 @@ -// -// detail/conditionally_enabled_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP -#define ASIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Mutex adapter used to conditionally enable or disable locking. -class conditionally_enabled_mutex - : private noncopyable -{ -public: - // Helper class to lock and unlock a mutex automatically. - class scoped_lock - : private noncopyable - { - public: - // Tag type used to distinguish constructors. - enum adopt_lock_t { adopt_lock }; - - // Constructor adopts a lock that is already held. - scoped_lock(conditionally_enabled_mutex& m, adopt_lock_t) - : mutex_(m), - locked_(m.enabled_) - { - } - - // Constructor acquires the lock. - explicit scoped_lock(conditionally_enabled_mutex& m) - : mutex_(m) - { - if (m.enabled_) - { - mutex_.mutex_.lock(); - locked_ = true; - } - else - locked_ = false; - } - - // Destructor releases the lock. - ~scoped_lock() - { - if (locked_) - mutex_.mutex_.unlock(); - } - - // Explicitly acquire the lock. - void lock() - { - if (mutex_.enabled_ && !locked_) - { - mutex_.mutex_.lock(); - locked_ = true; - } - } - - // Explicitly release the lock. - void unlock() - { - if (locked_) - { - mutex_.unlock(); - locked_ = false; - } - } - - // Test whether the lock is held. - bool locked() const - { - return locked_; - } - - // Get the underlying mutex. - asio::detail::mutex& mutex() - { - return mutex_.mutex_; - } - - private: - friend class conditionally_enabled_event; - conditionally_enabled_mutex& mutex_; - bool locked_; - }; - - // Constructor. - explicit conditionally_enabled_mutex(bool enabled) - : enabled_(enabled) - { - } - - // Destructor. - ~conditionally_enabled_mutex() - { - } - - // Determine whether locking is enabled. - bool enabled() const - { - return enabled_; - } - - // Lock the mutex. - void lock() - { - if (enabled_) - mutex_.lock(); - } - - // Unlock the mutex. - void unlock() - { - if (enabled_) - mutex_.unlock(); - } - -private: - friend class scoped_lock; - friend class conditionally_enabled_event; - asio::detail::mutex mutex_; - const bool enabled_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CONDITIONALLY_ENABLED_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/config.hpp b/scout_sdk/asio/asio/detail/config.hpp deleted file mode 100644 index cde334e..0000000 --- a/scout_sdk/asio/asio/detail/config.hpp +++ /dev/null @@ -1,1437 +0,0 @@ -// -// detail/config.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CONFIG_HPP -#define ASIO_DETAIL_CONFIG_HPP - -#if defined(ASIO_STANDALONE) -# define ASIO_DISABLE_BOOST_ARRAY 1 -# define ASIO_DISABLE_BOOST_ASSERT 1 -# define ASIO_DISABLE_BOOST_BIND 1 -# define ASIO_DISABLE_BOOST_CHRONO 1 -# define ASIO_DISABLE_BOOST_DATE_TIME 1 -# define ASIO_DISABLE_BOOST_LIMITS 1 -# define ASIO_DISABLE_BOOST_REGEX 1 -# define ASIO_DISABLE_BOOST_STATIC_CONSTANT 1 -# define ASIO_DISABLE_BOOST_THROW_EXCEPTION 1 -# define ASIO_DISABLE_BOOST_WORKAROUND 1 -#else // defined(ASIO_STANDALONE) -# include -# include -# define ASIO_HAS_BOOST_CONFIG 1 -#endif // defined(ASIO_STANDALONE) - -// Default to a header-only implementation. The user must specifically request -// separate compilation by defining either ASIO_SEPARATE_COMPILATION or -// ASIO_DYN_LINK (as a DLL/shared library implies separate compilation). -#if !defined(ASIO_HEADER_ONLY) -# if !defined(ASIO_SEPARATE_COMPILATION) -# if !defined(ASIO_DYN_LINK) -# define ASIO_HEADER_ONLY 1 -# endif // !defined(ASIO_DYN_LINK) -# endif // !defined(ASIO_SEPARATE_COMPILATION) -#endif // !defined(ASIO_HEADER_ONLY) - -#if defined(ASIO_HEADER_ONLY) -# define ASIO_DECL inline -#else // defined(ASIO_HEADER_ONLY) -# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CODEGEARC__) -// We need to import/export our code only if the user has specifically asked -// for it by defining ASIO_DYN_LINK. -# if defined(ASIO_DYN_LINK) -// Export if this is our own source, otherwise import. -# if defined(ASIO_SOURCE) -# define ASIO_DECL __declspec(dllexport) -# else // defined(ASIO_SOURCE) -# define ASIO_DECL __declspec(dllimport) -# endif // defined(ASIO_SOURCE) -# endif // defined(ASIO_DYN_LINK) -# endif // defined(_MSC_VER) || defined(__BORLANDC__) || defined(__CODEGEARC__) -#endif // defined(ASIO_HEADER_ONLY) - -// If ASIO_DECL isn't defined yet define it now. -#if !defined(ASIO_DECL) -# define ASIO_DECL -#endif // !defined(ASIO_DECL) - -// Microsoft Visual C++ detection. -#if !defined(ASIO_MSVC) -# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_MSVC) -# define ASIO_MSVC BOOST_MSVC -# elif defined(_MSC_VER) && (defined(__INTELLISENSE__) \ - || (!defined(__MWERKS__) && !defined(__EDG_VERSION__))) -# define ASIO_MSVC _MSC_VER -# endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_MSVC) -#endif // !defined(ASIO_MSVC) -#if defined(ASIO_MSVC) -# include // Needed for _HAS_CXX17. -#endif // defined(ASIO_MSVC) - -// Clang / libc++ detection. -#if defined(__clang__) -# if (__cplusplus >= 201103) -# if __has_include(<__config>) -# include <__config> -# if defined(_LIBCPP_VERSION) -# define ASIO_HAS_CLANG_LIBCXX 1 -# endif // defined(_LIBCPP_VERSION) -# endif // __has_include(<__config>) -# endif // (__cplusplus >= 201103) -#endif // defined(__clang__) - -// Android platform detection. -#if defined(__ANDROID__) -# include -#endif // defined(__ANDROID__) - -// Support move construction and assignment on compilers known to allow it. -#if !defined(ASIO_HAS_MOVE) -# if !defined(ASIO_DISABLE_MOVE) -# if defined(__clang__) -# if __has_feature(__cxx_rvalue_references__) -# define ASIO_HAS_MOVE 1 -# endif // __has_feature(__cxx_rvalue_references__) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_MOVE 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_MOVE 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_MOVE) -#endif // !defined(ASIO_HAS_MOVE) - -// If ASIO_MOVE_CAST isn't defined, and move support is available, define -// ASIO_MOVE_ARG and ASIO_MOVE_CAST to take advantage of rvalue -// references and perfect forwarding. -#if defined(ASIO_HAS_MOVE) && !defined(ASIO_MOVE_CAST) -# define ASIO_MOVE_ARG(type) type&& -# define ASIO_MOVE_ARG2(type1, type2) type1, type2&& -# define ASIO_MOVE_CAST(type) static_cast -# define ASIO_MOVE_CAST2(type1, type2) static_cast -#endif // defined(ASIO_HAS_MOVE) && !defined(ASIO_MOVE_CAST) - -// If ASIO_MOVE_CAST still isn't defined, default to a C++03-compatible -// implementation. Note that older g++ and MSVC versions don't like it when you -// pass a non-member function through a const reference, so for most compilers -// we'll play it safe and stick with the old approach of passing the handler by -// value. -#if !defined(ASIO_MOVE_CAST) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4) -# define ASIO_MOVE_ARG(type) const type& -# else // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4) -# define ASIO_MOVE_ARG(type) type -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 1)) || (__GNUC__ > 4) -# elif defined(ASIO_MSVC) -# if (_MSC_VER >= 1400) -# define ASIO_MOVE_ARG(type) const type& -# else // (_MSC_VER >= 1400) -# define ASIO_MOVE_ARG(type) type -# endif // (_MSC_VER >= 1400) -# else -# define ASIO_MOVE_ARG(type) type -# endif -# define ASIO_MOVE_CAST(type) static_cast -# define ASIO_MOVE_CAST2(type1, type2) static_cast -#endif // !defined(ASIO_MOVE_CAST) - -// Support variadic templates on compilers known to allow it. -#if !defined(ASIO_HAS_VARIADIC_TEMPLATES) -# if !defined(ASIO_DISABLE_VARIADIC_TEMPLATES) -# if defined(__clang__) -# if __has_feature(__cxx_variadic_templates__) -# define ASIO_HAS_VARIADIC_TEMPLATES 1 -# endif // __has_feature(__cxx_variadic_templates__) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_VARIADIC_TEMPLATES 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1900) -# define ASIO_HAS_VARIADIC_TEMPLATES 1 -# endif // (_MSC_VER >= 1900) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_VARIADIC_TEMPLATES) -#endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -// Support deleted functions on compilers known to allow it. -#if !defined(ASIO_DELETED) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_DELETED = delete -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(__clang__) -# if __has_feature(__cxx_deleted_functions__) -# define ASIO_DELETED = delete -# endif // __has_feature(__cxx_deleted_functions__) -# endif // defined(__clang__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1900) -# define ASIO_DELETED = delete -# endif // (_MSC_VER >= 1900) -# endif // defined(ASIO_MSVC) -# if !defined(ASIO_DELETED) -# define ASIO_DELETED -# endif // !defined(ASIO_DELETED) -#endif // !defined(ASIO_DELETED) - -// Support constexpr on compilers known to allow it. -#if !defined(ASIO_HAS_CONSTEXPR) -# if !defined(ASIO_DISABLE_CONSTEXPR) -# if defined(__clang__) -# if __has_feature(__cxx_constexpr__) -# define ASIO_HAS_CONSTEXPR 1 -# endif // __has_feature(__cxx_constexr__) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_CONSTEXPR 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1900) -# define ASIO_HAS_CONSTEXPR 1 -# endif // (_MSC_VER >= 1900) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_CONSTEXPR) -#endif // !defined(ASIO_HAS_CONSTEXPR) -#if !defined(ASIO_CONSTEXPR) -# if defined(ASIO_HAS_CONSTEXPR) -# define ASIO_CONSTEXPR constexpr -# else // defined(ASIO_HAS_CONSTEXPR) -# define ASIO_CONSTEXPR -# endif // defined(ASIO_HAS_CONSTEXPR) -#endif // !defined(ASIO_CONSTEXPR) - -// Support noexcept on compilers known to allow it. -#if !defined(ASIO_NOEXCEPT) -# if !defined(ASIO_DISABLE_NOEXCEPT) -# if (BOOST_VERSION >= 105300) -# define ASIO_NOEXCEPT BOOST_NOEXCEPT -# define ASIO_NOEXCEPT_OR_NOTHROW BOOST_NOEXCEPT_OR_NOTHROW -# elif defined(__clang__) -# if __has_feature(__cxx_noexcept__) -# define ASIO_NOEXCEPT noexcept(true) -# define ASIO_NOEXCEPT_OR_NOTHROW noexcept(true) -# endif // __has_feature(__cxx_noexcept__) -# elif defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_NOEXCEPT noexcept(true) -# define ASIO_NOEXCEPT_OR_NOTHROW noexcept(true) -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# elif defined(ASIO_MSVC) -# if (_MSC_VER >= 1900) -# define ASIO_NOEXCEPT noexcept(true) -# define ASIO_NOEXCEPT_OR_NOTHROW noexcept(true) -# endif // (_MSC_VER >= 1900) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_NOEXCEPT) -# if !defined(ASIO_NOEXCEPT) -# define ASIO_NOEXCEPT -# endif // !defined(ASIO_NOEXCEPT) -# if !defined(ASIO_NOEXCEPT_OR_NOTHROW) -# define ASIO_NOEXCEPT_OR_NOTHROW throw() -# endif // !defined(ASIO_NOEXCEPT_OR_NOTHROW) -#endif // !defined(ASIO_NOEXCEPT) - -// Support automatic type deduction on compilers known to support it. -#if !defined(ASIO_HAS_DECLTYPE) -# if !defined(ASIO_DISABLE_DECLTYPE) -# if defined(__clang__) -# if __has_feature(__cxx_decltype__) -# define ASIO_HAS_DECLTYPE 1 -# endif // __has_feature(__cxx_decltype__) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_DECLTYPE 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_DECLTYPE 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_DECLTYPE) -#endif // !defined(ASIO_HAS_DECLTYPE) - -// Support alias templates on compilers known to allow it. -#if !defined(ASIO_HAS_ALIAS_TEMPLATES) -# if !defined(ASIO_DISABLE_ALIAS_TEMPLATES) -# if defined(__clang__) -# if __has_feature(__cxx_alias_templates__) -# define ASIO_HAS_ALIAS_TEMPLATES 1 -# endif // __has_feature(__cxx_alias_templates__) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_ALIAS_TEMPLATES 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1900) -# define ASIO_HAS_ALIAS_TEMPLATES 1 -# endif // (_MSC_VER >= 1900) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_ALIAS_TEMPLATES) -#endif // !defined(ASIO_HAS_ALIAS_TEMPLATES) - -// Standard library support for system errors. -#if !defined(ASIO_HAS_STD_SYSTEM_ERROR) -# if !defined(ASIO_DISABLE_STD_SYSTEM_ERROR) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_SYSTEM_ERROR 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_SYSTEM_ERROR 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_SYSTEM_ERROR 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_SYSTEM_ERROR 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_SYSTEM_ERROR) -#endif // !defined(ASIO_HAS_STD_SYSTEM_ERROR) - -// Compliant C++11 compilers put noexcept specifiers on error_category members. -#if !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) -# if (BOOST_VERSION >= 105300) -# define ASIO_ERROR_CATEGORY_NOEXCEPT BOOST_NOEXCEPT -# elif defined(__clang__) -# if __has_feature(__cxx_noexcept__) -# define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true) -# endif // __has_feature(__cxx_noexcept__) -# elif defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true) -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# elif defined(ASIO_MSVC) -# if (_MSC_VER >= 1900) -# define ASIO_ERROR_CATEGORY_NOEXCEPT noexcept(true) -# endif // (_MSC_VER >= 1900) -# endif // defined(ASIO_MSVC) -# if !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) -# define ASIO_ERROR_CATEGORY_NOEXCEPT -# endif // !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) -#endif // !defined(ASIO_ERROR_CATEGORY_NOEXCEPT) - -// Standard library support for arrays. -#if !defined(ASIO_HAS_STD_ARRAY) -# if !defined(ASIO_DISABLE_STD_ARRAY) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_ARRAY 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_ARRAY 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_ARRAY 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1600) -# define ASIO_HAS_STD_ARRAY 1 -# endif // (_MSC_VER >= 1600) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_ARRAY) -#endif // !defined(ASIO_HAS_STD_ARRAY) - -// Standard library support for shared_ptr and weak_ptr. -#if !defined(ASIO_HAS_STD_SHARED_PTR) -# if !defined(ASIO_DISABLE_STD_SHARED_PTR) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_SHARED_PTR 1 -# elif (__cplusplus >= 201103) -# define ASIO_HAS_STD_SHARED_PTR 1 -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_SHARED_PTR 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1600) -# define ASIO_HAS_STD_SHARED_PTR 1 -# endif // (_MSC_VER >= 1600) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_SHARED_PTR) -#endif // !defined(ASIO_HAS_STD_SHARED_PTR) - -// Standard library support for allocator_arg_t. -#if !defined(ASIO_HAS_STD_ALLOCATOR_ARG) -# if !defined(ASIO_DISABLE_STD_ALLOCATOR_ARG) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_ALLOCATOR_ARG 1 -# elif (__cplusplus >= 201103) -# define ASIO_HAS_STD_ALLOCATOR_ARG 1 -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_ALLOCATOR_ARG 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1600) -# define ASIO_HAS_STD_ALLOCATOR_ARG 1 -# endif // (_MSC_VER >= 1600) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_ALLOCATOR_ARG) -#endif // !defined(ASIO_HAS_STD_ALLOCATOR_ARG) - -// Standard library support for atomic operations. -#if !defined(ASIO_HAS_STD_ATOMIC) -# if !defined(ASIO_DISABLE_STD_ATOMIC) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_ATOMIC 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_ATOMIC 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_ATOMIC 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_ATOMIC 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_ATOMIC) -#endif // !defined(ASIO_HAS_STD_ATOMIC) - -// Standard library support for chrono. Some standard libraries (such as the -// libstdc++ shipped with gcc 4.6) provide monotonic_clock as per early C++0x -// drafts, rather than the eventually standardised name of steady_clock. -#if !defined(ASIO_HAS_STD_CHRONO) -# if !defined(ASIO_DISABLE_STD_CHRONO) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_CHRONO 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_CHRONO 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_CHRONO 1 -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ == 6)) -# define ASIO_HAS_STD_CHRONO_MONOTONIC_CLOCK 1 -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ == 6)) -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_CHRONO 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_CHRONO) -#endif // !defined(ASIO_HAS_STD_CHRONO) - -// Boost support for chrono. -#if !defined(ASIO_HAS_BOOST_CHRONO) -# if !defined(ASIO_DISABLE_BOOST_CHRONO) -# if (BOOST_VERSION >= 104700) -# define ASIO_HAS_BOOST_CHRONO 1 -# endif // (BOOST_VERSION >= 104700) -# endif // !defined(ASIO_DISABLE_BOOST_CHRONO) -#endif // !defined(ASIO_HAS_BOOST_CHRONO) - -// Some form of chrono library is available. -#if !defined(ASIO_HAS_CHRONO) -# if defined(ASIO_HAS_STD_CHRONO) \ - || defined(ASIO_HAS_BOOST_CHRONO) -# define ASIO_HAS_CHRONO 1 -# endif // defined(ASIO_HAS_STD_CHRONO) - // || defined(ASIO_HAS_BOOST_CHRONO) -#endif // !defined(ASIO_HAS_CHRONO) - -// Boost support for the DateTime library. -#if !defined(ASIO_HAS_BOOST_DATE_TIME) -# if !defined(ASIO_DISABLE_BOOST_DATE_TIME) -# define ASIO_HAS_BOOST_DATE_TIME 1 -# endif // !defined(ASIO_DISABLE_BOOST_DATE_TIME) -#endif // !defined(ASIO_HAS_BOOST_DATE_TIME) - -// Standard library support for addressof. -#if !defined(ASIO_HAS_STD_ADDRESSOF) -# if !defined(ASIO_DISABLE_STD_ADDRESSOF) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_ADDRESSOF 1 -# elif (__cplusplus >= 201103) -# define ASIO_HAS_STD_ADDRESSOF 1 -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_ADDRESSOF 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_ADDRESSOF 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_ADDRESSOF) -#endif // !defined(ASIO_HAS_STD_ADDRESSOF) - -// Standard library support for the function class. -#if !defined(ASIO_HAS_STD_FUNCTION) -# if !defined(ASIO_DISABLE_STD_FUNCTION) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_FUNCTION 1 -# elif (__cplusplus >= 201103) -# define ASIO_HAS_STD_FUNCTION 1 -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_FUNCTION 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_FUNCTION 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_FUNCTION) -#endif // !defined(ASIO_HAS_STD_FUNCTION) - -// Standard library support for type traits. -#if !defined(ASIO_HAS_STD_TYPE_TRAITS) -# if !defined(ASIO_DISABLE_STD_TYPE_TRAITS) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_TYPE_TRAITS 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_TYPE_TRAITS 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_TYPE_TRAITS 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_TYPE_TRAITS 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_TYPE_TRAITS) -#endif // !defined(ASIO_HAS_STD_TYPE_TRAITS) - -// Standard library support for the nullptr_t type. -#if !defined(ASIO_HAS_NULLPTR) -# if !defined(ASIO_DISABLE_NULLPTR) -# if defined(__clang__) -# if __has_feature(__cxx_nullptr__) -# define ASIO_HAS_NULLPTR 1 -# endif // __has_feature(__cxx_rvalue_references__) -# elif defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_NULLPTR 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 6)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_NULLPTR 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_NULLPTR) -#endif // !defined(ASIO_HAS_NULLPTR) - -// Standard library support for the C++11 allocator additions. -#if !defined(ASIO_HAS_CXX11_ALLOCATORS) -# if !defined(ASIO_DISABLE_CXX11_ALLOCATORS) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_CXX11_ALLOCATORS 1 -# elif (__cplusplus >= 201103) -# define ASIO_HAS_CXX11_ALLOCATORS 1 -# endif // (__cplusplus >= 201103) -# elif defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_CXX11_ALLOCATORS 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1800) -# define ASIO_HAS_CXX11_ALLOCATORS 1 -# endif // (_MSC_VER >= 1800) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_CXX11_ALLOCATORS) -#endif // !defined(ASIO_HAS_CXX11_ALLOCATORS) - -// Standard library support for the cstdint header. -#if !defined(ASIO_HAS_CSTDINT) -# if !defined(ASIO_DISABLE_CSTDINT) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_CSTDINT 1 -# elif (__cplusplus >= 201103) -# define ASIO_HAS_CSTDINT 1 -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_CSTDINT 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_CSTDINT 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_CSTDINT) -#endif // !defined(ASIO_HAS_CSTDINT) - -// Standard library support for the thread class. -#if !defined(ASIO_HAS_STD_THREAD) -# if !defined(ASIO_DISABLE_STD_THREAD) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_THREAD 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_THREAD 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_THREAD 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_THREAD 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_THREAD) -#endif // !defined(ASIO_HAS_STD_THREAD) - -// Standard library support for the mutex and condition variable classes. -#if !defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) -# if !defined(ASIO_DISABLE_STD_MUTEX_AND_CONDVAR) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_MUTEX_AND_CONDVAR 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_MUTEX_AND_CONDVAR) -#endif // !defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) - -// Standard library support for the call_once function. -#if !defined(ASIO_HAS_STD_CALL_ONCE) -# if !defined(ASIO_DISABLE_STD_CALL_ONCE) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_CALL_ONCE 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_CALL_ONCE 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_CALL_ONCE 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_CALL_ONCE 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_CALL_ONCE) -#endif // !defined(ASIO_HAS_STD_CALL_ONCE) - -// Standard library support for futures. -#if !defined(ASIO_HAS_STD_FUTURE) -# if !defined(ASIO_DISABLE_STD_FUTURE) -# if defined(__clang__) -# if defined(ASIO_HAS_CLANG_LIBCXX) -# define ASIO_HAS_STD_FUTURE 1 -# elif (__cplusplus >= 201103) -# if __has_include() -# define ASIO_HAS_STD_FUTURE 1 -# endif // __has_include() -# endif // (__cplusplus >= 201103) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# if defined(_GLIBCXX_HAS_GTHREADS) -# define ASIO_HAS_STD_FUTURE 1 -# endif // defined(_GLIBCXX_HAS_GTHREADS) -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 7)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_FUTURE 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_FUTURE) -#endif // !defined(ASIO_HAS_STD_FUTURE) - -// Standard library support for std::string_view. -#if !defined(ASIO_HAS_STD_STRING_VIEW) -# if !defined(ASIO_DISABLE_STD_STRING_VIEW) -# if defined(__clang__) -# if (__cplusplus >= 201703) -# if __has_include() -# define ASIO_HAS_STD_STRING_VIEW 1 -# endif // __has_include() -# endif // (__cplusplus >= 201703) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if (__GNUC__ >= 7) -# if (__cplusplus >= 201703) -# define ASIO_HAS_STD_STRING_VIEW 1 -# endif // (__cplusplus >= 201703) -# endif // (__GNUC__ >= 7) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1910 && _HAS_CXX17) -# define ASIO_HAS_STD_STRING_VIEW -# endif // (_MSC_VER >= 1910 && _HAS_CXX17) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_STRING_VIEW) -#endif // !defined(ASIO_HAS_STD_STRING_VIEW) - -// Standard library support for std::experimental::string_view. -#if !defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) -# if !defined(ASIO_DISABLE_STD_EXPERIMENTAL_STRING_VIEW) -# if defined(__clang__) -# if (__cplusplus >= 201402) -# if __has_include() -# define ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW 1 -# endif // __has_include() -# endif // (__cplusplus >= 201402) -# endif // defined(__clang__) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) || (__GNUC__ > 4) -# if (__cplusplus >= 201402) -# define ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW 1 -# endif // (__cplusplus >= 201402) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 9)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# endif // !defined(ASIO_DISABLE_STD_EXPERIMENTAL_STRING_VIEW) -#endif // !defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) - -// Standard library has a string_view that we can use. -#if !defined(ASIO_HAS_STRING_VIEW) -# if !defined(ASIO_DISABLE_STRING_VIEW) -# if defined(ASIO_HAS_STD_STRING_VIEW) -# define ASIO_HAS_STRING_VIEW 1 -# elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) -# define ASIO_HAS_STRING_VIEW 1 -# endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) -# endif // !defined(ASIO_DISABLE_STRING_VIEW) -#endif // !defined(ASIO_HAS_STRING_VIEW) - -// Standard library support for iostream move construction and assignment. -#if !defined(ASIO_HAS_STD_IOSTREAM_MOVE) -# if !defined(ASIO_DISABLE_STD_IOSTREAM_MOVE) -# if defined(__GNUC__) -# if (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_HAS_STD_IOSTREAM_MOVE 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_STD_IOSTREAM_MOVE 1 -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_IOSTREAM_MOVE) -#endif // !defined(ASIO_HAS_STD_IOSTREAM_MOVE) - -// Standard library has invoke_result (which supersedes result_of). -#if !defined(ASIO_HAS_STD_INVOKE_RESULT) -# if !defined(ASIO_DISABLE_STD_INVOKE_RESULT) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1910 && _HAS_CXX17) -# define ASIO_HAS_STD_INVOKE_RESULT 1 -# endif // (_MSC_VER >= 1910 && _HAS_CXX17) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_STD_INVOKE_RESULT) -#endif // !defined(ASIO_HAS_STD_INVOKE_RESULT) - -// Windows App target. Windows but with a limited API. -#if !defined(ASIO_WINDOWS_APP) -# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603) -# include -# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \ - && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -# define ASIO_WINDOWS_APP 1 -# endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) - // && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -# endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603) -#endif // !defined(ASIO_WINDOWS_APP) - -// Legacy WinRT target. Windows App is preferred. -#if !defined(ASIO_WINDOWS_RUNTIME) -# if !defined(ASIO_WINDOWS_APP) -# if defined(__cplusplus_winrt) -# include -# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \ - && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -# define ASIO_WINDOWS_RUNTIME 1 -# endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) - // && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) -# endif // defined(__cplusplus_winrt) -# endif // !defined(ASIO_WINDOWS_APP) -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -// Windows target. Excludes WinRT but includes Windows App targets. -#if !defined(ASIO_WINDOWS) -# if !defined(ASIO_WINDOWS_RUNTIME) -# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS) -# define ASIO_WINDOWS 1 -# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) -# define ASIO_WINDOWS 1 -# elif defined(ASIO_WINDOWS_APP) -# define ASIO_WINDOWS 1 -# endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS) -# endif // !defined(ASIO_WINDOWS_RUNTIME) -#endif // !defined(ASIO_WINDOWS) - -// Windows: target OS version. -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if !defined(_WIN32_WINNT) && !defined(_WIN32_WINDOWS) -# if defined(_MSC_VER) || defined(__BORLANDC__) -# pragma message( \ - "Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. For example:\n"\ - "- add -D_WIN32_WINNT=0x0501 to the compiler command line; or\n"\ - "- add _WIN32_WINNT=0x0501 to your project's Preprocessor Definitions.\n"\ - "Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target).") -# else // defined(_MSC_VER) || defined(__BORLANDC__) -# warning Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately. -# warning For example, add -D_WIN32_WINNT=0x0501 to the compiler command line. -# warning Assuming _WIN32_WINNT=0x0501 (i.e. Windows XP target). -# endif // defined(_MSC_VER) || defined(__BORLANDC__) -# define _WIN32_WINNT 0x0501 -# endif // !defined(_WIN32_WINNT) && !defined(_WIN32_WINDOWS) -# if defined(_MSC_VER) -# if defined(_WIN32) && !defined(WIN32) -# if !defined(_WINSOCK2API_) -# define WIN32 // Needed for correct types in winsock2.h -# else // !defined(_WINSOCK2API_) -# error Please define the macro WIN32 in your compiler options -# endif // !defined(_WINSOCK2API_) -# endif // defined(_WIN32) && !defined(WIN32) -# endif // defined(_MSC_VER) -# if defined(__BORLANDC__) -# if defined(__WIN32__) && !defined(WIN32) -# if !defined(_WINSOCK2API_) -# define WIN32 // Needed for correct types in winsock2.h -# else // !defined(_WINSOCK2API_) -# error Please define the macro WIN32 in your compiler options -# endif // !defined(_WINSOCK2API_) -# endif // defined(__WIN32__) && !defined(WIN32) -# endif // defined(__BORLANDC__) -# if defined(__CYGWIN__) -# if !defined(__USE_W32_SOCKETS) -# error You must add -D__USE_W32_SOCKETS to your compiler options. -# endif // !defined(__USE_W32_SOCKETS) -# endif // defined(__CYGWIN__) -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -// Windows: minimise header inclusion. -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if !defined(ASIO_NO_WIN32_LEAN_AND_MEAN) -# if !defined(WIN32_LEAN_AND_MEAN) -# define WIN32_LEAN_AND_MEAN -# endif // !defined(WIN32_LEAN_AND_MEAN) -# endif // !defined(ASIO_NO_WIN32_LEAN_AND_MEAN) -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -// Windows: suppress definition of "min" and "max" macros. -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if !defined(ASIO_NO_NOMINMAX) -# if !defined(NOMINMAX) -# define NOMINMAX 1 -# endif // !defined(NOMINMAX) -# endif // !defined(ASIO_NO_NOMINMAX) -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -// Windows: IO Completion Ports. -#if !defined(ASIO_HAS_IOCP) -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400) -# if !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) -# if !defined(ASIO_DISABLE_IOCP) -# define ASIO_HAS_IOCP 1 -# endif // !defined(ASIO_DISABLE_IOCP) -# endif // !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) -# endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400) -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -#endif // !defined(ASIO_HAS_IOCP) - -// On POSIX (and POSIX-like) platforms we need to include unistd.h in order to -// get access to the various platform feature macros, e.g. to be able to test -// for threads support. -#if !defined(ASIO_HAS_UNISTD_H) -# if !defined(ASIO_HAS_BOOST_CONFIG) -# if defined(unix) \ - || defined(__unix) \ - || defined(_XOPEN_SOURCE) \ - || defined(_POSIX_SOURCE) \ - || (defined(__MACH__) && defined(__APPLE__)) \ - || defined(__FreeBSD__) \ - || defined(__NetBSD__) \ - || defined(__OpenBSD__) \ - || defined(__linux__) -# define ASIO_HAS_UNISTD_H 1 -# endif -# endif // !defined(ASIO_HAS_BOOST_CONFIG) -#endif // !defined(ASIO_HAS_UNISTD_H) -#if defined(ASIO_HAS_UNISTD_H) -# include -#endif // defined(ASIO_HAS_UNISTD_H) - -// Linux: epoll, eventfd and timerfd. -#if defined(__linux__) -# include -# if !defined(ASIO_HAS_EPOLL) -# if !defined(ASIO_DISABLE_EPOLL) -# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,45) -# define ASIO_HAS_EPOLL 1 -# endif // LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,45) -# endif // !defined(ASIO_DISABLE_EPOLL) -# endif // !defined(ASIO_HAS_EPOLL) -# if !defined(ASIO_HAS_EVENTFD) -# if !defined(ASIO_DISABLE_EVENTFD) -# if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) -# define ASIO_HAS_EVENTFD 1 -# endif // LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) -# endif // !defined(ASIO_DISABLE_EVENTFD) -# endif // !defined(ASIO_HAS_EVENTFD) -# if !defined(ASIO_HAS_TIMERFD) -# if defined(ASIO_HAS_EPOLL) -# if (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) -# define ASIO_HAS_TIMERFD 1 -# endif // (__GLIBC__ > 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) -# endif // defined(ASIO_HAS_EPOLL) -# endif // !defined(ASIO_HAS_TIMERFD) -#endif // defined(__linux__) - -// Mac OS X, FreeBSD, NetBSD, OpenBSD: kqueue. -#if (defined(__MACH__) && defined(__APPLE__)) \ - || defined(__FreeBSD__) \ - || defined(__NetBSD__) \ - || defined(__OpenBSD__) -# if !defined(ASIO_HAS_KQUEUE) -# if !defined(ASIO_DISABLE_KQUEUE) -# define ASIO_HAS_KQUEUE 1 -# endif // !defined(ASIO_DISABLE_KQUEUE) -# endif // !defined(ASIO_HAS_KQUEUE) -#endif // (defined(__MACH__) && defined(__APPLE__)) - // || defined(__FreeBSD__) - // || defined(__NetBSD__) - // || defined(__OpenBSD__) - -// Solaris: /dev/poll. -#if defined(__sun) -# if !defined(ASIO_HAS_DEV_POLL) -# if !defined(ASIO_DISABLE_DEV_POLL) -# define ASIO_HAS_DEV_POLL 1 -# endif // !defined(ASIO_DISABLE_DEV_POLL) -# endif // !defined(ASIO_HAS_DEV_POLL) -#endif // defined(__sun) - -// Serial ports. -#if !defined(ASIO_HAS_SERIAL_PORT) -# if defined(ASIO_HAS_IOCP) \ - || !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) -# if !defined(__SYMBIAN32__) -# if !defined(ASIO_DISABLE_SERIAL_PORT) -# define ASIO_HAS_SERIAL_PORT 1 -# endif // !defined(ASIO_DISABLE_SERIAL_PORT) -# endif // !defined(__SYMBIAN32__) -# endif // defined(ASIO_HAS_IOCP) - // || !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -#endif // !defined(ASIO_HAS_SERIAL_PORT) - -// Windows: stream handles. -#if !defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) -# if !defined(ASIO_DISABLE_WINDOWS_STREAM_HANDLE) -# if defined(ASIO_HAS_IOCP) -# define ASIO_HAS_WINDOWS_STREAM_HANDLE 1 -# endif // defined(ASIO_HAS_IOCP) -# endif // !defined(ASIO_DISABLE_WINDOWS_STREAM_HANDLE) -#endif // !defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) - -// Windows: random access handles. -#if !defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) -# if !defined(ASIO_DISABLE_WINDOWS_RANDOM_ACCESS_HANDLE) -# if defined(ASIO_HAS_IOCP) -# define ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE 1 -# endif // defined(ASIO_HAS_IOCP) -# endif // !defined(ASIO_DISABLE_WINDOWS_RANDOM_ACCESS_HANDLE) -#endif // !defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) - -// Windows: object handles. -#if !defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) -# if !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE) -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) -# define ASIO_HAS_WINDOWS_OBJECT_HANDLE 1 -# endif // !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP) -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# endif // !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE) -#endif // !defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - -// Windows: OVERLAPPED wrapper. -#if !defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) -# if !defined(ASIO_DISABLE_WINDOWS_OVERLAPPED_PTR) -# if defined(ASIO_HAS_IOCP) -# define ASIO_HAS_WINDOWS_OVERLAPPED_PTR 1 -# endif // defined(ASIO_HAS_IOCP) -# endif // !defined(ASIO_DISABLE_WINDOWS_OVERLAPPED_PTR) -#endif // !defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) - -// POSIX: stream-oriented file descriptors. -#if !defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) -# if !defined(ASIO_DISABLE_POSIX_STREAM_DESCRIPTOR) -# if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) -# define ASIO_HAS_POSIX_STREAM_DESCRIPTOR 1 -# endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -# endif // !defined(ASIO_DISABLE_POSIX_STREAM_DESCRIPTOR) -#endif // !defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - -// UNIX domain sockets. -#if !defined(ASIO_HAS_LOCAL_SOCKETS) -# if !defined(ASIO_DISABLE_LOCAL_SOCKETS) -# if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) -# define ASIO_HAS_LOCAL_SOCKETS 1 -# endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -# endif // !defined(ASIO_DISABLE_LOCAL_SOCKETS) -#endif // !defined(ASIO_HAS_LOCAL_SOCKETS) - -// Can use sigaction() instead of signal(). -#if !defined(ASIO_HAS_SIGACTION) -# if !defined(ASIO_DISABLE_SIGACTION) -# if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) -# define ASIO_HAS_SIGACTION 1 -# endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -# endif // !defined(ASIO_DISABLE_SIGACTION) -#endif // !defined(ASIO_HAS_SIGACTION) - -// Can use signal(). -#if !defined(ASIO_HAS_SIGNAL) -# if !defined(ASIO_DISABLE_SIGNAL) -# if !defined(UNDER_CE) -# define ASIO_HAS_SIGNAL 1 -# endif // !defined(UNDER_CE) -# endif // !defined(ASIO_DISABLE_SIGNAL) -#endif // !defined(ASIO_HAS_SIGNAL) - -// Can use getaddrinfo() and getnameinfo(). -#if !defined(ASIO_HAS_GETADDRINFO) -# if !defined(ASIO_DISABLE_GETADDRINFO) -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) -# define ASIO_HAS_GETADDRINFO 1 -# elif defined(UNDER_CE) -# define ASIO_HAS_GETADDRINFO 1 -# endif // defined(UNDER_CE) -# elif defined(__MACH__) && defined(__APPLE__) -# if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -# if (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) -# define ASIO_HAS_GETADDRINFO 1 -# endif // (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1050) -# else // defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -# define ASIO_HAS_GETADDRINFO 1 -# endif // defined(__MAC_OS_X_VERSION_MIN_REQUIRED) -# else // defined(__MACH__) && defined(__APPLE__) -# define ASIO_HAS_GETADDRINFO 1 -# endif // defined(__MACH__) && defined(__APPLE__) -# endif // !defined(ASIO_DISABLE_GETADDRINFO) -#endif // !defined(ASIO_HAS_GETADDRINFO) - -// Whether standard iostreams are disabled. -#if !defined(ASIO_NO_IOSTREAM) -# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_NO_IOSTREAM) -# define ASIO_NO_IOSTREAM 1 -# endif // !defined(BOOST_NO_IOSTREAM) -#endif // !defined(ASIO_NO_IOSTREAM) - -// Whether exception handling is disabled. -#if !defined(ASIO_NO_EXCEPTIONS) -# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_NO_EXCEPTIONS) -# define ASIO_NO_EXCEPTIONS 1 -# endif // !defined(BOOST_NO_EXCEPTIONS) -#endif // !defined(ASIO_NO_EXCEPTIONS) - -// Whether the typeid operator is supported. -#if !defined(ASIO_NO_TYPEID) -# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_NO_TYPEID) -# define ASIO_NO_TYPEID 1 -# endif // !defined(BOOST_NO_TYPEID) -#endif // !defined(ASIO_NO_TYPEID) - -// Threads. -#if !defined(ASIO_HAS_THREADS) -# if !defined(ASIO_DISABLE_THREADS) -# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_THREADS) -# define ASIO_HAS_THREADS 1 -# elif defined(__GNUC__) && !defined(__MINGW32__) \ - && !defined(linux) && !defined(__linux) && !defined(__linux__) -# define ASIO_HAS_THREADS 1 -# elif defined(_MT) || defined(__MT__) -# define ASIO_HAS_THREADS 1 -# elif defined(_REENTRANT) -# define ASIO_HAS_THREADS 1 -# elif defined(__APPLE__) -# define ASIO_HAS_THREADS 1 -# elif defined(_POSIX_THREADS) && (_POSIX_THREADS + 0 >= 0) -# define ASIO_HAS_THREADS 1 -# elif defined(_PTHREADS) -# define ASIO_HAS_THREADS 1 -# endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_THREADS) -# endif // !defined(ASIO_DISABLE_THREADS) -#endif // !defined(ASIO_HAS_THREADS) - -// POSIX threads. -#if !defined(ASIO_HAS_PTHREADS) -# if defined(ASIO_HAS_THREADS) -# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_PTHREADS) -# define ASIO_HAS_PTHREADS 1 -# elif defined(_POSIX_THREADS) && (_POSIX_THREADS + 0 >= 0) -# define ASIO_HAS_PTHREADS 1 -# endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_HAS_PTHREADS) -# endif // defined(ASIO_HAS_THREADS) -#endif // !defined(ASIO_HAS_PTHREADS) - -// Helper to prevent macro expansion. -#define ASIO_PREVENT_MACRO_SUBSTITUTION - -// Helper to define in-class constants. -#if !defined(ASIO_STATIC_CONSTANT) -# if !defined(ASIO_DISABLE_BOOST_STATIC_CONSTANT) -# define ASIO_STATIC_CONSTANT(type, assignment) \ - BOOST_STATIC_CONSTANT(type, assignment) -# else // !defined(ASIO_DISABLE_BOOST_STATIC_CONSTANT) -# define ASIO_STATIC_CONSTANT(type, assignment) \ - static const type assignment -# endif // !defined(ASIO_DISABLE_BOOST_STATIC_CONSTANT) -#endif // !defined(ASIO_STATIC_CONSTANT) - -// Boost array library. -#if !defined(ASIO_HAS_BOOST_ARRAY) -# if !defined(ASIO_DISABLE_BOOST_ARRAY) -# define ASIO_HAS_BOOST_ARRAY 1 -# endif // !defined(ASIO_DISABLE_BOOST_ARRAY) -#endif // !defined(ASIO_HAS_BOOST_ARRAY) - -// Boost assert macro. -#if !defined(ASIO_HAS_BOOST_ASSERT) -# if !defined(ASIO_DISABLE_BOOST_ASSERT) -# define ASIO_HAS_BOOST_ASSERT 1 -# endif // !defined(ASIO_DISABLE_BOOST_ASSERT) -#endif // !defined(ASIO_HAS_BOOST_ASSERT) - -// Boost limits header. -#if !defined(ASIO_HAS_BOOST_LIMITS) -# if !defined(ASIO_DISABLE_BOOST_LIMITS) -# define ASIO_HAS_BOOST_LIMITS 1 -# endif // !defined(ASIO_DISABLE_BOOST_LIMITS) -#endif // !defined(ASIO_HAS_BOOST_LIMITS) - -// Boost throw_exception function. -#if !defined(ASIO_HAS_BOOST_THROW_EXCEPTION) -# if !defined(ASIO_DISABLE_BOOST_THROW_EXCEPTION) -# define ASIO_HAS_BOOST_THROW_EXCEPTION 1 -# endif // !defined(ASIO_DISABLE_BOOST_THROW_EXCEPTION) -#endif // !defined(ASIO_HAS_BOOST_THROW_EXCEPTION) - -// Boost regex library. -#if !defined(ASIO_HAS_BOOST_REGEX) -# if !defined(ASIO_DISABLE_BOOST_REGEX) -# define ASIO_HAS_BOOST_REGEX 1 -# endif // !defined(ASIO_DISABLE_BOOST_REGEX) -#endif // !defined(ASIO_HAS_BOOST_REGEX) - -// Boost bind function. -#if !defined(ASIO_HAS_BOOST_BIND) -# if !defined(ASIO_DISABLE_BOOST_BIND) -# define ASIO_HAS_BOOST_BIND 1 -# endif // !defined(ASIO_DISABLE_BOOST_BIND) -#endif // !defined(ASIO_HAS_BOOST_BIND) - -// Boost's BOOST_WORKAROUND macro. -#if !defined(ASIO_HAS_BOOST_WORKAROUND) -# if !defined(ASIO_DISABLE_BOOST_WORKAROUND) -# define ASIO_HAS_BOOST_WORKAROUND 1 -# endif // !defined(ASIO_DISABLE_BOOST_WORKAROUND) -#endif // !defined(ASIO_HAS_BOOST_WORKAROUND) - -// Microsoft Visual C++'s secure C runtime library. -#if !defined(ASIO_HAS_SECURE_RTL) -# if !defined(ASIO_DISABLE_SECURE_RTL) -# if defined(ASIO_MSVC) \ - && (ASIO_MSVC >= 1400) \ - && !defined(UNDER_CE) -# define ASIO_HAS_SECURE_RTL 1 -# endif // defined(ASIO_MSVC) - // && (ASIO_MSVC >= 1400) - // && !defined(UNDER_CE) -# endif // !defined(ASIO_DISABLE_SECURE_RTL) -#endif // !defined(ASIO_HAS_SECURE_RTL) - -// Handler hooking. Disabled for ancient Borland C++ and gcc compilers. -#if !defined(ASIO_HAS_HANDLER_HOOKS) -# if !defined(ASIO_DISABLE_HANDLER_HOOKS) -# if defined(__GNUC__) -# if (__GNUC__ >= 3) -# define ASIO_HAS_HANDLER_HOOKS 1 -# endif // (__GNUC__ >= 3) -# elif !defined(__BORLANDC__) -# define ASIO_HAS_HANDLER_HOOKS 1 -# endif // !defined(__BORLANDC__) -# endif // !defined(ASIO_DISABLE_HANDLER_HOOKS) -#endif // !defined(ASIO_HAS_HANDLER_HOOKS) - -// Support for the __thread keyword extension. -#if !defined(ASIO_DISABLE_THREAD_KEYWORD_EXTENSION) -# if defined(__linux__) -# if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -# if ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3) -# if !defined(__INTEL_COMPILER) && !defined(__ICL) \ - && !(defined(__clang__) && defined(__ANDROID__)) -# define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1 -# define ASIO_THREAD_KEYWORD __thread -# elif defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1100) -# define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1 -# endif // defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 1100) - // && !(defined(__clang__) && defined(__ANDROID__)) -# endif // ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3) -# endif // defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -# endif // defined(__linux__) -# if defined(ASIO_MSVC) && defined(ASIO_WINDOWS_RUNTIME) -# if (_MSC_VER >= 1700) -# define ASIO_HAS_THREAD_KEYWORD_EXTENSION 1 -# define ASIO_THREAD_KEYWORD __declspec(thread) -# endif // (_MSC_VER >= 1700) -# endif // defined(ASIO_MSVC) && defined(ASIO_WINDOWS_RUNTIME) -#endif // !defined(ASIO_DISABLE_THREAD_KEYWORD_EXTENSION) -#if !defined(ASIO_THREAD_KEYWORD) -# define ASIO_THREAD_KEYWORD __thread -#endif // !defined(ASIO_THREAD_KEYWORD) - -// Support for POSIX ssize_t typedef. -#if !defined(ASIO_DISABLE_SSIZE_T) -# if defined(__linux__) \ - || (defined(__MACH__) && defined(__APPLE__)) -# define ASIO_HAS_SSIZE_T 1 -# endif // defined(__linux__) - // || (defined(__MACH__) && defined(__APPLE__)) -#endif // !defined(ASIO_DISABLE_SSIZE_T) - -// Helper macros to manage the transition away from the old services-based API. -#if defined(ASIO_ENABLE_OLD_SERVICES) -# define ASIO_SVC_TPARAM , typename Service -# define ASIO_SVC_TPARAM_DEF1(d1) , typename Service d1 -# define ASIO_SVC_TPARAM_DEF2(d1, d2) , typename Service d1, d2 -# define ASIO_SVC_TARG , Service -# define ASIO_SVC_T Service -# define ASIO_SVC_TPARAM1 , typename Service1 -# define ASIO_SVC_TPARAM1_DEF1(d1) , typename Service1 d1 -# define ASIO_SVC_TPARAM1_DEF2(d1, d2) , typename Service1 d1, d2 -# define ASIO_SVC_TARG1 , Service1 -# define ASIO_SVC_T1 Service1 -# define ASIO_SVC_ACCESS public -#else // defined(ASIO_ENABLE_OLD_SERVICES) -# define ASIO_SVC_TPARAM -# define ASIO_SVC_TPARAM_DEF1(d1) -# define ASIO_SVC_TPARAM_DEF2(d1, d2) -# define ASIO_SVC_TARG -// ASIO_SVC_T is defined at each point of use. -# define ASIO_SVC_TPARAM1 -# define ASIO_SVC_TPARAM1_DEF1(d1) -# define ASIO_SVC_TPARAM1_DEF2(d1, d2) -# define ASIO_SVC_TARG1 -// ASIO_SVC_T1 is defined at each point of use. -# define ASIO_SVC_ACCESS protected -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -// Helper macros to manage transition away from error_code return values. -#if defined(ASIO_NO_DEPRECATED) -# define ASIO_SYNC_OP_VOID void -# define ASIO_SYNC_OP_VOID_RETURN(e) return -#else // defined(ASIO_NO_DEPRECATED) -# define ASIO_SYNC_OP_VOID asio::error_code -# define ASIO_SYNC_OP_VOID_RETURN(e) return e -#endif // defined(ASIO_NO_DEPRECATED) - -// Newer gcc, clang need special treatment to suppress unused typedef warnings. -#if defined(__clang__) -# if defined(__apple_build_version__) -# if (__clang_major__ >= 7) -# define ASIO_UNUSED_TYPEDEF __attribute__((__unused__)) -# endif // (__clang_major__ >= 7) -# elif ((__clang_major__ == 3) && (__clang_minor__ >= 6)) \ - || (__clang_major__ > 3) -# define ASIO_UNUSED_TYPEDEF __attribute__((__unused__)) -# endif // ((__clang_major__ == 3) && (__clang_minor__ >= 6)) - // || (__clang_major__ > 3) -#elif defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4) -# define ASIO_UNUSED_TYPEDEF __attribute__((__unused__)) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 8)) || (__GNUC__ > 4) -#endif // defined(__GNUC__) -#if !defined(ASIO_UNUSED_TYPEDEF) -# define ASIO_UNUSED_TYPEDEF -#endif // !defined(ASIO_UNUSED_TYPEDEF) - -// Some versions of gcc generate spurious warnings about unused variables. -#if defined(__GNUC__) -# if (__GNUC__ >= 4) -# define ASIO_UNUSED_VARIABLE __attribute__((__unused__)) -# endif // (__GNUC__ >= 4) -#endif // defined(__GNUC__) -#if !defined(ASIO_UNUSED_VARIABLE) -# define ASIO_UNUSED_VARIABLE -#endif // !defined(ASIO_UNUSED_VARIABLE) - -// Support co_await on compilers known to allow it. -#if !defined(ASIO_HAS_CO_AWAIT) -# if !defined(ASIO_DISABLE_CO_AWAIT) -# if defined(ASIO_MSVC) -# if (_MSC_FULL_VER >= 190023506) -# if defined(_RESUMABLE_FUNCTIONS_SUPPORTED) -# define ASIO_HAS_CO_AWAIT 1 -# endif // defined(_RESUMABLE_FUNCTIONS_SUPPORTED) -# endif // (_MSC_FULL_VER >= 190023506) -# endif // defined(ASIO_MSVC) -# endif // !defined(ASIO_DISABLE_CO_AWAIT) -# if defined(__clang__) -# if (__cpp_coroutines >= 201703) -# if __has_include() -# define ASIO_HAS_CO_AWAIT 1 -# endif // __has_include() -# endif // (__cpp_coroutines >= 201703) -# endif // defined(__clang__) -#endif // !defined(ASIO_HAS_CO_AWAIT) - -#endif // ASIO_DETAIL_CONFIG_HPP diff --git a/scout_sdk/asio/asio/detail/consuming_buffers.hpp b/scout_sdk/asio/asio/detail/consuming_buffers.hpp deleted file mode 100644 index 8127ae7..0000000 --- a/scout_sdk/asio/asio/detail/consuming_buffers.hpp +++ /dev/null @@ -1,414 +0,0 @@ -// -// detail/consuming_buffers.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CONSUMING_BUFFERS_HPP -#define ASIO_DETAIL_CONSUMING_BUFFERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/buffer.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/limits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Helper template to determine the maximum number of prepared buffers. -template -struct prepared_buffers_max -{ - enum { value = buffer_sequence_adapter_base::max_buffers }; -}; - -template -struct prepared_buffers_max > -{ - enum { value = N }; -}; - -#if defined(ASIO_HAS_STD_ARRAY) - -template -struct prepared_buffers_max > -{ - enum { value = N }; -}; - -#endif // defined(ASIO_HAS_STD_ARRAY) - -// A buffer sequence used to represent a subsequence of the buffers. -template -struct prepared_buffers -{ - typedef Buffer value_type; - typedef const Buffer* const_iterator; - - enum { max_buffers = MaxBuffers < 16 ? MaxBuffers : 16 }; - - prepared_buffers() : count(0) {} - const_iterator begin() const { return elems; } - const_iterator end() const { return elems + count; } - - Buffer elems[max_buffers]; - std::size_t count; -}; - -// A proxy for a sub-range in a list of buffers. -template -class consuming_buffers -{ -public: - typedef prepared_buffers::value> - prepared_buffers_type; - - // Construct to represent the entire list of buffers. - explicit consuming_buffers(const Buffers& buffers) - : buffers_(buffers), - total_consumed_(0), - next_elem_(0), - next_elem_offset_(0) - { - using asio::buffer_size; - total_size_ = buffer_size(buffers); - } - - // Determine if we are at the end of the buffers. - bool empty() const - { - return total_consumed_ >= total_size_; - } - - // Get the buffer for a single transfer, with a size. - prepared_buffers_type prepare(std::size_t max_size) - { - prepared_buffers_type result; - - Buffer_Iterator next = asio::buffer_sequence_begin(buffers_); - Buffer_Iterator end = asio::buffer_sequence_end(buffers_); - - std::advance(next, next_elem_); - std::size_t elem_offset = next_elem_offset_; - while (next != end && max_size > 0 && (result.count) < result.max_buffers) - { - Buffer next_buf = Buffer(*next) + elem_offset; - result.elems[result.count] = asio::buffer(next_buf, max_size); - max_size -= result.elems[result.count].size(); - elem_offset = 0; - if (result.elems[result.count].size() > 0) - ++result.count; - ++next; - } - - return result; - } - - // Consume the specified number of bytes from the buffers. - void consume(std::size_t size) - { - total_consumed_ += size; - - Buffer_Iterator next = asio::buffer_sequence_begin(buffers_); - Buffer_Iterator end = asio::buffer_sequence_end(buffers_); - - std::advance(next, next_elem_); - while (next != end && size > 0) - { - Buffer next_buf = Buffer(*next) + next_elem_offset_; - if (size < next_buf.size()) - { - next_elem_offset_ += size; - size = 0; - } - else - { - size -= next_buf.size(); - next_elem_offset_ = 0; - ++next_elem_; - ++next; - } - } - } - - // Get the total number of bytes consumed from the buffers. - std::size_t total_consumed() const - { - return total_consumed_; - } - -private: - Buffers buffers_; - std::size_t total_size_; - std::size_t total_consumed_; - std::size_t next_elem_; - std::size_t next_elem_offset_; -}; - -// Base class of all consuming_buffers specialisations for single buffers. -template -class consuming_single_buffer -{ -public: - // Construct to represent the entire list of buffers. - template - explicit consuming_single_buffer(const Buffer1& buffer) - : buffer_(buffer), - total_consumed_(0) - { - } - - // Determine if we are at the end of the buffers. - bool empty() const - { - return total_consumed_ >= buffer_.size(); - } - - // Get the buffer for a single transfer, with a size. - Buffer prepare(std::size_t max_size) - { - return asio::buffer(buffer_ + total_consumed_, max_size); - } - - // Consume the specified number of bytes from the buffers. - void consume(std::size_t size) - { - total_consumed_ += size; - } - - // Get the total number of bytes consumed from the buffers. - std::size_t total_consumed() const - { - return total_consumed_; - } - -private: - Buffer buffer_; - std::size_t total_consumed_; -}; - -template <> -class consuming_buffers - : public consuming_single_buffer -{ -public: - explicit consuming_buffers(const mutable_buffer& buffer) - : consuming_single_buffer(buffer) - { - } -}; - -template <> -class consuming_buffers - : public consuming_single_buffer -{ -public: - explicit consuming_buffers(const mutable_buffer& buffer) - : consuming_single_buffer(buffer) - { - } -}; - -template <> -class consuming_buffers - : public consuming_single_buffer -{ -public: - explicit consuming_buffers(const const_buffer& buffer) - : consuming_single_buffer(buffer) - { - } -}; - -#if !defined(ASIO_NO_DEPRECATED) - -template <> -class consuming_buffers - : public consuming_single_buffer -{ -public: - explicit consuming_buffers(const mutable_buffers_1& buffer) - : consuming_single_buffer(buffer) - { - } -}; - -template <> -class consuming_buffers - : public consuming_single_buffer -{ -public: - explicit consuming_buffers(const mutable_buffers_1& buffer) - : consuming_single_buffer(buffer) - { - } -}; - -template <> -class consuming_buffers - : public consuming_single_buffer -{ -public: - explicit consuming_buffers(const const_buffers_1& buffer) - : consuming_single_buffer(buffer) - { - } -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -class consuming_buffers, - typename boost::array::const_iterator> -{ -public: - // Construct to represent the entire list of buffers. - explicit consuming_buffers(const boost::array& buffers) - : buffers_(buffers), - total_consumed_(0) - { - } - - // Determine if we are at the end of the buffers. - bool empty() const - { - return total_consumed_ >= - Buffer(buffers_[0]).size() + Buffer(buffers_[1]).size(); - } - - // Get the buffer for a single transfer, with a size. - boost::array prepare(std::size_t max_size) - { - boost::array result = {{ - Buffer(buffers_[0]), Buffer(buffers_[1]) }}; - std::size_t buffer0_size = result[0].size(); - result[0] = asio::buffer(result[0] + total_consumed_, max_size); - result[1] = asio::buffer( - result[1] + (total_consumed_ < buffer0_size - ? 0 : total_consumed_ - buffer0_size), - max_size - result[0].size()); - return result; - } - - // Consume the specified number of bytes from the buffers. - void consume(std::size_t size) - { - total_consumed_ += size; - } - - // Get the total number of bytes consumed from the buffers. - std::size_t total_consumed() const - { - return total_consumed_; - } - -private: - boost::array buffers_; - std::size_t total_consumed_; -}; - -#if defined(ASIO_HAS_STD_ARRAY) - -template -class consuming_buffers, - typename std::array::const_iterator> -{ -public: - // Construct to represent the entire list of buffers. - explicit consuming_buffers(const std::array& buffers) - : buffers_(buffers), - total_consumed_(0) - { - } - - // Determine if we are at the end of the buffers. - bool empty() const - { - return total_consumed_ >= - Buffer(buffers_[0]).size() + Buffer(buffers_[1]).size(); - } - - // Get the buffer for a single transfer, with a size. - std::array prepare(std::size_t max_size) - { - std::array result = {{ - Buffer(buffers_[0]), Buffer(buffers_[1]) }}; - std::size_t buffer0_size = result[0].size(); - result[0] = asio::buffer(result[0] + total_consumed_, max_size); - result[1] = asio::buffer( - result[1] + (total_consumed_ < buffer0_size - ? 0 : total_consumed_ - buffer0_size), - max_size - result[0].size()); - return result; - } - - // Consume the specified number of bytes from the buffers. - void consume(std::size_t size) - { - total_consumed_ += size; - } - - // Get the total number of bytes consumed from the buffers. - std::size_t total_consumed() const - { - return total_consumed_; - } - -private: - std::array buffers_; - std::size_t total_consumed_; -}; - -#endif // defined(ASIO_HAS_STD_ARRAY) - -// Specialisation for null_buffers to ensure that the null_buffers type is -// always passed through to the underlying read or write operation. -template -class consuming_buffers - : public asio::null_buffers -{ -public: - consuming_buffers(const null_buffers&) - { - // No-op. - } - - bool empty() - { - return false; - } - - null_buffers prepare(std::size_t) - { - return null_buffers(); - } - - void consume(std::size_t) - { - // No-op. - } - - std::size_t total_consumed() const - { - return 0; - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CONSUMING_BUFFERS_HPP diff --git a/scout_sdk/asio/asio/detail/cstddef.hpp b/scout_sdk/asio/asio/detail/cstddef.hpp deleted file mode 100644 index 3912da4..0000000 --- a/scout_sdk/asio/asio/detail/cstddef.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// detail/cstddef.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CSTDDEF_HPP -#define ASIO_DETAIL_CSTDDEF_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include - -namespace asio { - -#if defined(ASIO_HAS_NULLPTR) -using std::nullptr_t; -#else // defined(ASIO_HAS_NULLPTR) -struct nullptr_t {}; -#endif // defined(ASIO_HAS_NULLPTR) - -} // namespace asio - -#endif // ASIO_DETAIL_CSTDDEF_HPP diff --git a/scout_sdk/asio/asio/detail/cstdint.hpp b/scout_sdk/asio/asio/detail/cstdint.hpp deleted file mode 100644 index 62342b2..0000000 --- a/scout_sdk/asio/asio/detail/cstdint.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// detail/cstdint.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CSTDINT_HPP -#define ASIO_DETAIL_CSTDINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_CSTDINT) -# include -#else // defined(ASIO_HAS_CSTDINT) -# include -#endif // defined(ASIO_HAS_CSTDINT) - -namespace asio { - -#if defined(ASIO_HAS_CSTDINT) -using std::int16_t; -using std::int_least16_t; -using std::uint16_t; -using std::uint_least16_t; -using std::int32_t; -using std::int_least32_t; -using std::uint32_t; -using std::uint_least32_t; -using std::int64_t; -using std::int_least64_t; -using std::uint64_t; -using std::uint_least64_t; -using std::uintmax_t; -#else // defined(ASIO_HAS_CSTDINT) -using boost::int16_t; -using boost::int_least16_t; -using boost::uint16_t; -using boost::uint_least16_t; -using boost::int32_t; -using boost::int_least32_t; -using boost::uint32_t; -using boost::uint_least32_t; -using boost::int64_t; -using boost::int_least64_t; -using boost::uint64_t; -using boost::uint_least64_t; -using boost::uintmax_t; -#endif // defined(ASIO_HAS_CSTDINT) - -} // namespace asio - -#endif // ASIO_DETAIL_CSTDINT_HPP diff --git a/scout_sdk/asio/asio/detail/date_time_fwd.hpp b/scout_sdk/asio/asio/detail/date_time_fwd.hpp deleted file mode 100644 index a159562..0000000 --- a/scout_sdk/asio/asio/detail/date_time_fwd.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// detail/date_time_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DATE_TIME_FWD_HPP -#define ASIO_DETAIL_DATE_TIME_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -namespace boost { -namespace date_time { - -template -class base_time; - -} // namespace date_time -namespace posix_time { - -class ptime; - -} // namespace posix_time -} // namespace boost - -#endif // ASIO_DETAIL_DATE_TIME_FWD_HPP diff --git a/scout_sdk/asio/asio/detail/deadline_timer_service.hpp b/scout_sdk/asio/asio/detail/deadline_timer_service.hpp deleted file mode 100644 index f58a6e0..0000000 --- a/scout_sdk/asio/asio/detail/deadline_timer_service.hpp +++ /dev/null @@ -1,278 +0,0 @@ -// -// detail/deadline_timer_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP -#define ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue.hpp" -#include "asio/detail/timer_queue_ptime.hpp" -#include "asio/detail/timer_scheduler.hpp" -#include "asio/detail/wait_handler.hpp" -#include "asio/detail/wait_op.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include -# include -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class deadline_timer_service - : public service_base > -{ -public: - // The time type. - typedef typename Time_Traits::time_type time_type; - - // The duration type. - typedef typename Time_Traits::duration_type duration_type; - - // The implementation type of the timer. This type is dependent on the - // underlying implementation of the timer service. - struct implementation_type - : private asio::detail::noncopyable - { - time_type expiry; - bool might_have_pending_waits; - typename timer_queue::per_timer_data timer_data; - }; - - // Constructor. - deadline_timer_service(asio::io_context& io_context) - : service_base >(io_context), - scheduler_(asio::use_service(io_context)) - { - scheduler_.init_task(); - scheduler_.add_timer_queue(timer_queue_); - } - - // Destructor. - ~deadline_timer_service() - { - scheduler_.remove_timer_queue(timer_queue_); - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - } - - // Construct a new timer implementation. - void construct(implementation_type& impl) - { - impl.expiry = time_type(); - impl.might_have_pending_waits = false; - } - - // Destroy a timer implementation. - void destroy(implementation_type& impl) - { - asio::error_code ec; - cancel(impl, ec); - } - - // Move-construct a new serial port implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - scheduler_.move_timer(timer_queue_, impl.timer_data, other_impl.timer_data); - - impl.expiry = other_impl.expiry; - other_impl.expiry = time_type(); - - impl.might_have_pending_waits = other_impl.might_have_pending_waits; - other_impl.might_have_pending_waits = false; - } - - // Move-assign from another serial port implementation. - void move_assign(implementation_type& impl, - deadline_timer_service& other_service, - implementation_type& other_impl) - { - if (this != &other_service) - if (impl.might_have_pending_waits) - scheduler_.cancel_timer(timer_queue_, impl.timer_data); - - other_service.scheduler_.move_timer(other_service.timer_queue_, - impl.timer_data, other_impl.timer_data); - - impl.expiry = other_impl.expiry; - other_impl.expiry = time_type(); - - impl.might_have_pending_waits = other_impl.might_have_pending_waits; - other_impl.might_have_pending_waits = false; - } - - // Cancel any asynchronous wait operations associated with the timer. - std::size_t cancel(implementation_type& impl, asio::error_code& ec) - { - if (!impl.might_have_pending_waits) - { - ec = asio::error_code(); - return 0; - } - - ASIO_HANDLER_OPERATION((scheduler_.context(), - "deadline_timer", &impl, 0, "cancel")); - - std::size_t count = scheduler_.cancel_timer(timer_queue_, impl.timer_data); - impl.might_have_pending_waits = false; - ec = asio::error_code(); - return count; - } - - // Cancels one asynchronous wait operation associated with the timer. - std::size_t cancel_one(implementation_type& impl, - asio::error_code& ec) - { - if (!impl.might_have_pending_waits) - { - ec = asio::error_code(); - return 0; - } - - ASIO_HANDLER_OPERATION((scheduler_.context(), - "deadline_timer", &impl, 0, "cancel_one")); - - std::size_t count = scheduler_.cancel_timer( - timer_queue_, impl.timer_data, 1); - if (count == 0) - impl.might_have_pending_waits = false; - ec = asio::error_code(); - return count; - } - - // Get the expiry time for the timer as an absolute time. - time_type expiry(const implementation_type& impl) const - { - return impl.expiry; - } - - // Get the expiry time for the timer as an absolute time. - time_type expires_at(const implementation_type& impl) const - { - return impl.expiry; - } - - // Get the expiry time for the timer relative to now. - duration_type expires_from_now(const implementation_type& impl) const - { - return Time_Traits::subtract(this->expiry(impl), Time_Traits::now()); - } - - // Set the expiry time for the timer as an absolute time. - std::size_t expires_at(implementation_type& impl, - const time_type& expiry_time, asio::error_code& ec) - { - std::size_t count = cancel(impl, ec); - impl.expiry = expiry_time; - ec = asio::error_code(); - return count; - } - - // Set the expiry time for the timer relative to now. - std::size_t expires_after(implementation_type& impl, - const duration_type& expiry_time, asio::error_code& ec) - { - return expires_at(impl, - Time_Traits::add(Time_Traits::now(), expiry_time), ec); - } - - // Set the expiry time for the timer relative to now. - std::size_t expires_from_now(implementation_type& impl, - const duration_type& expiry_time, asio::error_code& ec) - { - return expires_at(impl, - Time_Traits::add(Time_Traits::now(), expiry_time), ec); - } - - // Perform a blocking wait on the timer. - void wait(implementation_type& impl, asio::error_code& ec) - { - time_type now = Time_Traits::now(); - ec = asio::error_code(); - while (Time_Traits::less_than(now, impl.expiry) && !ec) - { - this->do_wait(Time_Traits::to_posix_duration( - Time_Traits::subtract(impl.expiry, now)), ec); - now = Time_Traits::now(); - } - } - - // Start an asynchronous wait on the timer. - template - void async_wait(implementation_type& impl, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef wait_handler op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - impl.might_have_pending_waits = true; - - ASIO_HANDLER_CREATION((scheduler_.context(), - *p.p, "deadline_timer", &impl, 0, "async_wait")); - - scheduler_.schedule_timer(timer_queue_, impl.expiry, impl.timer_data, p.p); - p.v = p.p = 0; - } - -private: - // Helper function to wait given a duration type. The duration type should - // either be of type boost::posix_time::time_duration, or implement the - // required subset of its interface. - template - void do_wait(const Duration& timeout, asio::error_code& ec) - { -#if defined(ASIO_WINDOWS_RUNTIME) - std::this_thread::sleep_for( - std::chrono::seconds(timeout.total_seconds()) - + std::chrono::microseconds(timeout.total_microseconds())); - ec = asio::error_code(); -#else // defined(ASIO_WINDOWS_RUNTIME) - ::timeval tv; - tv.tv_sec = timeout.total_seconds(); - tv.tv_usec = timeout.total_microseconds() % 1000000; - socket_ops::select(0, 0, 0, 0, &tv, ec); -#endif // defined(ASIO_WINDOWS_RUNTIME) - } - - // The queue of timers. - timer_queue timer_queue_; - - // The object that schedules and executes timers. Usually a reactor. - timer_scheduler& scheduler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/dependent_type.hpp b/scout_sdk/asio/asio/detail/dependent_type.hpp deleted file mode 100644 index 85b41c8..0000000 --- a/scout_sdk/asio/asio/detail/dependent_type.hpp +++ /dev/null @@ -1,36 +0,0 @@ -// -// detail/dependent_type.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DEPENDENT_TYPE_HPP -#define ASIO_DETAIL_DEPENDENT_TYPE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct dependent_type -{ - typedef T type; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_DEPENDENT_TYPE_HPP diff --git a/scout_sdk/asio/asio/detail/descriptor_ops.hpp b/scout_sdk/asio/asio/detail/descriptor_ops.hpp deleted file mode 100644 index 9c0560a..0000000 --- a/scout_sdk/asio/asio/detail/descriptor_ops.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// detail/descriptor_ops.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DESCRIPTOR_OPS_HPP -#define ASIO_DETAIL_DESCRIPTOR_OPS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - -#include -#include "asio/error.hpp" -#include "asio/error_code.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { -namespace descriptor_ops { - -// Descriptor state bits. -enum -{ - // The user wants a non-blocking descriptor. - user_set_non_blocking = 1, - - // The descriptor has been set non-blocking. - internal_non_blocking = 2, - - // Helper "state" used to determine whether the descriptor is non-blocking. - non_blocking = user_set_non_blocking | internal_non_blocking, - - // The descriptor may have been dup()-ed. - possible_dup = 4 -}; - -typedef unsigned char state_type; - -template -inline ReturnType error_wrapper(ReturnType return_value, - asio::error_code& ec) -{ - ec = asio::error_code(errno, - asio::error::get_system_category()); - return return_value; -} - -ASIO_DECL int open(const char* path, int flags, - asio::error_code& ec); - -ASIO_DECL int close(int d, state_type& state, - asio::error_code& ec); - -ASIO_DECL bool set_user_non_blocking(int d, - state_type& state, bool value, asio::error_code& ec); - -ASIO_DECL bool set_internal_non_blocking(int d, - state_type& state, bool value, asio::error_code& ec); - -typedef iovec buf; - -ASIO_DECL std::size_t sync_read(int d, state_type state, buf* bufs, - std::size_t count, bool all_empty, asio::error_code& ec); - -ASIO_DECL bool non_blocking_read(int d, buf* bufs, std::size_t count, - asio::error_code& ec, std::size_t& bytes_transferred); - -ASIO_DECL std::size_t sync_write(int d, state_type state, - const buf* bufs, std::size_t count, bool all_empty, - asio::error_code& ec); - -ASIO_DECL bool non_blocking_write(int d, - const buf* bufs, std::size_t count, - asio::error_code& ec, std::size_t& bytes_transferred); - -ASIO_DECL int ioctl(int d, state_type& state, long cmd, - ioctl_arg_type* arg, asio::error_code& ec); - -ASIO_DECL int fcntl(int d, int cmd, asio::error_code& ec); - -ASIO_DECL int fcntl(int d, int cmd, - long arg, asio::error_code& ec); - -ASIO_DECL int poll_read(int d, - state_type state, asio::error_code& ec); - -ASIO_DECL int poll_write(int d, - state_type state, asio::error_code& ec); - -ASIO_DECL int poll_error(int d, - state_type state, asio::error_code& ec); - -} // namespace descriptor_ops -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/descriptor_ops.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - -#endif // ASIO_DETAIL_DESCRIPTOR_OPS_HPP diff --git a/scout_sdk/asio/asio/detail/descriptor_read_op.hpp b/scout_sdk/asio/asio/detail/descriptor_read_op.hpp deleted file mode 100644 index 6db4bfb..0000000 --- a/scout_sdk/asio/asio/detail/descriptor_read_op.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// -// detail/descriptor_read_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DESCRIPTOR_READ_OP_HPP -#define ASIO_DETAIL_DESCRIPTOR_READ_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/descriptor_ops.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_work.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class descriptor_read_op_base : public reactor_op -{ -public: - descriptor_read_op_base(int descriptor, - const MutableBufferSequence& buffers, func_type complete_func) - : reactor_op(&descriptor_read_op_base::do_perform, complete_func), - descriptor_(descriptor), - buffers_(buffers) - { - } - - static status do_perform(reactor_op* base) - { - descriptor_read_op_base* o(static_cast(base)); - - buffer_sequence_adapter bufs(o->buffers_); - - status result = descriptor_ops::non_blocking_read(o->descriptor_, - bufs.buffers(), bufs.count(), o->ec_, o->bytes_transferred_) - ? done : not_done; - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_read", - o->ec_, o->bytes_transferred_)); - - return result; - } - -private: - int descriptor_; - MutableBufferSequence buffers_; -}; - -template -class descriptor_read_op - : public descriptor_read_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(descriptor_read_op); - - descriptor_read_op(int descriptor, - const MutableBufferSequence& buffers, Handler& handler) - : descriptor_read_op_base( - descriptor, buffers, &descriptor_read_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - descriptor_read_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#endif // ASIO_DETAIL_DESCRIPTOR_READ_OP_HPP diff --git a/scout_sdk/asio/asio/detail/descriptor_write_op.hpp b/scout_sdk/asio/asio/detail/descriptor_write_op.hpp deleted file mode 100644 index a9ec2a9..0000000 --- a/scout_sdk/asio/asio/detail/descriptor_write_op.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// -// detail/descriptor_write_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DESCRIPTOR_WRITE_OP_HPP -#define ASIO_DETAIL_DESCRIPTOR_WRITE_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/descriptor_ops.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_work.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class descriptor_write_op_base : public reactor_op -{ -public: - descriptor_write_op_base(int descriptor, - const ConstBufferSequence& buffers, func_type complete_func) - : reactor_op(&descriptor_write_op_base::do_perform, complete_func), - descriptor_(descriptor), - buffers_(buffers) - { - } - - static status do_perform(reactor_op* base) - { - descriptor_write_op_base* o(static_cast(base)); - - buffer_sequence_adapter bufs(o->buffers_); - - status result = descriptor_ops::non_blocking_write(o->descriptor_, - bufs.buffers(), bufs.count(), o->ec_, o->bytes_transferred_) - ? done : not_done; - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_write", - o->ec_, o->bytes_transferred_)); - - return result; - } - -private: - int descriptor_; - ConstBufferSequence buffers_; -}; - -template -class descriptor_write_op - : public descriptor_write_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(descriptor_write_op); - - descriptor_write_op(int descriptor, - const ConstBufferSequence& buffers, Handler& handler) - : descriptor_write_op_base( - descriptor, buffers, &descriptor_write_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - descriptor_write_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#endif // ASIO_DETAIL_DESCRIPTOR_WRITE_OP_HPP diff --git a/scout_sdk/asio/asio/detail/dev_poll_reactor.hpp b/scout_sdk/asio/asio/detail/dev_poll_reactor.hpp deleted file mode 100644 index e9e4e29..0000000 --- a/scout_sdk/asio/asio/detail/dev_poll_reactor.hpp +++ /dev/null @@ -1,218 +0,0 @@ -// -// detail/dev_poll_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DEV_POLL_REACTOR_HPP -#define ASIO_DETAIL_DEV_POLL_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_DEV_POLL) - -#include -#include -#include -#include "asio/detail/hash_map.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/reactor_op_queue.hpp" -#include "asio/detail/select_interrupter.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue_base.hpp" -#include "asio/detail/timer_queue_set.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class dev_poll_reactor - : public execution_context_service_base -{ -public: - enum op_types { read_op = 0, write_op = 1, - connect_op = 1, except_op = 2, max_ops = 3 }; - - // Per-descriptor data. - struct per_descriptor_data - { - }; - - // Constructor. - ASIO_DECL dev_poll_reactor(asio::execution_context& ctx); - - // Destructor. - ASIO_DECL ~dev_poll_reactor(); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Recreate internal descriptors following a fork. - ASIO_DECL void notify_fork( - asio::execution_context::fork_event fork_ev); - - // Initialise the task. - ASIO_DECL void init_task(); - - // Register a socket with the reactor. Returns 0 on success, system error - // code on failure. - ASIO_DECL int register_descriptor(socket_type, per_descriptor_data&); - - // Register a descriptor with an associated single operation. Returns 0 on - // success, system error code on failure. - ASIO_DECL int register_internal_descriptor( - int op_type, socket_type descriptor, - per_descriptor_data& descriptor_data, reactor_op* op); - - // Move descriptor registration from one descriptor_data object to another. - ASIO_DECL void move_descriptor(socket_type descriptor, - per_descriptor_data& target_descriptor_data, - per_descriptor_data& source_descriptor_data); - - // Post a reactor operation for immediate completion. - void post_immediate_completion(reactor_op* op, bool is_continuation) - { - scheduler_.post_immediate_completion(op, is_continuation); - } - - // Start a new operation. The reactor operation will be performed when the - // given descriptor is flagged as ready, or an error has occurred. - ASIO_DECL void start_op(int op_type, socket_type descriptor, - per_descriptor_data&, reactor_op* op, - bool is_continuation, bool allow_speculative); - - // Cancel all operations associated with the given descriptor. The - // handlers associated with the descriptor will be invoked with the - // operation_aborted error. - ASIO_DECL void cancel_ops(socket_type descriptor, per_descriptor_data&); - - // Cancel any operations that are running against the descriptor and remove - // its registration from the reactor. The reactor resources associated with - // the descriptor must be released by calling cleanup_descriptor_data. - ASIO_DECL void deregister_descriptor(socket_type descriptor, - per_descriptor_data&, bool closing); - - // Remove the descriptor's registration from the reactor. The reactor - // resources associated with the descriptor must be released by calling - // cleanup_descriptor_data. - ASIO_DECL void deregister_internal_descriptor( - socket_type descriptor, per_descriptor_data&); - - // Perform any post-deregistration cleanup tasks associated with the - // descriptor data. - ASIO_DECL void cleanup_descriptor_data(per_descriptor_data&); - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& queue); - - // Remove a timer queue from the reactor. - template - void remove_timer_queue(timer_queue& queue); - - // Schedule a new operation in the given timer queue to expire at the - // specified absolute time. - template - void schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op); - - // Cancel the timer operations associated with the given token. Returns the - // number of operations that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled = (std::numeric_limits::max)()); - - // Move the timer operations associated with the given timer. - template - void move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source); - - // Run /dev/poll once until interrupted or events are ready to be dispatched. - ASIO_DECL void run(long usec, op_queue& ops); - - // Interrupt the select loop. - ASIO_DECL void interrupt(); - -private: - // Create the /dev/poll file descriptor. Throws an exception if the descriptor - // cannot be created. - ASIO_DECL static int do_dev_poll_create(); - - // Helper function to add a new timer queue. - ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); - - // Helper function to remove a timer queue. - ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); - - // Get the timeout value for the /dev/poll DP_POLL operation. The timeout - // value is returned as a number of milliseconds. A return value of -1 - // indicates that the poll should block indefinitely. - ASIO_DECL int get_timeout(int msec); - - // Cancel all operations associated with the given descriptor. The do_cancel - // function of the handler objects will be invoked. This function does not - // acquire the dev_poll_reactor's mutex. - ASIO_DECL void cancel_ops_unlocked(socket_type descriptor, - const asio::error_code& ec); - - // Add a pending event entry for the given descriptor. - ASIO_DECL ::pollfd& add_pending_event_change(int descriptor); - - // The scheduler implementation used to post completions. - scheduler& scheduler_; - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // The /dev/poll file descriptor. - int dev_poll_fd_; - - // Vector of /dev/poll events waiting to be written to the descriptor. - std::vector< ::pollfd> pending_event_changes_; - - // Hash map to associate a descriptor with a pending event change index. - hash_map pending_event_change_index_; - - // The interrupter is used to break a blocking DP_POLL operation. - select_interrupter interrupter_; - - // The queues of read, write and except operations. - reactor_op_queue op_queue_[max_ops]; - - // The timer queues. - timer_queue_set timer_queues_; - - // Whether the service has been shut down. - bool shutdown_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/dev_poll_reactor.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/dev_poll_reactor.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_DEV_POLL) - -#endif // ASIO_DETAIL_DEV_POLL_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/epoll_reactor.hpp b/scout_sdk/asio/asio/detail/epoll_reactor.hpp deleted file mode 100644 index 5f58109..0000000 --- a/scout_sdk/asio/asio/detail/epoll_reactor.hpp +++ /dev/null @@ -1,266 +0,0 @@ -// -// detail/epoll_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_EPOLL_REACTOR_HPP -#define ASIO_DETAIL_EPOLL_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_EPOLL) - -#include "asio/detail/atomic_count.hpp" -#include "asio/detail/conditionally_enabled_mutex.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/object_pool.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/select_interrupter.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue_base.hpp" -#include "asio/detail/timer_queue_set.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/execution_context.hpp" - -#if defined(ASIO_HAS_TIMERFD) -# include -#endif // defined(ASIO_HAS_TIMERFD) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class epoll_reactor - : public execution_context_service_base -{ -private: - // The mutex type used by this reactor. - typedef conditionally_enabled_mutex mutex; - -public: - enum op_types { read_op = 0, write_op = 1, - connect_op = 1, except_op = 2, max_ops = 3 }; - - // Per-descriptor queues. - class descriptor_state : operation - { - friend class epoll_reactor; - friend class object_pool_access; - - descriptor_state* next_; - descriptor_state* prev_; - - mutex mutex_; - epoll_reactor* reactor_; - int descriptor_; - uint32_t registered_events_; - op_queue op_queue_[max_ops]; - bool try_speculative_[max_ops]; - bool shutdown_; - - ASIO_DECL descriptor_state(bool locking); - void set_ready_events(uint32_t events) { task_result_ = events; } - void add_ready_events(uint32_t events) { task_result_ |= events; } - ASIO_DECL operation* perform_io(uint32_t events); - ASIO_DECL static void do_complete( - void* owner, operation* base, - const asio::error_code& ec, std::size_t bytes_transferred); - }; - - // Per-descriptor data. - typedef descriptor_state* per_descriptor_data; - - // Constructor. - ASIO_DECL epoll_reactor(asio::execution_context& ctx); - - // Destructor. - ASIO_DECL ~epoll_reactor(); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Recreate internal descriptors following a fork. - ASIO_DECL void notify_fork( - asio::execution_context::fork_event fork_ev); - - // Initialise the task. - ASIO_DECL void init_task(); - - // Register a socket with the reactor. Returns 0 on success, system error - // code on failure. - ASIO_DECL int register_descriptor(socket_type descriptor, - per_descriptor_data& descriptor_data); - - // Register a descriptor with an associated single operation. Returns 0 on - // success, system error code on failure. - ASIO_DECL int register_internal_descriptor( - int op_type, socket_type descriptor, - per_descriptor_data& descriptor_data, reactor_op* op); - - // Move descriptor registration from one descriptor_data object to another. - ASIO_DECL void move_descriptor(socket_type descriptor, - per_descriptor_data& target_descriptor_data, - per_descriptor_data& source_descriptor_data); - - // Post a reactor operation for immediate completion. - void post_immediate_completion(reactor_op* op, bool is_continuation) - { - scheduler_.post_immediate_completion(op, is_continuation); - } - - // Start a new operation. The reactor operation will be performed when the - // given descriptor is flagged as ready, or an error has occurred. - ASIO_DECL void start_op(int op_type, socket_type descriptor, - per_descriptor_data& descriptor_data, reactor_op* op, - bool is_continuation, bool allow_speculative); - - // Cancel all operations associated with the given descriptor. The - // handlers associated with the descriptor will be invoked with the - // operation_aborted error. - ASIO_DECL void cancel_ops(socket_type descriptor, - per_descriptor_data& descriptor_data); - - // Cancel any operations that are running against the descriptor and remove - // its registration from the reactor. The reactor resources associated with - // the descriptor must be released by calling cleanup_descriptor_data. - ASIO_DECL void deregister_descriptor(socket_type descriptor, - per_descriptor_data& descriptor_data, bool closing); - - // Remove the descriptor's registration from the reactor. The reactor - // resources associated with the descriptor must be released by calling - // cleanup_descriptor_data. - ASIO_DECL void deregister_internal_descriptor( - socket_type descriptor, per_descriptor_data& descriptor_data); - - // Perform any post-deregistration cleanup tasks associated with the - // descriptor data. - ASIO_DECL void cleanup_descriptor_data( - per_descriptor_data& descriptor_data); - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& timer_queue); - - // Remove a timer queue from the reactor. - template - void remove_timer_queue(timer_queue& timer_queue); - - // Schedule a new operation in the given timer queue to expire at the - // specified absolute time. - template - void schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op); - - // Cancel the timer operations associated with the given token. Returns the - // number of operations that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled = (std::numeric_limits::max)()); - - // Move the timer operations associated with the given timer. - template - void move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source); - - // Run epoll once until interrupted or events are ready to be dispatched. - ASIO_DECL void run(long usec, op_queue& ops); - - // Interrupt the select loop. - ASIO_DECL void interrupt(); - -private: - // The hint to pass to epoll_create to size its data structures. - enum { epoll_size = 20000 }; - - // Create the epoll file descriptor. Throws an exception if the descriptor - // cannot be created. - ASIO_DECL static int do_epoll_create(); - - // Create the timerfd file descriptor. Does not throw. - ASIO_DECL static int do_timerfd_create(); - - // Allocate a new descriptor state object. - ASIO_DECL descriptor_state* allocate_descriptor_state(); - - // Free an existing descriptor state object. - ASIO_DECL void free_descriptor_state(descriptor_state* s); - - // Helper function to add a new timer queue. - ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); - - // Helper function to remove a timer queue. - ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); - - // Called to recalculate and update the timeout. - ASIO_DECL void update_timeout(); - - // Get the timeout value for the epoll_wait call. The timeout value is - // returned as a number of milliseconds. A return value of -1 indicates - // that epoll_wait should block indefinitely. - ASIO_DECL int get_timeout(int msec); - -#if defined(ASIO_HAS_TIMERFD) - // Get the timeout value for the timer descriptor. The return value is the - // flag argument to be used when calling timerfd_settime. - ASIO_DECL int get_timeout(itimerspec& ts); -#endif // defined(ASIO_HAS_TIMERFD) - - // The scheduler implementation used to post completions. - scheduler& scheduler_; - - // Mutex to protect access to internal data. - mutex mutex_; - - // The interrupter is used to break a blocking epoll_wait call. - select_interrupter interrupter_; - - // The epoll file descriptor. - int epoll_fd_; - - // The timer file descriptor. - int timer_fd_; - - // The timer queues. - timer_queue_set timer_queues_; - - // Whether the service has been shut down. - bool shutdown_; - - // Mutex to protect access to the registered descriptors. - mutex registered_descriptors_mutex_; - - // Keep track of all registered descriptors. - object_pool registered_descriptors_; - - // Helper class to do post-perform_io cleanup. - struct perform_io_cleanup_on_block_exit; - friend struct perform_io_cleanup_on_block_exit; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/epoll_reactor.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/epoll_reactor.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_EPOLL) - -#endif // ASIO_DETAIL_EPOLL_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/event.hpp b/scout_sdk/asio/asio/detail/event.hpp deleted file mode 100644 index da8fa77..0000000 --- a/scout_sdk/asio/asio/detail/event.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// -// detail/event.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_EVENT_HPP -#define ASIO_DETAIL_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) -# include "asio/detail/null_event.hpp" -#elif defined(ASIO_WINDOWS) -# include "asio/detail/win_event.hpp" -#elif defined(ASIO_HAS_PTHREADS) -# include "asio/detail/posix_event.hpp" -#elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) -# include "asio/detail/std_event.hpp" -#else -# error Only Windows, POSIX and std::condition_variable are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(ASIO_HAS_THREADS) -typedef null_event event; -#elif defined(ASIO_WINDOWS) -typedef win_event event; -#elif defined(ASIO_HAS_PTHREADS) -typedef posix_event event; -#elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) -typedef std_event event; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_EVENT_HPP diff --git a/scout_sdk/asio/asio/detail/eventfd_select_interrupter.hpp b/scout_sdk/asio/asio/detail/eventfd_select_interrupter.hpp deleted file mode 100644 index f6e594b..0000000 --- a/scout_sdk/asio/asio/detail/eventfd_select_interrupter.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// -// detail/eventfd_select_interrupter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Roelof Naude (roelof.naude at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_EVENTFD_SELECT_INTERRUPTER_HPP -#define ASIO_DETAIL_EVENTFD_SELECT_INTERRUPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_EVENTFD) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class eventfd_select_interrupter -{ -public: - // Constructor. - ASIO_DECL eventfd_select_interrupter(); - - // Destructor. - ASIO_DECL ~eventfd_select_interrupter(); - - // Recreate the interrupter's descriptors. Used after a fork. - ASIO_DECL void recreate(); - - // Interrupt the select call. - ASIO_DECL void interrupt(); - - // Reset the select interrupt. Returns true if the call was interrupted. - ASIO_DECL bool reset(); - - // Get the read descriptor to be passed to select. - int read_descriptor() const - { - return read_descriptor_; - } - -private: - // Open the descriptors. Throws on error. - ASIO_DECL void open_descriptors(); - - // Close the descriptors. - ASIO_DECL void close_descriptors(); - - // The read end of a connection used to interrupt the select call. This file - // descriptor is passed to select such that when it is time to stop, a single - // 64bit value will be written on the other end of the connection and this - // descriptor will become readable. - int read_descriptor_; - - // The write end of a connection used to interrupt the select call. A single - // 64bit non-zero value may be written to this to wake up the select which is - // waiting for the other end to become readable. This descriptor will only - // differ from the read descriptor when a pipe is used. - int write_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/eventfd_select_interrupter.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_EVENTFD) - -#endif // ASIO_DETAIL_EVENTFD_SELECT_INTERRUPTER_HPP diff --git a/scout_sdk/asio/asio/detail/executor_op.hpp b/scout_sdk/asio/asio/detail/executor_op.hpp deleted file mode 100644 index 2d5c7e8..0000000 --- a/scout_sdk/asio/asio/detail/executor_op.hpp +++ /dev/null @@ -1,84 +0,0 @@ -// -// detail/executor_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_EXECUTOR_OP_HPP -#define ASIO_DETAIL_EXECUTOR_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/scheduler_operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class executor_op : public Operation -{ -public: - ASIO_DEFINE_HANDLER_ALLOCATOR_PTR(executor_op); - - template - executor_op(ASIO_MOVE_ARG(H) h, const Alloc& allocator) - : Operation(&executor_op::do_complete), - handler_(ASIO_MOVE_CAST(H)(h)), - allocator_(allocator) - { - } - - static void do_complete(void* owner, Operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - executor_op* o(static_cast(base)); - Alloc allocator(o->allocator_); - ptr p = { detail::addressof(allocator), o, o }; - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - Handler handler(ASIO_MOVE_CAST(Handler)(o->handler_)); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN(()); - asio_handler_invoke_helpers::invoke(handler, handler); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; - Alloc allocator_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_EXECUTOR_OP_HPP diff --git a/scout_sdk/asio/asio/detail/fd_set_adapter.hpp b/scout_sdk/asio/asio/detail/fd_set_adapter.hpp deleted file mode 100644 index fd373da..0000000 --- a/scout_sdk/asio/asio/detail/fd_set_adapter.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// -// detail/fd_set_adapter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_FD_SET_ADAPTER_HPP -#define ASIO_DETAIL_FD_SET_ADAPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/posix_fd_set_adapter.hpp" -#include "asio/detail/win_fd_set_adapter.hpp" - -namespace asio { -namespace detail { - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -typedef win_fd_set_adapter fd_set_adapter; -#else -typedef posix_fd_set_adapter fd_set_adapter; -#endif - -} // namespace detail -} // namespace asio - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_FD_SET_ADAPTER_HPP diff --git a/scout_sdk/asio/asio/detail/fenced_block.hpp b/scout_sdk/asio/asio/detail/fenced_block.hpp deleted file mode 100644 index dc34bd9..0000000 --- a/scout_sdk/asio/asio/detail/fenced_block.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// -// detail/fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_FENCED_BLOCK_HPP -#define ASIO_DETAIL_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) \ - || defined(ASIO_DISABLE_FENCED_BLOCK) -# include "asio/detail/null_fenced_block.hpp" -#elif defined(ASIO_HAS_STD_ATOMIC) -# include "asio/detail/std_fenced_block.hpp" -#elif defined(__MACH__) && defined(__APPLE__) -# include "asio/detail/macos_fenced_block.hpp" -#elif defined(__sun) -# include "asio/detail/solaris_fenced_block.hpp" -#elif defined(__GNUC__) && defined(__arm__) \ - && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) -# include "asio/detail/gcc_arm_fenced_block.hpp" -#elif defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) -# include "asio/detail/gcc_hppa_fenced_block.hpp" -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -# include "asio/detail/gcc_x86_fenced_block.hpp" -#elif defined(__GNUC__) \ - && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \ - && !defined(__INTEL_COMPILER) && !defined(__ICL) \ - && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) -# include "asio/detail/gcc_sync_fenced_block.hpp" -#elif defined(ASIO_WINDOWS) && !defined(UNDER_CE) -# include "asio/detail/win_fenced_block.hpp" -#else -# include "asio/detail/null_fenced_block.hpp" -#endif - -namespace asio { -namespace detail { - -#if !defined(ASIO_HAS_THREADS) \ - || defined(ASIO_DISABLE_FENCED_BLOCK) -typedef null_fenced_block fenced_block; -#elif defined(ASIO_HAS_STD_ATOMIC) -typedef std_fenced_block fenced_block; -#elif defined(__MACH__) && defined(__APPLE__) -typedef macos_fenced_block fenced_block; -#elif defined(__sun) -typedef solaris_fenced_block fenced_block; -#elif defined(__GNUC__) && defined(__arm__) \ - && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) -typedef gcc_arm_fenced_block fenced_block; -#elif defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) -typedef gcc_hppa_fenced_block fenced_block; -#elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) -typedef gcc_x86_fenced_block fenced_block; -#elif defined(__GNUC__) \ - && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \ - && !defined(__INTEL_COMPILER) && !defined(__ICL) \ - && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) -typedef gcc_sync_fenced_block fenced_block; -#elif defined(ASIO_WINDOWS) && !defined(UNDER_CE) -typedef win_fenced_block fenced_block; -#else -typedef null_fenced_block fenced_block; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/functional.hpp b/scout_sdk/asio/asio/detail/functional.hpp deleted file mode 100644 index a37e9e6..0000000 --- a/scout_sdk/asio/asio/detail/functional.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// detail/functional.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_FUNCTIONAL_HPP -#define ASIO_DETAIL_FUNCTIONAL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include - -#if !defined(ASIO_HAS_STD_FUNCTION) -# include -#endif // !defined(ASIO_HAS_STD_FUNCTION) - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_STD_FUNCTION) -using std::function; -#else // defined(ASIO_HAS_STD_FUNCTION) -using boost::function; -#endif // defined(ASIO_HAS_STD_FUNCTION) - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_FUNCTIONAL_HPP diff --git a/scout_sdk/asio/asio/detail/gcc_arm_fenced_block.hpp b/scout_sdk/asio/asio/detail/gcc_arm_fenced_block.hpp deleted file mode 100644 index 7919a55..0000000 --- a/scout_sdk/asio/asio/detail/gcc_arm_fenced_block.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// detail/gcc_arm_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_GCC_ARM_FENCED_BLOCK_HPP -#define ASIO_DETAIL_GCC_ARM_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(__GNUC__) && defined(__arm__) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class gcc_arm_fenced_block - : private noncopyable -{ -public: - enum half_t { half }; - enum full_t { full }; - - // Constructor for a half fenced block. - explicit gcc_arm_fenced_block(half_t) - { - } - - // Constructor for a full fenced block. - explicit gcc_arm_fenced_block(full_t) - { - barrier(); - } - - // Destructor. - ~gcc_arm_fenced_block() - { - barrier(); - } - -private: - static void barrier() - { -#if defined(__ARM_ARCH_4__) \ - || defined(__ARM_ARCH_4T__) \ - || defined(__ARM_ARCH_5__) \ - || defined(__ARM_ARCH_5E__) \ - || defined(__ARM_ARCH_5T__) \ - || defined(__ARM_ARCH_5TE__) \ - || defined(__ARM_ARCH_5TEJ__) \ - || defined(__ARM_ARCH_6__) \ - || defined(__ARM_ARCH_6J__) \ - || defined(__ARM_ARCH_6K__) \ - || defined(__ARM_ARCH_6Z__) \ - || defined(__ARM_ARCH_6ZK__) \ - || defined(__ARM_ARCH_6T2__) -# if defined(__thumb__) - // This is just a placeholder and almost certainly not sufficient. - __asm__ __volatile__ ("" : : : "memory"); -# else // defined(__thumb__) - int a = 0, b = 0; - __asm__ __volatile__ ("swp %0, %1, [%2]" - : "=&r"(a) : "r"(1), "r"(&b) : "memory", "cc"); -# endif // defined(__thumb__) -#else - // ARMv7 and later. - __asm__ __volatile__ ("dmb" : : : "memory"); -#endif - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(__GNUC__) && defined(__arm__) - -#endif // ASIO_DETAIL_GCC_ARM_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/gcc_hppa_fenced_block.hpp b/scout_sdk/asio/asio/detail/gcc_hppa_fenced_block.hpp deleted file mode 100644 index d3957ce..0000000 --- a/scout_sdk/asio/asio/detail/gcc_hppa_fenced_block.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// detail/gcc_hppa_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_GCC_HPPA_FENCED_BLOCK_HPP -#define ASIO_DETAIL_GCC_HPPA_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class gcc_hppa_fenced_block - : private noncopyable -{ -public: - enum half_t { half }; - enum full_t { full }; - - // Constructor for a half fenced block. - explicit gcc_hppa_fenced_block(half_t) - { - } - - // Constructor for a full fenced block. - explicit gcc_hppa_fenced_block(full_t) - { - barrier(); - } - - // Destructor. - ~gcc_hppa_fenced_block() - { - barrier(); - } - -private: - static void barrier() - { - // This is just a placeholder and almost certainly not sufficient. - __asm__ __volatile__ ("" : : : "memory"); - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(__GNUC__) && (defined(__hppa) || defined(__hppa__)) - -#endif // ASIO_DETAIL_GCC_HPPA_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/gcc_sync_fenced_block.hpp b/scout_sdk/asio/asio/detail/gcc_sync_fenced_block.hpp deleted file mode 100644 index 90d176f..0000000 --- a/scout_sdk/asio/asio/detail/gcc_sync_fenced_block.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// -// detail/gcc_sync_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_GCC_SYNC_FENCED_BLOCK_HPP -#define ASIO_DETAIL_GCC_SYNC_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(__GNUC__) \ - && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) \ - && !defined(__INTEL_COMPILER) && !defined(__ICL) \ - && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class gcc_sync_fenced_block - : private noncopyable -{ -public: - enum half_or_full_t { half, full }; - - // Constructor. - explicit gcc_sync_fenced_block(half_or_full_t) - : value_(0) - { - __sync_lock_test_and_set(&value_, 1); - } - - // Destructor. - ~gcc_sync_fenced_block() - { - __sync_lock_release(&value_); - } - -private: - int value_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(__GNUC__) - // && ((__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4)) - // && !defined(__INTEL_COMPILER) && !defined(__ICL) - // && !defined(__ICC) && !defined(__ECC) && !defined(__PATHSCALE__) - -#endif // ASIO_DETAIL_GCC_SYNC_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/gcc_x86_fenced_block.hpp b/scout_sdk/asio/asio/detail/gcc_x86_fenced_block.hpp deleted file mode 100644 index 1366def..0000000 --- a/scout_sdk/asio/asio/detail/gcc_x86_fenced_block.hpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// detail/gcc_x86_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_GCC_X86_FENCED_BLOCK_HPP -#define ASIO_DETAIL_GCC_X86_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class gcc_x86_fenced_block - : private noncopyable -{ -public: - enum half_t { half }; - enum full_t { full }; - - // Constructor for a half fenced block. - explicit gcc_x86_fenced_block(half_t) - { - } - - // Constructor for a full fenced block. - explicit gcc_x86_fenced_block(full_t) - { - lbarrier(); - } - - // Destructor. - ~gcc_x86_fenced_block() - { - sbarrier(); - } - -private: - static int barrier() - { - int r = 0, m = 1; - __asm__ __volatile__ ( - "xchgl %0, %1" : - "=r"(r), "=m"(m) : - "0"(1), "m"(m) : - "memory", "cc"); - return r; - } - - static void lbarrier() - { -#if defined(__SSE2__) -# if (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) - __builtin_ia32_lfence(); -# else // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) - __asm__ __volatile__ ("lfence" ::: "memory"); -# endif // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) -#else // defined(__SSE2__) - barrier(); -#endif // defined(__SSE2__) - } - - static void sbarrier() - { -#if defined(__SSE2__) -# if (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) - __builtin_ia32_sfence(); -# else // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) - __asm__ __volatile__ ("sfence" ::: "memory"); -# endif // (__GNUC__ >= 4) && !defined(__INTEL_COMPILER) && !defined(__ICL) -#else // defined(__SSE2__) - barrier(); -#endif // defined(__SSE2__) - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) - -#endif // ASIO_DETAIL_GCC_X86_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/global.hpp b/scout_sdk/asio/asio/detail/global.hpp deleted file mode 100644 index 085ac64..0000000 --- a/scout_sdk/asio/asio/detail/global.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// detail/global.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_GLOBAL_HPP -#define ASIO_DETAIL_GLOBAL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) -# include "asio/detail/null_global.hpp" -#elif defined(ASIO_WINDOWS) -# include "asio/detail/win_global.hpp" -#elif defined(ASIO_HAS_PTHREADS) -# include "asio/detail/posix_global.hpp" -#elif defined(ASIO_HAS_STD_CALL_ONCE) -# include "asio/detail/std_global.hpp" -#else -# error Only Windows, POSIX and std::call_once are supported! -#endif - -namespace asio { -namespace detail { - -template -inline T& global() -{ -#if !defined(ASIO_HAS_THREADS) - return null_global(); -#elif defined(ASIO_WINDOWS) - return win_global(); -#elif defined(ASIO_HAS_PTHREADS) - return posix_global(); -#elif defined(ASIO_HAS_STD_CALL_ONCE) - return std_global(); -#endif -} - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_GLOBAL_HPP diff --git a/scout_sdk/asio/asio/detail/handler_alloc_helpers.hpp b/scout_sdk/asio/asio/detail/handler_alloc_helpers.hpp deleted file mode 100644 index afefb4d..0000000 --- a/scout_sdk/asio/asio/detail/handler_alloc_helpers.hpp +++ /dev/null @@ -1,235 +0,0 @@ -// -// detail/handler_alloc_helpers.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP -#define ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/recycling_allocator.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/handler_alloc_hook.hpp" - -#include "asio/detail/push_options.hpp" - -// Calls to asio_handler_allocate and asio_handler_deallocate must be made from -// a namespace that does not contain any overloads of these functions. The -// asio_handler_alloc_helpers namespace is defined here for that purpose. -namespace asio_handler_alloc_helpers { - -template -inline void* allocate(std::size_t s, Handler& h) -{ -#if !defined(ASIO_HAS_HANDLER_HOOKS) - return ::operator new(s); -#else - using asio::asio_handler_allocate; - return asio_handler_allocate(s, asio::detail::addressof(h)); -#endif -} - -template -inline void deallocate(void* p, std::size_t s, Handler& h) -{ -#if !defined(ASIO_HAS_HANDLER_HOOKS) - ::operator delete(p); -#else - using asio::asio_handler_deallocate; - asio_handler_deallocate(p, s, asio::detail::addressof(h)); -#endif -} - -} // namespace asio_handler_alloc_helpers - -namespace asio { -namespace detail { - -template -class hook_allocator -{ -public: - typedef T value_type; - - template - struct rebind - { - typedef hook_allocator other; - }; - - explicit hook_allocator(Handler& h) - : handler_(h) - { - } - - template - hook_allocator(const hook_allocator& a) - : handler_(a.handler_) - { - } - - T* allocate(std::size_t n) - { - return static_cast( - asio_handler_alloc_helpers::allocate(sizeof(T) * n, handler_)); - } - - void deallocate(T* p, std::size_t n) - { - asio_handler_alloc_helpers::deallocate(p, sizeof(T) * n, handler_); - } - -//private: - Handler& handler_; -}; - -template -class hook_allocator -{ -public: - typedef void value_type; - - template - struct rebind - { - typedef hook_allocator other; - }; - - explicit hook_allocator(Handler& h) - : handler_(h) - { - } - - template - hook_allocator(const hook_allocator& a) - : handler_(a.handler_) - { - } - -//private: - Handler& handler_; -}; - -template -struct get_hook_allocator -{ - typedef Allocator type; - - static type get(Handler&, const Allocator& a) - { - return a; - } -}; - -template -struct get_hook_allocator > -{ - typedef hook_allocator type; - - static type get(Handler& handler, const std::allocator&) - { - return type(handler); - } -}; - -} // namespace detail -} // namespace asio - -#define ASIO_DEFINE_HANDLER_PTR(op) \ - struct ptr \ - { \ - Handler* h; \ - op* v; \ - op* p; \ - ~ptr() \ - { \ - reset(); \ - } \ - static op* allocate(Handler& handler) \ - { \ - typedef typename ::asio::associated_allocator< \ - Handler>::type associated_allocator_type; \ - typedef typename ::asio::detail::get_hook_allocator< \ - Handler, associated_allocator_type>::type hook_allocator_type; \ - ASIO_REBIND_ALLOC(hook_allocator_type, op) a( \ - ::asio::detail::get_hook_allocator< \ - Handler, associated_allocator_type>::get( \ - handler, ::asio::get_associated_allocator(handler))); \ - return a.allocate(1); \ - } \ - void reset() \ - { \ - if (p) \ - { \ - p->~op(); \ - p = 0; \ - } \ - if (v) \ - { \ - typedef typename ::asio::associated_allocator< \ - Handler>::type associated_allocator_type; \ - typedef typename ::asio::detail::get_hook_allocator< \ - Handler, associated_allocator_type>::type hook_allocator_type; \ - ASIO_REBIND_ALLOC(hook_allocator_type, op) a( \ - ::asio::detail::get_hook_allocator< \ - Handler, associated_allocator_type>::get( \ - *h, ::asio::get_associated_allocator(*h))); \ - a.deallocate(static_cast(v), 1); \ - v = 0; \ - } \ - } \ - } \ - /**/ - -#define ASIO_DEFINE_HANDLER_ALLOCATOR_PTR(op) \ - struct ptr \ - { \ - const Alloc* a; \ - void* v; \ - op* p; \ - ~ptr() \ - { \ - reset(); \ - } \ - static op* allocate(const Alloc& a) \ - { \ - typedef typename ::asio::detail::get_recycling_allocator< \ - Alloc>::type recycling_allocator_type; \ - ASIO_REBIND_ALLOC(recycling_allocator_type, op) a1( \ - ::asio::detail::get_recycling_allocator::get(a)); \ - return a1.allocate(1); \ - } \ - void reset() \ - { \ - if (p) \ - { \ - p->~op(); \ - p = 0; \ - } \ - if (v) \ - { \ - typedef typename ::asio::detail::get_recycling_allocator< \ - Alloc>::type recycling_allocator_type; \ - ASIO_REBIND_ALLOC(recycling_allocator_type, op) a1( \ - ::asio::detail::get_recycling_allocator::get(*a)); \ - a1.deallocate(static_cast(v), 1); \ - v = 0; \ - } \ - } \ - } \ - /**/ - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP diff --git a/scout_sdk/asio/asio/detail/handler_cont_helpers.hpp b/scout_sdk/asio/asio/detail/handler_cont_helpers.hpp deleted file mode 100644 index 110ba94..0000000 --- a/scout_sdk/asio/asio/detail/handler_cont_helpers.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// detail/handler_cont_helpers.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_CONT_HELPERS_HPP -#define ASIO_DETAIL_HANDLER_CONT_HELPERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/memory.hpp" -#include "asio/handler_continuation_hook.hpp" - -#include "asio/detail/push_options.hpp" - -// Calls to asio_handler_is_continuation must be made from a namespace that -// does not contain overloads of this function. This namespace is defined here -// for that purpose. -namespace asio_handler_cont_helpers { - -template -inline bool is_continuation(Context& context) -{ -#if !defined(ASIO_HAS_HANDLER_HOOKS) - return false; -#else - using asio::asio_handler_is_continuation; - return asio_handler_is_continuation( - asio::detail::addressof(context)); -#endif -} - -} // namespace asio_handler_cont_helpers - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HANDLER_CONT_HELPERS_HPP diff --git a/scout_sdk/asio/asio/detail/handler_invoke_helpers.hpp b/scout_sdk/asio/asio/detail/handler_invoke_helpers.hpp deleted file mode 100644 index 4c65c4c..0000000 --- a/scout_sdk/asio/asio/detail/handler_invoke_helpers.hpp +++ /dev/null @@ -1,57 +0,0 @@ -// -// detail/handler_invoke_helpers.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP -#define ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/memory.hpp" -#include "asio/handler_invoke_hook.hpp" - -#include "asio/detail/push_options.hpp" - -// Calls to asio_handler_invoke must be made from a namespace that does not -// contain overloads of this function. The asio_handler_invoke_helpers -// namespace is defined here for that purpose. -namespace asio_handler_invoke_helpers { - -template -inline void invoke(Function& function, Context& context) -{ -#if !defined(ASIO_HAS_HANDLER_HOOKS) - Function tmp(function); - tmp(); -#else - using asio::asio_handler_invoke; - asio_handler_invoke(function, asio::detail::addressof(context)); -#endif -} - -template -inline void invoke(const Function& function, Context& context) -{ -#if !defined(ASIO_HAS_HANDLER_HOOKS) - Function tmp(function); - tmp(); -#else - using asio::asio_handler_invoke; - asio_handler_invoke(function, asio::detail::addressof(context)); -#endif -} - -} // namespace asio_handler_invoke_helpers - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP diff --git a/scout_sdk/asio/asio/detail/handler_tracking.hpp b/scout_sdk/asio/asio/detail/handler_tracking.hpp deleted file mode 100644 index 83f820e..0000000 --- a/scout_sdk/asio/asio/detail/handler_tracking.hpp +++ /dev/null @@ -1,238 +0,0 @@ -// -// detail/handler_tracking.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_TRACKING_HPP -#define ASIO_DETAIL_HANDLER_TRACKING_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -namespace asio { - -class execution_context; - -} // namespace asio - -#if defined(ASIO_CUSTOM_HANDLER_TRACKING) -# include ASIO_CUSTOM_HANDLER_TRACKING -#elif defined(ASIO_ENABLE_HANDLER_TRACKING) -# include "asio/error_code.hpp" -# include "asio/detail/cstdint.hpp" -# include "asio/detail/static_mutex.hpp" -# include "asio/detail/tss_ptr.hpp" -#endif // defined(ASIO_ENABLE_HANDLER_TRACKING) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -#if defined(ASIO_CUSTOM_HANDLER_TRACKING) - -// The user-specified header must define the following macros: -// - ASIO_INHERIT_TRACKED_HANDLER -// - ASIO_ALSO_INHERIT_TRACKED_HANDLER -// - ASIO_HANDLER_TRACKING_INIT -// - ASIO_HANDLER_CREATION(args) -// - ASIO_HANDLER_COMPLETION(args) -// - ASIO_HANDLER_INVOCATION_BEGIN(args) -// - ASIO_HANDLER_INVOCATION_END -// - ASIO_HANDLER_OPERATION(args) -// - ASIO_HANDLER_REACTOR_REGISTRATION(args) -// - ASIO_HANDLER_REACTOR_DEREGISTRATION(args) -// - ASIO_HANDLER_REACTOR_READ_EVENT -// - ASIO_HANDLER_REACTOR_WRITE_EVENT -// - ASIO_HANDLER_REACTOR_ERROR_EVENT -// - ASIO_HANDLER_REACTOR_EVENTS(args) -// - ASIO_HANDLER_REACTOR_OPERATION(args) - -# if !defined(ASIO_ENABLE_HANDLER_TRACKING) -# define ASIO_ENABLE_HANDLER_TRACKING 1 -# endif /// !defined(ASIO_ENABLE_HANDLER_TRACKING) - -#elif defined(ASIO_ENABLE_HANDLER_TRACKING) - -class handler_tracking -{ -public: - class completion; - - // Base class for objects containing tracked handlers. - class tracked_handler - { - private: - // Only the handler_tracking class will have access to the id. - friend class handler_tracking; - friend class completion; - uint64_t id_; - - protected: - // Constructor initialises with no id. - tracked_handler() : id_(0) {} - - // Prevent deletion through this type. - ~tracked_handler() {} - }; - - // Initialise the tracking system. - ASIO_DECL static void init(); - - // Record the creation of a tracked handler. - ASIO_DECL static void creation( - execution_context& context, tracked_handler& h, - const char* object_type, void* object, - uintmax_t native_handle, const char* op_name); - - class completion - { - public: - // Constructor records that handler is to be invoked with no arguments. - ASIO_DECL explicit completion(const tracked_handler& h); - - // Destructor records only when an exception is thrown from the handler, or - // if the memory is being freed without the handler having been invoked. - ASIO_DECL ~completion(); - - // Records that handler is to be invoked with no arguments. - ASIO_DECL void invocation_begin(); - - // Records that handler is to be invoked with one arguments. - ASIO_DECL void invocation_begin(const asio::error_code& ec); - - // Constructor records that handler is to be invoked with two arguments. - ASIO_DECL void invocation_begin( - const asio::error_code& ec, std::size_t bytes_transferred); - - // Constructor records that handler is to be invoked with two arguments. - ASIO_DECL void invocation_begin( - const asio::error_code& ec, int signal_number); - - // Constructor records that handler is to be invoked with two arguments. - ASIO_DECL void invocation_begin( - const asio::error_code& ec, const char* arg); - - // Record that handler invocation has ended. - ASIO_DECL void invocation_end(); - - private: - friend class handler_tracking; - uint64_t id_; - bool invoked_; - completion* next_; - }; - - // Record an operation that is not directly associated with a handler. - ASIO_DECL static void operation(execution_context& context, - const char* object_type, void* object, - uintmax_t native_handle, const char* op_name); - - // Record that a descriptor has been registered with the reactor. - ASIO_DECL static void reactor_registration(execution_context& context, - uintmax_t native_handle, uintmax_t registration); - - // Record that a descriptor has been deregistered from the reactor. - ASIO_DECL static void reactor_deregistration(execution_context& context, - uintmax_t native_handle, uintmax_t registration); - - // Record a reactor-based operation that is associated with a handler. - ASIO_DECL static void reactor_events(execution_context& context, - uintmax_t registration, unsigned events); - - // Record a reactor-based operation that is associated with a handler. - ASIO_DECL static void reactor_operation( - const tracked_handler& h, const char* op_name, - const asio::error_code& ec); - - // Record a reactor-based operation that is associated with a handler. - ASIO_DECL static void reactor_operation( - const tracked_handler& h, const char* op_name, - const asio::error_code& ec, std::size_t bytes_transferred); - - // Write a line of output. - ASIO_DECL static void write_line(const char* format, ...); - -private: - struct tracking_state; - ASIO_DECL static tracking_state* get_state(); -}; - -# define ASIO_INHERIT_TRACKED_HANDLER \ - : public asio::detail::handler_tracking::tracked_handler - -# define ASIO_ALSO_INHERIT_TRACKED_HANDLER \ - , public asio::detail::handler_tracking::tracked_handler - -# define ASIO_HANDLER_TRACKING_INIT \ - asio::detail::handler_tracking::init() - -# define ASIO_HANDLER_CREATION(args) \ - asio::detail::handler_tracking::creation args - -# define ASIO_HANDLER_COMPLETION(args) \ - asio::detail::handler_tracking::completion tracked_completion args - -# define ASIO_HANDLER_INVOCATION_BEGIN(args) \ - tracked_completion.invocation_begin args - -# define ASIO_HANDLER_INVOCATION_END \ - tracked_completion.invocation_end() - -# define ASIO_HANDLER_OPERATION(args) \ - asio::detail::handler_tracking::operation args - -# define ASIO_HANDLER_REACTOR_REGISTRATION(args) \ - asio::detail::handler_tracking::reactor_registration args - -# define ASIO_HANDLER_REACTOR_DEREGISTRATION(args) \ - asio::detail::handler_tracking::reactor_deregistration args - -# define ASIO_HANDLER_REACTOR_READ_EVENT 1 -# define ASIO_HANDLER_REACTOR_WRITE_EVENT 2 -# define ASIO_HANDLER_REACTOR_ERROR_EVENT 4 - -# define ASIO_HANDLER_REACTOR_EVENTS(args) \ - asio::detail::handler_tracking::reactor_events args - -# define ASIO_HANDLER_REACTOR_OPERATION(args) \ - asio::detail::handler_tracking::reactor_operation args - -#else // defined(ASIO_ENABLE_HANDLER_TRACKING) - -# define ASIO_INHERIT_TRACKED_HANDLER -# define ASIO_ALSO_INHERIT_TRACKED_HANDLER -# define ASIO_HANDLER_TRACKING_INIT (void)0 -# define ASIO_HANDLER_CREATION(args) (void)0 -# define ASIO_HANDLER_COMPLETION(args) (void)0 -# define ASIO_HANDLER_INVOCATION_BEGIN(args) (void)0 -# define ASIO_HANDLER_INVOCATION_END (void)0 -# define ASIO_HANDLER_OPERATION(args) (void)0 -# define ASIO_HANDLER_REACTOR_REGISTRATION(args) (void)0 -# define ASIO_HANDLER_REACTOR_DEREGISTRATION(args) (void)0 -# define ASIO_HANDLER_REACTOR_READ_EVENT 0 -# define ASIO_HANDLER_REACTOR_WRITE_EVENT 0 -# define ASIO_HANDLER_REACTOR_ERROR_EVENT 0 -# define ASIO_HANDLER_REACTOR_EVENTS(args) (void)0 -# define ASIO_HANDLER_REACTOR_OPERATION(args) (void)0 - -#endif // defined(ASIO_ENABLE_HANDLER_TRACKING) - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/handler_tracking.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_HANDLER_TRACKING_HPP diff --git a/scout_sdk/asio/asio/detail/handler_type_requirements.hpp b/scout_sdk/asio/asio/detail/handler_type_requirements.hpp deleted file mode 100644 index 9181bc5..0000000 --- a/scout_sdk/asio/asio/detail/handler_type_requirements.hpp +++ /dev/null @@ -1,556 +0,0 @@ -// -// detail/handler_type_requirements.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_TYPE_REQUIREMENTS_HPP -#define ASIO_DETAIL_HANDLER_TYPE_REQUIREMENTS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -// Older versions of gcc have difficulty compiling the sizeof expressions where -// we test the handler type requirements. We'll disable checking of handler type -// requirements for those compilers, but otherwise enable it by default. -#if !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS) -# if !defined(__GNUC__) || (__GNUC__ >= 4) -# define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS 1 -# endif // !defined(__GNUC__) || (__GNUC__ >= 4) -#endif // !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS) - -// With C++0x we can use a combination of enhanced SFINAE and static_assert to -// generate better template error messages. As this technique is not yet widely -// portable, we'll only enable it for tested compilers. -#if !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) -# if defined(__GNUC__) -# if ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# if defined(__GXX_EXPERIMENTAL_CXX0X__) -# define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT 1 -# endif // defined(__GXX_EXPERIMENTAL_CXX0X__) -# endif // ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)) || (__GNUC__ > 4) -# endif // defined(__GNUC__) -# if defined(ASIO_MSVC) -# if (_MSC_VER >= 1600) -# define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT 1 -# endif // (_MSC_VER >= 1600) -# endif // defined(ASIO_MSVC) -# if defined(__clang__) -# if __has_feature(__cxx_static_assert__) -# define ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT 1 -# endif // __has_feature(cxx_static_assert) -# endif // defined(__clang__) -#endif // !defined(ASIO_DISABLE_HANDLER_TYPE_REQUIREMENTS) - -#if defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) -# include "asio/async_result.hpp" -#endif // defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) - -namespace asio { -namespace detail { - -#if defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) - -# if defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) - -template -auto zero_arg_copyable_handler_test(Handler h, void*) - -> decltype( - sizeof(Handler(static_cast(h))), - ((h)()), - char(0)); - -template -char (&zero_arg_copyable_handler_test(Handler, ...))[2]; - -template -auto one_arg_handler_test(Handler h, Arg1* a1) - -> decltype( - sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))), - ((h)(*a1)), - char(0)); - -template -char (&one_arg_handler_test(Handler h, ...))[2]; - -template -auto two_arg_handler_test(Handler h, Arg1* a1, Arg2* a2) - -> decltype( - sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))), - ((h)(*a1, *a2)), - char(0)); - -template -char (&two_arg_handler_test(Handler, ...))[2]; - -template -auto two_arg_move_handler_test(Handler h, Arg1* a1, Arg2* a2) - -> decltype( - sizeof(Handler(ASIO_MOVE_CAST(Handler)(h))), - ((h)(*a1, ASIO_MOVE_CAST(Arg2)(*a2))), - char(0)); - -template -char (&two_arg_move_handler_test(Handler, ...))[2]; - -# define ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT(expr, msg) \ - static_assert(expr, msg); - -# else // defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) - -# define ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT(expr, msg) - -# endif // defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS_ASSERT) - -template T& lvref(); -template T& lvref(T); -template const T& clvref(); -template const T& clvref(T); -#if defined(ASIO_HAS_MOVE) -template T rvref(); -template T rvref(T); -#else // defined(ASIO_HAS_MOVE) -template const T& rvref(); -template const T& rvref(T); -#endif // defined(ASIO_HAS_MOVE) -template char argbyv(T); - -template -struct handler_type_requirements -{ -}; - -#define ASIO_LEGACY_COMPLETION_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void()) asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::zero_arg_copyable_handler_test( \ - asio::detail::clvref< \ - asio_true_handler_type>(), 0)) == 1, \ - "CompletionHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::clvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()(), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_READ_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, std::size_t)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "ReadHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_WRITE_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, std::size_t)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "WriteHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_ACCEPT_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::one_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0))) == 1, \ - "AcceptHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_MOVE_ACCEPT_HANDLER_CHECK( \ - handler_type, handler, socket_type) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, socket_type)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_move_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "MoveAcceptHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::rvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_CONNECT_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::one_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0))) == 1, \ - "ConnectHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_RANGE_CONNECT_HANDLER_CHECK( \ - handler_type, handler, endpoint_type) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, endpoint_type)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "RangeConnectHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_ITERATOR_CONNECT_HANDLER_CHECK( \ - handler_type, handler, iter_type) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, iter_type)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "IteratorConnectHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_RESOLVE_HANDLER_CHECK( \ - handler_type, handler, range_type) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, range_type)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "ResolveHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_WAIT_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::one_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0))) == 1, \ - "WaitHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_SIGNAL_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, int)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "SignalHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_HANDSHAKE_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::one_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0))) == 1, \ - "HandshakeHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_BUFFERED_HANDSHAKE_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code, std::size_t)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::two_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0), \ - static_cast(0))) == 1, \ - "BufferedHandshakeHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref(), \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#define ASIO_SHUTDOWN_HANDLER_CHECK( \ - handler_type, handler) \ - \ - typedef ASIO_HANDLER_TYPE(handler_type, \ - void(asio::error_code)) \ - asio_true_handler_type; \ - \ - ASIO_HANDLER_TYPE_REQUIREMENTS_ASSERT( \ - sizeof(asio::detail::one_arg_handler_test( \ - asio::detail::rvref< \ - asio_true_handler_type>(), \ - static_cast(0))) == 1, \ - "ShutdownHandler type requirements not met") \ - \ - typedef asio::detail::handler_type_requirements< \ - sizeof( \ - asio::detail::argbyv( \ - asio::detail::rvref< \ - asio_true_handler_type>())) + \ - sizeof( \ - asio::detail::lvref< \ - asio_true_handler_type>()( \ - asio::detail::lvref()), \ - char(0))> ASIO_UNUSED_TYPEDEF - -#else // !defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) - -#define ASIO_LEGACY_COMPLETION_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_READ_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_WRITE_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_ACCEPT_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_MOVE_ACCEPT_HANDLER_CHECK( \ - handler_type, handler, socket_type) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_CONNECT_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_RANGE_CONNECT_HANDLER_CHECK( \ - handler_type, handler, iter_type) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_ITERATOR_CONNECT_HANDLER_CHECK( \ - handler_type, handler, iter_type) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_RESOLVE_HANDLER_CHECK( \ - handler_type, handler, iter_type) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_WAIT_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_SIGNAL_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_HANDSHAKE_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_BUFFERED_HANDSHAKE_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#define ASIO_SHUTDOWN_HANDLER_CHECK( \ - handler_type, handler) \ - typedef int ASIO_UNUSED_TYPEDEF - -#endif // !defined(ASIO_ENABLE_HANDLER_TYPE_REQUIREMENTS) - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_HANDLER_TYPE_REQUIREMENTS_HPP diff --git a/scout_sdk/asio/asio/detail/handler_work.hpp b/scout_sdk/asio/asio/detail/handler_work.hpp deleted file mode 100644 index cce5c4b..0000000 --- a/scout_sdk/asio/asio/detail/handler_work.hpp +++ /dev/null @@ -1,95 +0,0 @@ -// -// detail/handler_work.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_WORK_HPP -#define ASIO_DETAIL_HANDLER_WORK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// A helper class template to allow completion handlers to be dispatched -// through either the new executors framework or the old invocaton hook. The -// primary template uses the new executors framework. -template ::type> -class handler_work -{ -public: - explicit handler_work(Handler& handler) ASIO_NOEXCEPT - : executor_(associated_executor::get(handler)) - { - } - - static void start(Handler& handler) ASIO_NOEXCEPT - { - Executor ex(associated_executor::get(handler)); - ex.on_work_started(); - } - - ~handler_work() - { - executor_.on_work_finished(); - } - - template - void complete(Function& function, Handler& handler) - { - executor_.dispatch(ASIO_MOVE_CAST(Function)(function), - associated_allocator::get(handler)); - } - -private: - // Disallow copying and assignment. - handler_work(const handler_work&); - handler_work& operator=(const handler_work&); - - typename associated_executor::type executor_; -}; - -// This specialisation dispatches a handler through the old invocation hook. -// The specialisation is not strictly required for correctness, as the -// system_executor will dispatch through the hook anyway. However, by doing -// this we avoid an extra copy of the handler. -template -class handler_work -{ -public: - explicit handler_work(Handler&) ASIO_NOEXCEPT {} - static void start(Handler&) ASIO_NOEXCEPT {} - ~handler_work() {} - - template - void complete(Function& function, Handler& handler) - { - asio_handler_invoke_helpers::invoke(function, handler); - } - -private: - // Disallow copying and assignment. - handler_work(const handler_work&); - handler_work& operator=(const handler_work&); -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HANDLER_WORK_HPP diff --git a/scout_sdk/asio/asio/detail/hash_map.hpp b/scout_sdk/asio/asio/detail/hash_map.hpp deleted file mode 100644 index e70970d..0000000 --- a/scout_sdk/asio/asio/detail/hash_map.hpp +++ /dev/null @@ -1,331 +0,0 @@ -// -// detail/hash_map.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HASH_MAP_HPP -#define ASIO_DETAIL_HASH_MAP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include "asio/detail/assert.hpp" -#include "asio/detail/noncopyable.hpp" - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# include "asio/detail/socket_types.hpp" -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -inline std::size_t calculate_hash_value(int i) -{ - return static_cast(i); -} - -inline std::size_t calculate_hash_value(void* p) -{ - return reinterpret_cast(p) - + (reinterpret_cast(p) >> 3); -} - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -inline std::size_t calculate_hash_value(SOCKET s) -{ - return static_cast(s); -} -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -// Note: assumes K and V are POD types. -template -class hash_map - : private noncopyable -{ -public: - // The type of a value in the map. - typedef std::pair value_type; - - // The type of a non-const iterator over the hash map. - typedef typename std::list::iterator iterator; - - // The type of a const iterator over the hash map. - typedef typename std::list::const_iterator const_iterator; - - // Constructor. - hash_map() - : size_(0), - buckets_(0), - num_buckets_(0) - { - } - - // Destructor. - ~hash_map() - { - delete[] buckets_; - } - - // Get an iterator for the beginning of the map. - iterator begin() - { - return values_.begin(); - } - - // Get an iterator for the beginning of the map. - const_iterator begin() const - { - return values_.begin(); - } - - // Get an iterator for the end of the map. - iterator end() - { - return values_.end(); - } - - // Get an iterator for the end of the map. - const_iterator end() const - { - return values_.end(); - } - - // Check whether the map is empty. - bool empty() const - { - return values_.empty(); - } - - // Find an entry in the map. - iterator find(const K& k) - { - if (num_buckets_) - { - size_t bucket = calculate_hash_value(k) % num_buckets_; - iterator it = buckets_[bucket].first; - if (it == values_.end()) - return values_.end(); - iterator end_it = buckets_[bucket].last; - ++end_it; - while (it != end_it) - { - if (it->first == k) - return it; - ++it; - } - } - return values_.end(); - } - - // Find an entry in the map. - const_iterator find(const K& k) const - { - if (num_buckets_) - { - size_t bucket = calculate_hash_value(k) % num_buckets_; - const_iterator it = buckets_[bucket].first; - if (it == values_.end()) - return it; - const_iterator end_it = buckets_[bucket].last; - ++end_it; - while (it != end_it) - { - if (it->first == k) - return it; - ++it; - } - } - return values_.end(); - } - - // Insert a new entry into the map. - std::pair insert(const value_type& v) - { - if (size_ + 1 >= num_buckets_) - rehash(hash_size(size_ + 1)); - size_t bucket = calculate_hash_value(v.first) % num_buckets_; - iterator it = buckets_[bucket].first; - if (it == values_.end()) - { - buckets_[bucket].first = buckets_[bucket].last = - values_insert(values_.end(), v); - ++size_; - return std::pair(buckets_[bucket].last, true); - } - iterator end_it = buckets_[bucket].last; - ++end_it; - while (it != end_it) - { - if (it->first == v.first) - return std::pair(it, false); - ++it; - } - buckets_[bucket].last = values_insert(end_it, v); - ++size_; - return std::pair(buckets_[bucket].last, true); - } - - // Erase an entry from the map. - void erase(iterator it) - { - ASIO_ASSERT(it != values_.end()); - ASIO_ASSERT(num_buckets_ != 0); - - size_t bucket = calculate_hash_value(it->first) % num_buckets_; - bool is_first = (it == buckets_[bucket].first); - bool is_last = (it == buckets_[bucket].last); - if (is_first && is_last) - buckets_[bucket].first = buckets_[bucket].last = values_.end(); - else if (is_first) - ++buckets_[bucket].first; - else if (is_last) - --buckets_[bucket].last; - - values_erase(it); - --size_; - } - - // Erase a key from the map. - void erase(const K& k) - { - iterator it = find(k); - if (it != values_.end()) - erase(it); - } - - // Remove all entries from the map. - void clear() - { - // Clear the values. - values_.clear(); - size_ = 0; - - // Initialise all buckets to empty. - iterator end_it = values_.end(); - for (size_t i = 0; i < num_buckets_; ++i) - buckets_[i].first = buckets_[i].last = end_it; - } - -private: - // Calculate the hash size for the specified number of elements. - static std::size_t hash_size(std::size_t num_elems) - { - static std::size_t sizes[] = - { -#if defined(ASIO_HASH_MAP_BUCKETS) - ASIO_HASH_MAP_BUCKETS -#else // ASIO_HASH_MAP_BUCKETS - 3, 13, 23, 53, 97, 193, 389, 769, 1543, 3079, 6151, 12289, 24593, - 49157, 98317, 196613, 393241, 786433, 1572869, 3145739, 6291469, - 12582917, 25165843 -#endif // ASIO_HASH_MAP_BUCKETS - }; - const std::size_t nth_size = sizeof(sizes) / sizeof(std::size_t) - 1; - for (std::size_t i = 0; i < nth_size; ++i) - if (num_elems < sizes[i]) - return sizes[i]; - return sizes[nth_size]; - } - - // Re-initialise the hash from the values already contained in the list. - void rehash(std::size_t num_buckets) - { - if (num_buckets == num_buckets_) - return; - ASIO_ASSERT(num_buckets != 0); - - iterator end_iter = values_.end(); - - // Update number of buckets and initialise all buckets to empty. - bucket_type* tmp = new bucket_type[num_buckets]; - delete[] buckets_; - buckets_ = tmp; - num_buckets_ = num_buckets; - for (std::size_t i = 0; i < num_buckets_; ++i) - buckets_[i].first = buckets_[i].last = end_iter; - - // Put all values back into the hash. - iterator iter = values_.begin(); - while (iter != end_iter) - { - std::size_t bucket = calculate_hash_value(iter->first) % num_buckets_; - if (buckets_[bucket].last == end_iter) - { - buckets_[bucket].first = buckets_[bucket].last = iter++; - } - else if (++buckets_[bucket].last == iter) - { - ++iter; - } - else - { - values_.splice(buckets_[bucket].last, values_, iter++); - --buckets_[bucket].last; - } - } - } - - // Insert an element into the values list by splicing from the spares list, - // if a spare is available, and otherwise by inserting a new element. - iterator values_insert(iterator it, const value_type& v) - { - if (spares_.empty()) - { - return values_.insert(it, v); - } - else - { - spares_.front() = v; - values_.splice(it, spares_, spares_.begin()); - return --it; - } - } - - // Erase an element from the values list by splicing it to the spares list. - void values_erase(iterator it) - { - *it = value_type(); - spares_.splice(spares_.begin(), values_, it); - } - - // The number of elements in the hash. - std::size_t size_; - - // The list of all values in the hash map. - std::list values_; - - // The list of spare nodes waiting to be recycled. Assumes that POD types only - // are stored in the hash map. - std::list spares_; - - // The type for a bucket in the hash table. - struct bucket_type - { - iterator first; - iterator last; - }; - - // The buckets in the hash. - bucket_type* buckets_; - - // The number of buckets in the hash. - std::size_t num_buckets_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HASH_MAP_HPP diff --git a/scout_sdk/asio/asio/detail/impl/buffer_sequence_adapter.ipp b/scout_sdk/asio/asio/detail/impl/buffer_sequence_adapter.ipp deleted file mode 100644 index 323c8ad..0000000 --- a/scout_sdk/asio/asio/detail/impl/buffer_sequence_adapter.ipp +++ /dev/null @@ -1,118 +0,0 @@ -// -// detail/impl/buffer_sequence_adapter.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_BUFFER_SEQUENCE_ADAPTER_IPP -#define ASIO_DETAIL_IMPL_BUFFER_SEQUENCE_ADAPTER_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include -#include -#include -#include "asio/detail/buffer_sequence_adapter.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class winrt_buffer_impl : - public Microsoft::WRL::RuntimeClass< - Microsoft::WRL::RuntimeClassFlags< - Microsoft::WRL::RuntimeClassType::WinRtClassicComMix>, - ABI::Windows::Storage::Streams::IBuffer, - Windows::Storage::Streams::IBufferByteAccess> -{ -public: - explicit winrt_buffer_impl(const asio::const_buffer& b) - { - bytes_ = const_cast(static_cast(b.data())); - length_ = b.size(); - capacity_ = b.size(); - } - - explicit winrt_buffer_impl(const asio::mutable_buffer& b) - { - bytes_ = static_cast(b.data()); - length_ = 0; - capacity_ = b.size(); - } - - ~winrt_buffer_impl() - { - } - - STDMETHODIMP Buffer(byte** value) - { - *value = bytes_; - return S_OK; - } - - STDMETHODIMP get_Capacity(UINT32* value) - { - *value = capacity_; - return S_OK; - } - - STDMETHODIMP get_Length(UINT32 *value) - { - *value = length_; - return S_OK; - } - - STDMETHODIMP put_Length(UINT32 value) - { - if (value > capacity_) - return E_INVALIDARG; - length_ = value; - return S_OK; - } - -private: - byte* bytes_; - UINT32 length_; - UINT32 capacity_; -}; - -void buffer_sequence_adapter_base::init_native_buffer( - buffer_sequence_adapter_base::native_buffer_type& buf, - const asio::mutable_buffer& buffer) -{ - std::memset(&buf, 0, sizeof(native_buffer_type)); - Microsoft::WRL::ComPtr insp - = Microsoft::WRL::Make(buffer); - buf = reinterpret_cast(insp.Get()); -} - -void buffer_sequence_adapter_base::init_native_buffer( - buffer_sequence_adapter_base::native_buffer_type& buf, - const asio::const_buffer& buffer) -{ - std::memset(&buf, 0, sizeof(native_buffer_type)); - Microsoft::WRL::ComPtr insp - = Microsoft::WRL::Make(buffer); - Platform::Object^ buf_obj = reinterpret_cast(insp.Get()); - buf = reinterpret_cast(insp.Get()); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_BUFFER_SEQUENCE_ADAPTER_IPP diff --git a/scout_sdk/asio/asio/detail/impl/descriptor_ops.ipp b/scout_sdk/asio/asio/detail/impl/descriptor_ops.ipp deleted file mode 100644 index 1af643f..0000000 --- a/scout_sdk/asio/asio/detail/impl/descriptor_ops.ipp +++ /dev/null @@ -1,474 +0,0 @@ -// -// detail/impl/descriptor_ops.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_DESCRIPTOR_OPS_IPP -#define ASIO_DETAIL_IMPL_DESCRIPTOR_OPS_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/descriptor_ops.hpp" -#include "asio/error.hpp" - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { -namespace descriptor_ops { - -int open(const char* path, int flags, asio::error_code& ec) -{ - errno = 0; - int result = error_wrapper(::open(path, flags), ec); - if (result >= 0) - ec = asio::error_code(); - return result; -} - -int close(int d, state_type& state, asio::error_code& ec) -{ - int result = 0; - if (d != -1) - { - errno = 0; - result = error_wrapper(::close(d), ec); - - if (result != 0 - && (ec == asio::error::would_block - || ec == asio::error::try_again)) - { - // According to UNIX Network Programming Vol. 1, it is possible for - // close() to fail with EWOULDBLOCK under certain circumstances. What - // isn't clear is the state of the descriptor after this error. The one - // current OS where this behaviour is seen, Windows, says that the socket - // remains open. Therefore we'll put the descriptor back into blocking - // mode and have another attempt at closing it. -#if defined(__SYMBIAN32__) - int flags = ::fcntl(d, F_GETFL, 0); - if (flags >= 0) - ::fcntl(d, F_SETFL, flags & ~O_NONBLOCK); -#else // defined(__SYMBIAN32__) - ioctl_arg_type arg = 0; - ::ioctl(d, FIONBIO, &arg); -#endif // defined(__SYMBIAN32__) - state &= ~non_blocking; - - errno = 0; - result = error_wrapper(::close(d), ec); - } - } - - if (result == 0) - ec = asio::error_code(); - return result; -} - -bool set_user_non_blocking(int d, state_type& state, - bool value, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return false; - } - - errno = 0; -#if defined(__SYMBIAN32__) - int result = error_wrapper(::fcntl(d, F_GETFL, 0), ec); - if (result >= 0) - { - errno = 0; - int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); - result = error_wrapper(::fcntl(d, F_SETFL, flag), ec); - } -#else // defined(__SYMBIAN32__) - ioctl_arg_type arg = (value ? 1 : 0); - int result = error_wrapper(::ioctl(d, FIONBIO, &arg), ec); -#endif // defined(__SYMBIAN32__) - - if (result >= 0) - { - ec = asio::error_code(); - if (value) - state |= user_set_non_blocking; - else - { - // Clearing the user-set non-blocking mode always overrides any - // internally-set non-blocking flag. Any subsequent asynchronous - // operations will need to re-enable non-blocking I/O. - state &= ~(user_set_non_blocking | internal_non_blocking); - } - return true; - } - - return false; -} - -bool set_internal_non_blocking(int d, state_type& state, - bool value, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return false; - } - - if (!value && (state & user_set_non_blocking)) - { - // It does not make sense to clear the internal non-blocking flag if the - // user still wants non-blocking behaviour. Return an error and let the - // caller figure out whether to update the user-set non-blocking flag. - ec = asio::error::invalid_argument; - return false; - } - - errno = 0; -#if defined(__SYMBIAN32__) - int result = error_wrapper(::fcntl(d, F_GETFL, 0), ec); - if (result >= 0) - { - errno = 0; - int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); - result = error_wrapper(::fcntl(d, F_SETFL, flag), ec); - } -#else // defined(__SYMBIAN32__) - ioctl_arg_type arg = (value ? 1 : 0); - int result = error_wrapper(::ioctl(d, FIONBIO, &arg), ec); -#endif // defined(__SYMBIAN32__) - - if (result >= 0) - { - ec = asio::error_code(); - if (value) - state |= internal_non_blocking; - else - state &= ~internal_non_blocking; - return true; - } - - return false; -} - -std::size_t sync_read(int d, state_type state, buf* bufs, - std::size_t count, bool all_empty, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // A request to read 0 bytes on a stream is a no-op. - if (all_empty) - { - ec = asio::error_code(); - return 0; - } - - // Read some data. - for (;;) - { - // Try to complete the operation without blocking. - errno = 0; - signed_size_type bytes = error_wrapper(::readv( - d, bufs, static_cast(count)), ec); - - // Check if operation succeeded. - if (bytes > 0) - return bytes; - - // Check for EOF. - if (bytes == 0) - { - ec = asio::error::eof; - return 0; - } - - // Operation failed. - if ((state & user_set_non_blocking) - || (ec != asio::error::would_block - && ec != asio::error::try_again)) - return 0; - - // Wait for descriptor to become ready. - if (descriptor_ops::poll_read(d, 0, ec) < 0) - return 0; - } -} - -bool non_blocking_read(int d, buf* bufs, std::size_t count, - asio::error_code& ec, std::size_t& bytes_transferred) -{ - for (;;) - { - // Read some data. - errno = 0; - signed_size_type bytes = error_wrapper(::readv( - d, bufs, static_cast(count)), ec); - - // Check for end of stream. - if (bytes == 0) - { - ec = asio::error::eof; - return true; - } - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Check if we need to run the operation again. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - return false; - - // Operation is complete. - if (bytes > 0) - { - ec = asio::error_code(); - bytes_transferred = bytes; - } - else - bytes_transferred = 0; - - return true; - } -} - -std::size_t sync_write(int d, state_type state, const buf* bufs, - std::size_t count, bool all_empty, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // A request to write 0 bytes on a stream is a no-op. - if (all_empty) - { - ec = asio::error_code(); - return 0; - } - - // Write some data. - for (;;) - { - // Try to complete the operation without blocking. - errno = 0; - signed_size_type bytes = error_wrapper(::writev( - d, bufs, static_cast(count)), ec); - - // Check if operation succeeded. - if (bytes > 0) - return bytes; - - // Operation failed. - if ((state & user_set_non_blocking) - || (ec != asio::error::would_block - && ec != asio::error::try_again)) - return 0; - - // Wait for descriptor to become ready. - if (descriptor_ops::poll_write(d, 0, ec) < 0) - return 0; - } -} - -bool non_blocking_write(int d, const buf* bufs, std::size_t count, - asio::error_code& ec, std::size_t& bytes_transferred) -{ - for (;;) - { - // Write some data. - errno = 0; - signed_size_type bytes = error_wrapper(::writev( - d, bufs, static_cast(count)), ec); - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Check if we need to run the operation again. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - return false; - - // Operation is complete. - if (bytes >= 0) - { - ec = asio::error_code(); - bytes_transferred = bytes; - } - else - bytes_transferred = 0; - - return true; - } -} - -int ioctl(int d, state_type& state, long cmd, - ioctl_arg_type* arg, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return -1; - } - - errno = 0; - int result = error_wrapper(::ioctl(d, cmd, arg), ec); - - if (result >= 0) - { - ec = asio::error_code(); - - // When updating the non-blocking mode we always perform the ioctl syscall, - // even if the flags would otherwise indicate that the descriptor is - // already in the correct state. This ensures that the underlying - // descriptor is put into the state that has been requested by the user. If - // the ioctl syscall was successful then we need to update the flags to - // match. - if (cmd == static_cast(FIONBIO)) - { - if (*arg) - { - state |= user_set_non_blocking; - } - else - { - // Clearing the non-blocking mode always overrides any internally-set - // non-blocking flag. Any subsequent asynchronous operations will need - // to re-enable non-blocking I/O. - state &= ~(user_set_non_blocking | internal_non_blocking); - } - } - } - - return result; -} - -int fcntl(int d, int cmd, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return -1; - } - - errno = 0; - int result = error_wrapper(::fcntl(d, cmd), ec); - if (result != -1) - ec = asio::error_code(); - return result; -} - -int fcntl(int d, int cmd, long arg, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return -1; - } - - errno = 0; - int result = error_wrapper(::fcntl(d, cmd, arg), ec); - if (result != -1) - ec = asio::error_code(); - return result; -} - -int poll_read(int d, state_type state, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return -1; - } - - pollfd fds; - fds.fd = d; - fds.events = POLLIN; - fds.revents = 0; - int timeout = (state & user_set_non_blocking) ? 0 : -1; - errno = 0; - int result = error_wrapper(::poll(&fds, 1, timeout), ec); - if (result == 0) - ec = (state & user_set_non_blocking) - ? asio::error::would_block : asio::error_code(); - else if (result > 0) - ec = asio::error_code(); - return result; -} - -int poll_write(int d, state_type state, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return -1; - } - - pollfd fds; - fds.fd = d; - fds.events = POLLOUT; - fds.revents = 0; - int timeout = (state & user_set_non_blocking) ? 0 : -1; - errno = 0; - int result = error_wrapper(::poll(&fds, 1, timeout), ec); - if (result == 0) - ec = (state & user_set_non_blocking) - ? asio::error::would_block : asio::error_code(); - else if (result > 0) - ec = asio::error_code(); - return result; -} - -int poll_error(int d, state_type state, asio::error_code& ec) -{ - if (d == -1) - { - ec = asio::error::bad_descriptor; - return -1; - } - - pollfd fds; - fds.fd = d; - fds.events = POLLPRI | POLLERR | POLLHUP; - fds.revents = 0; - int timeout = (state & user_set_non_blocking) ? 0 : -1; - errno = 0; - int result = error_wrapper(::poll(&fds, 1, timeout), ec); - if (result == 0) - ec = (state & user_set_non_blocking) - ? asio::error::would_block : asio::error_code(); - else if (result > 0) - ec = asio::error_code(); - return result; -} - -} // namespace descriptor_ops -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - -#endif // ASIO_DETAIL_IMPL_DESCRIPTOR_OPS_IPP diff --git a/scout_sdk/asio/asio/detail/impl/dev_poll_reactor.hpp b/scout_sdk/asio/asio/detail/impl/dev_poll_reactor.hpp deleted file mode 100644 index 4cd8aaf..0000000 --- a/scout_sdk/asio/asio/detail/impl/dev_poll_reactor.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// detail/impl/dev_poll_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_HPP -#define ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_DEV_POLL) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -void dev_poll_reactor::add_timer_queue(timer_queue& queue) -{ - do_add_timer_queue(queue); -} - -template -void dev_poll_reactor::remove_timer_queue(timer_queue& queue) -{ - do_remove_timer_queue(queue); -} - -template -void dev_poll_reactor::schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - scheduler_.post_immediate_completion(op, false); - return; - } - - bool earliest = queue.enqueue_timer(time, timer, op); - scheduler_.work_started(); - if (earliest) - interrupter_.interrupt(); -} - -template -std::size_t dev_poll_reactor::cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue ops; - std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); - lock.unlock(); - scheduler_.post_deferred_completions(ops); - return n; -} - -template -void dev_poll_reactor::move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue ops; - queue.cancel_timer(target, ops); - queue.move_timer(target, source); - lock.unlock(); - scheduler_.post_deferred_completions(ops); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_DEV_POLL) - -#endif // ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/impl/dev_poll_reactor.ipp b/scout_sdk/asio/asio/detail/impl/dev_poll_reactor.ipp deleted file mode 100644 index 1ca376c..0000000 --- a/scout_sdk/asio/asio/detail/impl/dev_poll_reactor.ipp +++ /dev/null @@ -1,446 +0,0 @@ -// -// detail/impl/dev_poll_reactor.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_IPP -#define ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_DEV_POLL) - -#include "asio/detail/dev_poll_reactor.hpp" -#include "asio/detail/assert.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -dev_poll_reactor::dev_poll_reactor(asio::execution_context& ctx) - : asio::detail::execution_context_service_base(ctx), - scheduler_(use_service(ctx)), - mutex_(), - dev_poll_fd_(do_dev_poll_create()), - interrupter_(), - shutdown_(false) -{ - // Add the interrupter's descriptor to /dev/poll. - ::pollfd ev = { 0, 0, 0 }; - ev.fd = interrupter_.read_descriptor(); - ev.events = POLLIN | POLLERR; - ev.revents = 0; - ::write(dev_poll_fd_, &ev, sizeof(ev)); -} - -dev_poll_reactor::~dev_poll_reactor() -{ - shutdown(); - ::close(dev_poll_fd_); -} - -void dev_poll_reactor::shutdown() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; - lock.unlock(); - - op_queue ops; - - for (int i = 0; i < max_ops; ++i) - op_queue_[i].get_all_operations(ops); - - timer_queues_.get_all_timers(ops); - - scheduler_.abandon_operations(ops); -} - -void dev_poll_reactor::notify_fork( - asio::execution_context::fork_event fork_ev) -{ - if (fork_ev == asio::execution_context::fork_child) - { - detail::mutex::scoped_lock lock(mutex_); - - if (dev_poll_fd_ != -1) - ::close(dev_poll_fd_); - dev_poll_fd_ = -1; - dev_poll_fd_ = do_dev_poll_create(); - - interrupter_.recreate(); - - // Add the interrupter's descriptor to /dev/poll. - ::pollfd ev = { 0, 0, 0 }; - ev.fd = interrupter_.read_descriptor(); - ev.events = POLLIN | POLLERR; - ev.revents = 0; - ::write(dev_poll_fd_, &ev, sizeof(ev)); - - // Re-register all descriptors with /dev/poll. The changes will be written - // to the /dev/poll descriptor the next time the reactor is run. - for (int i = 0; i < max_ops; ++i) - { - reactor_op_queue::iterator iter = op_queue_[i].begin(); - reactor_op_queue::iterator end = op_queue_[i].end(); - for (; iter != end; ++iter) - { - ::pollfd& pending_ev = add_pending_event_change(iter->first); - pending_ev.events |= POLLERR | POLLHUP; - switch (i) - { - case read_op: pending_ev.events |= POLLIN; break; - case write_op: pending_ev.events |= POLLOUT; break; - case except_op: pending_ev.events |= POLLPRI; break; - default: break; - } - } - } - interrupter_.interrupt(); - } -} - -void dev_poll_reactor::init_task() -{ - scheduler_.init_task(); -} - -int dev_poll_reactor::register_descriptor(socket_type, per_descriptor_data&) -{ - return 0; -} - -int dev_poll_reactor::register_internal_descriptor(int op_type, - socket_type descriptor, per_descriptor_data&, reactor_op* op) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - op_queue_[op_type].enqueue_operation(descriptor, op); - ::pollfd& ev = add_pending_event_change(descriptor); - ev.events = POLLERR | POLLHUP; - switch (op_type) - { - case read_op: ev.events |= POLLIN; break; - case write_op: ev.events |= POLLOUT; break; - case except_op: ev.events |= POLLPRI; break; - default: break; - } - interrupter_.interrupt(); - - return 0; -} - -void dev_poll_reactor::move_descriptor(socket_type, - dev_poll_reactor::per_descriptor_data&, - dev_poll_reactor::per_descriptor_data&) -{ -} - -void dev_poll_reactor::start_op(int op_type, socket_type descriptor, - dev_poll_reactor::per_descriptor_data&, reactor_op* op, - bool is_continuation, bool allow_speculative) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - post_immediate_completion(op, is_continuation); - return; - } - - if (allow_speculative) - { - if (op_type != read_op || !op_queue_[except_op].has_operation(descriptor)) - { - if (!op_queue_[op_type].has_operation(descriptor)) - { - if (op->perform()) - { - lock.unlock(); - scheduler_.post_immediate_completion(op, is_continuation); - return; - } - } - } - } - - bool first = op_queue_[op_type].enqueue_operation(descriptor, op); - scheduler_.work_started(); - if (first) - { - ::pollfd& ev = add_pending_event_change(descriptor); - ev.events = POLLERR | POLLHUP; - if (op_type == read_op - || op_queue_[read_op].has_operation(descriptor)) - ev.events |= POLLIN; - if (op_type == write_op - || op_queue_[write_op].has_operation(descriptor)) - ev.events |= POLLOUT; - if (op_type == except_op - || op_queue_[except_op].has_operation(descriptor)) - ev.events |= POLLPRI; - interrupter_.interrupt(); - } -} - -void dev_poll_reactor::cancel_ops(socket_type descriptor, - dev_poll_reactor::per_descriptor_data&) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor, asio::error::operation_aborted); -} - -void dev_poll_reactor::deregister_descriptor(socket_type descriptor, - dev_poll_reactor::per_descriptor_data&, bool) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - // Remove the descriptor from /dev/poll. - ::pollfd& ev = add_pending_event_change(descriptor); - ev.events = POLLREMOVE; - interrupter_.interrupt(); - - // Cancel any outstanding operations associated with the descriptor. - cancel_ops_unlocked(descriptor, asio::error::operation_aborted); -} - -void dev_poll_reactor::deregister_internal_descriptor( - socket_type descriptor, dev_poll_reactor::per_descriptor_data&) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - // Remove the descriptor from /dev/poll. Since this function is only called - // during a fork, we can apply the change immediately. - ::pollfd ev = { 0, 0, 0 }; - ev.fd = descriptor; - ev.events = POLLREMOVE; - ev.revents = 0; - ::write(dev_poll_fd_, &ev, sizeof(ev)); - - // Destroy all operations associated with the descriptor. - op_queue ops; - asio::error_code ec; - for (int i = 0; i < max_ops; ++i) - op_queue_[i].cancel_operations(descriptor, ops, ec); -} - -void dev_poll_reactor::cleanup_descriptor_data( - dev_poll_reactor::per_descriptor_data&) -{ -} - -void dev_poll_reactor::run(long usec, op_queue& ops) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - // We can return immediately if there's no work to do and the reactor is - // not supposed to block. - if (usec == 0 && op_queue_[read_op].empty() && op_queue_[write_op].empty() - && op_queue_[except_op].empty() && timer_queues_.all_empty()) - return; - - // Write the pending event registration changes to the /dev/poll descriptor. - std::size_t events_size = sizeof(::pollfd) * pending_event_changes_.size(); - if (events_size > 0) - { - errno = 0; - int result = ::write(dev_poll_fd_, - &pending_event_changes_[0], events_size); - if (result != static_cast(events_size)) - { - asio::error_code ec = asio::error_code( - errno, asio::error::get_system_category()); - for (std::size_t i = 0; i < pending_event_changes_.size(); ++i) - { - int descriptor = pending_event_changes_[i].fd; - for (int j = 0; j < max_ops; ++j) - op_queue_[j].cancel_operations(descriptor, ops, ec); - } - } - pending_event_changes_.clear(); - pending_event_change_index_.clear(); - } - - // Calculate timeout. - int timeout; - if (usec == 0) - timeout = 0; - else - { - timeout = (usec < 0) ? -1 : ((usec - 1) / 1000 + 1); - timeout = get_timeout(timeout); - } - lock.unlock(); - - // Block on the /dev/poll descriptor. - ::pollfd events[128] = { { 0, 0, 0 } }; - ::dvpoll dp = { 0, 0, 0 }; - dp.dp_fds = events; - dp.dp_nfds = 128; - dp.dp_timeout = timeout; - int num_events = ::ioctl(dev_poll_fd_, DP_POLL, &dp); - - lock.lock(); - - // Dispatch the waiting events. - for (int i = 0; i < num_events; ++i) - { - int descriptor = events[i].fd; - if (descriptor == interrupter_.read_descriptor()) - { - interrupter_.reset(); - } - else - { - bool more_reads = false; - bool more_writes = false; - bool more_except = false; - - // Exception operations must be processed first to ensure that any - // out-of-band data is read before normal data. - if (events[i].events & (POLLPRI | POLLERR | POLLHUP)) - more_except = - op_queue_[except_op].perform_operations(descriptor, ops); - else - more_except = op_queue_[except_op].has_operation(descriptor); - - if (events[i].events & (POLLIN | POLLERR | POLLHUP)) - more_reads = op_queue_[read_op].perform_operations(descriptor, ops); - else - more_reads = op_queue_[read_op].has_operation(descriptor); - - if (events[i].events & (POLLOUT | POLLERR | POLLHUP)) - more_writes = op_queue_[write_op].perform_operations(descriptor, ops); - else - more_writes = op_queue_[write_op].has_operation(descriptor); - - if ((events[i].events & (POLLERR | POLLHUP)) != 0 - && !more_except && !more_reads && !more_writes) - { - // If we have an event and no operations associated with the - // descriptor then we need to delete the descriptor from /dev/poll. - // The poll operation can produce POLLHUP or POLLERR events when there - // is no operation pending, so if we do not remove the descriptor we - // can end up in a tight polling loop. - ::pollfd ev = { 0, 0, 0 }; - ev.fd = descriptor; - ev.events = POLLREMOVE; - ev.revents = 0; - ::write(dev_poll_fd_, &ev, sizeof(ev)); - } - else - { - ::pollfd ev = { 0, 0, 0 }; - ev.fd = descriptor; - ev.events = POLLERR | POLLHUP; - if (more_reads) - ev.events |= POLLIN; - if (more_writes) - ev.events |= POLLOUT; - if (more_except) - ev.events |= POLLPRI; - ev.revents = 0; - int result = ::write(dev_poll_fd_, &ev, sizeof(ev)); - if (result != sizeof(ev)) - { - asio::error_code ec(errno, - asio::error::get_system_category()); - for (int j = 0; j < max_ops; ++j) - op_queue_[j].cancel_operations(descriptor, ops, ec); - } - } - } - } - timer_queues_.get_ready_timers(ops); -} - -void dev_poll_reactor::interrupt() -{ - interrupter_.interrupt(); -} - -int dev_poll_reactor::do_dev_poll_create() -{ - int fd = ::open("/dev/poll", O_RDWR); - if (fd == -1) - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "/dev/poll"); - } - return fd; -} - -void dev_poll_reactor::do_add_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.insert(&queue); -} - -void dev_poll_reactor::do_remove_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.erase(&queue); -} - -int dev_poll_reactor::get_timeout(int msec) -{ - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - const int max_msec = 5 * 60 * 1000; - return timer_queues_.wait_duration_msec( - (msec < 0 || max_msec < msec) ? max_msec : msec); -} - -void dev_poll_reactor::cancel_ops_unlocked(socket_type descriptor, - const asio::error_code& ec) -{ - bool need_interrupt = false; - op_queue ops; - for (int i = 0; i < max_ops; ++i) - need_interrupt = op_queue_[i].cancel_operations( - descriptor, ops, ec) || need_interrupt; - scheduler_.post_deferred_completions(ops); - if (need_interrupt) - interrupter_.interrupt(); -} - -::pollfd& dev_poll_reactor::add_pending_event_change(int descriptor) -{ - hash_map::iterator iter - = pending_event_change_index_.find(descriptor); - if (iter == pending_event_change_index_.end()) - { - std::size_t index = pending_event_changes_.size(); - pending_event_changes_.reserve(pending_event_changes_.size() + 1); - pending_event_change_index_.insert(std::make_pair(descriptor, index)); - pending_event_changes_.push_back(::pollfd()); - pending_event_changes_[index].fd = descriptor; - pending_event_changes_[index].revents = 0; - return pending_event_changes_[index]; - } - else - { - return pending_event_changes_[iter->second]; - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_DEV_POLL) - -#endif // ASIO_DETAIL_IMPL_DEV_POLL_REACTOR_IPP diff --git a/scout_sdk/asio/asio/detail/impl/epoll_reactor.hpp b/scout_sdk/asio/asio/detail/impl/epoll_reactor.hpp deleted file mode 100644 index f990059..0000000 --- a/scout_sdk/asio/asio/detail/impl/epoll_reactor.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// detail/impl/epoll_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_EPOLL_REACTOR_HPP -#define ASIO_DETAIL_IMPL_EPOLL_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if defined(ASIO_HAS_EPOLL) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -void epoll_reactor::add_timer_queue(timer_queue& queue) -{ - do_add_timer_queue(queue); -} - -template -void epoll_reactor::remove_timer_queue(timer_queue& queue) -{ - do_remove_timer_queue(queue); -} - -template -void epoll_reactor::schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op) -{ - mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - scheduler_.post_immediate_completion(op, false); - return; - } - - bool earliest = queue.enqueue_timer(time, timer, op); - scheduler_.work_started(); - if (earliest) - update_timeout(); -} - -template -std::size_t epoll_reactor::cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled) -{ - mutex::scoped_lock lock(mutex_); - op_queue ops; - std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); - lock.unlock(); - scheduler_.post_deferred_completions(ops); - return n; -} - -template -void epoll_reactor::move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source) -{ - mutex::scoped_lock lock(mutex_); - op_queue ops; - queue.cancel_timer(target, ops); - queue.move_timer(target, source); - lock.unlock(); - scheduler_.post_deferred_completions(ops); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_EPOLL) - -#endif // ASIO_DETAIL_IMPL_EPOLL_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/impl/epoll_reactor.ipp b/scout_sdk/asio/asio/detail/impl/epoll_reactor.ipp deleted file mode 100644 index 65584a4..0000000 --- a/scout_sdk/asio/asio/detail/impl/epoll_reactor.ipp +++ /dev/null @@ -1,787 +0,0 @@ -// -// detail/impl/epoll_reactor.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP -#define ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_EPOLL) - -#include -#include -#include "asio/detail/epoll_reactor.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#if defined(ASIO_HAS_TIMERFD) -# include -#endif // defined(ASIO_HAS_TIMERFD) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -epoll_reactor::epoll_reactor(asio::execution_context& ctx) - : execution_context_service_base(ctx), - scheduler_(use_service(ctx)), - mutex_(ASIO_CONCURRENCY_HINT_IS_LOCKING( - REACTOR_REGISTRATION, scheduler_.concurrency_hint())), - interrupter_(), - epoll_fd_(do_epoll_create()), - timer_fd_(do_timerfd_create()), - shutdown_(false), - registered_descriptors_mutex_(mutex_.enabled()) -{ - // Add the interrupter's descriptor to epoll. - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLIN | EPOLLERR | EPOLLET; - ev.data.ptr = &interrupter_; - epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); - interrupter_.interrupt(); - - // Add the timer descriptor to epoll. - if (timer_fd_ != -1) - { - ev.events = EPOLLIN | EPOLLERR; - ev.data.ptr = &timer_fd_; - epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); - } -} - -epoll_reactor::~epoll_reactor() -{ - if (epoll_fd_ != -1) - close(epoll_fd_); - if (timer_fd_ != -1) - close(timer_fd_); -} - -void epoll_reactor::shutdown() -{ - mutex::scoped_lock lock(mutex_); - shutdown_ = true; - lock.unlock(); - - op_queue ops; - - while (descriptor_state* state = registered_descriptors_.first()) - { - for (int i = 0; i < max_ops; ++i) - ops.push(state->op_queue_[i]); - state->shutdown_ = true; - registered_descriptors_.free(state); - } - - timer_queues_.get_all_timers(ops); - - scheduler_.abandon_operations(ops); -} - -void epoll_reactor::notify_fork( - asio::execution_context::fork_event fork_ev) -{ - if (fork_ev == asio::execution_context::fork_child) - { - if (epoll_fd_ != -1) - ::close(epoll_fd_); - epoll_fd_ = -1; - epoll_fd_ = do_epoll_create(); - - if (timer_fd_ != -1) - ::close(timer_fd_); - timer_fd_ = -1; - timer_fd_ = do_timerfd_create(); - - interrupter_.recreate(); - - // Add the interrupter's descriptor to epoll. - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLIN | EPOLLERR | EPOLLET; - ev.data.ptr = &interrupter_; - epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); - interrupter_.interrupt(); - - // Add the timer descriptor to epoll. - if (timer_fd_ != -1) - { - ev.events = EPOLLIN | EPOLLERR; - ev.data.ptr = &timer_fd_; - epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); - } - - update_timeout(); - - // Re-register all descriptors with epoll. - mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); - for (descriptor_state* state = registered_descriptors_.first(); - state != 0; state = state->next_) - { - ev.events = state->registered_events_; - ev.data.ptr = state; - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev); - if (result != 0) - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "epoll re-registration"); - } - } - } -} - -void epoll_reactor::init_task() -{ - scheduler_.init_task(); -} - -int epoll_reactor::register_descriptor(socket_type descriptor, - epoll_reactor::per_descriptor_data& descriptor_data) -{ - descriptor_data = allocate_descriptor_state(); - - ASIO_HANDLER_REACTOR_REGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - { - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - descriptor_data->reactor_ = this; - descriptor_data->descriptor_ = descriptor; - descriptor_data->shutdown_ = false; - for (int i = 0; i < max_ops; ++i) - descriptor_data->try_speculative_[i] = true; - } - - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; - descriptor_data->registered_events_ = ev.events; - ev.data.ptr = descriptor_data; - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); - if (result != 0) - { - if (errno == EPERM) - { - // This file descriptor type is not supported by epoll. However, if it is - // a regular file then operations on it will not block. We will allow - // this descriptor to be used and fail later if an operation on it would - // otherwise require a trip through the reactor. - descriptor_data->registered_events_ = 0; - return 0; - } - return errno; - } - - return 0; -} - -int epoll_reactor::register_internal_descriptor( - int op_type, socket_type descriptor, - epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op) -{ - descriptor_data = allocate_descriptor_state(); - - ASIO_HANDLER_REACTOR_REGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - { - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - descriptor_data->reactor_ = this; - descriptor_data->descriptor_ = descriptor; - descriptor_data->shutdown_ = false; - descriptor_data->op_queue_[op_type].push(op); - for (int i = 0; i < max_ops; ++i) - descriptor_data->try_speculative_[i] = true; - } - - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; - descriptor_data->registered_events_ = ev.events; - ev.data.ptr = descriptor_data; - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); - if (result != 0) - return errno; - - return 0; -} - -void epoll_reactor::move_descriptor(socket_type, - epoll_reactor::per_descriptor_data& target_descriptor_data, - epoll_reactor::per_descriptor_data& source_descriptor_data) -{ - target_descriptor_data = source_descriptor_data; - source_descriptor_data = 0; -} - -void epoll_reactor::start_op(int op_type, socket_type descriptor, - epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op, - bool is_continuation, bool allow_speculative) -{ - if (!descriptor_data) - { - op->ec_ = asio::error::bad_descriptor; - post_immediate_completion(op, is_continuation); - return; - } - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - if (descriptor_data->shutdown_) - { - post_immediate_completion(op, is_continuation); - return; - } - - if (descriptor_data->op_queue_[op_type].empty()) - { - if (allow_speculative - && (op_type != read_op - || descriptor_data->op_queue_[except_op].empty())) - { - if (descriptor_data->try_speculative_[op_type]) - { - if (reactor_op::status status = op->perform()) - { - if (status == reactor_op::done_and_exhausted) - if (descriptor_data->registered_events_ != 0) - descriptor_data->try_speculative_[op_type] = false; - descriptor_lock.unlock(); - scheduler_.post_immediate_completion(op, is_continuation); - return; - } - } - - if (descriptor_data->registered_events_ == 0) - { - op->ec_ = asio::error::operation_not_supported; - scheduler_.post_immediate_completion(op, is_continuation); - return; - } - - if (op_type == write_op) - { - if ((descriptor_data->registered_events_ & EPOLLOUT) == 0) - { - epoll_event ev = { 0, { 0 } }; - ev.events = descriptor_data->registered_events_ | EPOLLOUT; - ev.data.ptr = descriptor_data; - if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0) - { - descriptor_data->registered_events_ |= ev.events; - } - else - { - op->ec_ = asio::error_code(errno, - asio::error::get_system_category()); - scheduler_.post_immediate_completion(op, is_continuation); - return; - } - } - } - } - else if (descriptor_data->registered_events_ == 0) - { - op->ec_ = asio::error::operation_not_supported; - scheduler_.post_immediate_completion(op, is_continuation); - return; - } - else - { - if (op_type == write_op) - { - descriptor_data->registered_events_ |= EPOLLOUT; - } - - epoll_event ev = { 0, { 0 } }; - ev.events = descriptor_data->registered_events_; - ev.data.ptr = descriptor_data; - epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); - } - } - - descriptor_data->op_queue_[op_type].push(op); - scheduler_.work_started(); -} - -void epoll_reactor::cancel_ops(socket_type, - epoll_reactor::per_descriptor_data& descriptor_data) -{ - if (!descriptor_data) - return; - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - op_queue ops; - for (int i = 0; i < max_ops; ++i) - { - while (reactor_op* op = descriptor_data->op_queue_[i].front()) - { - op->ec_ = asio::error::operation_aborted; - descriptor_data->op_queue_[i].pop(); - ops.push(op); - } - } - - descriptor_lock.unlock(); - - scheduler_.post_deferred_completions(ops); -} - -void epoll_reactor::deregister_descriptor(socket_type descriptor, - epoll_reactor::per_descriptor_data& descriptor_data, bool closing) -{ - if (!descriptor_data) - return; - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - if (!descriptor_data->shutdown_) - { - if (closing) - { - // The descriptor will be automatically removed from the epoll set when - // it is closed. - } - else if (descriptor_data->registered_events_ != 0) - { - epoll_event ev = { 0, { 0 } }; - epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); - } - - op_queue ops; - for (int i = 0; i < max_ops; ++i) - { - while (reactor_op* op = descriptor_data->op_queue_[i].front()) - { - op->ec_ = asio::error::operation_aborted; - descriptor_data->op_queue_[i].pop(); - ops.push(op); - } - } - - descriptor_data->descriptor_ = -1; - descriptor_data->shutdown_ = true; - - descriptor_lock.unlock(); - - ASIO_HANDLER_REACTOR_DEREGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - scheduler_.post_deferred_completions(ops); - - // Leave descriptor_data set so that it will be freed by the subsequent - // call to cleanup_descriptor_data. - } - else - { - // We are shutting down, so prevent cleanup_descriptor_data from freeing - // the descriptor_data object and let the destructor free it instead. - descriptor_data = 0; - } -} - -void epoll_reactor::deregister_internal_descriptor(socket_type descriptor, - epoll_reactor::per_descriptor_data& descriptor_data) -{ - if (!descriptor_data) - return; - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - if (!descriptor_data->shutdown_) - { - epoll_event ev = { 0, { 0 } }; - epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); - - op_queue ops; - for (int i = 0; i < max_ops; ++i) - ops.push(descriptor_data->op_queue_[i]); - - descriptor_data->descriptor_ = -1; - descriptor_data->shutdown_ = true; - - descriptor_lock.unlock(); - - ASIO_HANDLER_REACTOR_DEREGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - // Leave descriptor_data set so that it will be freed by the subsequent - // call to cleanup_descriptor_data. - } - else - { - // We are shutting down, so prevent cleanup_descriptor_data from freeing - // the descriptor_data object and let the destructor free it instead. - descriptor_data = 0; - } -} - -void epoll_reactor::cleanup_descriptor_data( - per_descriptor_data& descriptor_data) -{ - if (descriptor_data) - { - free_descriptor_state(descriptor_data); - descriptor_data = 0; - } -} - -void epoll_reactor::run(long usec, op_queue& ops) -{ - // This code relies on the fact that the scheduler queues the reactor task - // behind all descriptor operations generated by this function. This means, - // that by the time we reach this point, any previously returned descriptor - // operations have already been dequeued. Therefore it is now safe for us to - // reuse and return them for the scheduler to queue again. - - // Calculate timeout. Check the timer queues only if timerfd is not in use. - int timeout; - if (usec == 0) - timeout = 0; - else - { - timeout = (usec < 0) ? -1 : ((usec - 1) / 1000 + 1); - if (timer_fd_ == -1) - { - mutex::scoped_lock lock(mutex_); - timeout = get_timeout(timeout); - } - } - - // Block on the epoll descriptor. - epoll_event events[128]; - int num_events = epoll_wait(epoll_fd_, events, 128, timeout); - -#if defined(ASIO_ENABLE_HANDLER_TRACKING) - // Trace the waiting events. - for (int i = 0; i < num_events; ++i) - { - void* ptr = events[i].data.ptr; - if (ptr == &interrupter_) - { - // Ignore. - } -# if defined(ASIO_HAS_TIMERFD) - else if (ptr == &timer_fd_) - { - // Ignore. - } -# endif // defined(ASIO_HAS_TIMERFD) - else - { - unsigned event_mask = 0; - if ((events[i].events & EPOLLIN) != 0) - event_mask |= ASIO_HANDLER_REACTOR_READ_EVENT; - if ((events[i].events & EPOLLOUT)) - event_mask |= ASIO_HANDLER_REACTOR_WRITE_EVENT; - if ((events[i].events & (EPOLLERR | EPOLLHUP)) != 0) - event_mask |= ASIO_HANDLER_REACTOR_ERROR_EVENT; - ASIO_HANDLER_REACTOR_EVENTS((context(), - reinterpret_cast(ptr), event_mask)); - } - } -#endif // defined(ASIO_ENABLE_HANDLER_TRACKING) - -#if defined(ASIO_HAS_TIMERFD) - bool check_timers = (timer_fd_ == -1); -#else // defined(ASIO_HAS_TIMERFD) - bool check_timers = true; -#endif // defined(ASIO_HAS_TIMERFD) - - // Dispatch the waiting events. - for (int i = 0; i < num_events; ++i) - { - void* ptr = events[i].data.ptr; - if (ptr == &interrupter_) - { - // No need to reset the interrupter since we're leaving the descriptor - // in a ready-to-read state and relying on edge-triggered notifications - // to make it so that we only get woken up when the descriptor's epoll - // registration is updated. - -#if defined(ASIO_HAS_TIMERFD) - if (timer_fd_ == -1) - check_timers = true; -#else // defined(ASIO_HAS_TIMERFD) - check_timers = true; -#endif // defined(ASIO_HAS_TIMERFD) - } -#if defined(ASIO_HAS_TIMERFD) - else if (ptr == &timer_fd_) - { - check_timers = true; - } -#endif // defined(ASIO_HAS_TIMERFD) - else - { - // The descriptor operation doesn't count as work in and of itself, so we - // don't call work_started() here. This still allows the scheduler to - // stop if the only remaining operations are descriptor operations. - descriptor_state* descriptor_data = static_cast(ptr); - if (!ops.is_enqueued(descriptor_data)) - { - descriptor_data->set_ready_events(events[i].events); - ops.push(descriptor_data); - } - else - { - descriptor_data->add_ready_events(events[i].events); - } - } - } - - if (check_timers) - { - mutex::scoped_lock common_lock(mutex_); - timer_queues_.get_ready_timers(ops); - -#if defined(ASIO_HAS_TIMERFD) - if (timer_fd_ != -1) - { - itimerspec new_timeout; - itimerspec old_timeout; - int flags = get_timeout(new_timeout); - timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); - } -#endif // defined(ASIO_HAS_TIMERFD) - } -} - -void epoll_reactor::interrupt() -{ - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLIN | EPOLLERR | EPOLLET; - ev.data.ptr = &interrupter_; - epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev); -} - -int epoll_reactor::do_epoll_create() -{ -#if defined(EPOLL_CLOEXEC) - int fd = epoll_create1(EPOLL_CLOEXEC); -#else // defined(EPOLL_CLOEXEC) - int fd = -1; - errno = EINVAL; -#endif // defined(EPOLL_CLOEXEC) - - if (fd == -1 && (errno == EINVAL || errno == ENOSYS)) - { - fd = epoll_create(epoll_size); - if (fd != -1) - ::fcntl(fd, F_SETFD, FD_CLOEXEC); - } - - if (fd == -1) - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "epoll"); - } - - return fd; -} - -int epoll_reactor::do_timerfd_create() -{ -#if defined(ASIO_HAS_TIMERFD) -# if defined(TFD_CLOEXEC) - int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); -# else // defined(TFD_CLOEXEC) - int fd = -1; - errno = EINVAL; -# endif // defined(TFD_CLOEXEC) - - if (fd == -1 && errno == EINVAL) - { - fd = timerfd_create(CLOCK_MONOTONIC, 0); - if (fd != -1) - ::fcntl(fd, F_SETFD, FD_CLOEXEC); - } - - return fd; -#else // defined(ASIO_HAS_TIMERFD) - return -1; -#endif // defined(ASIO_HAS_TIMERFD) -} - -epoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state() -{ - mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); - return registered_descriptors_.alloc(ASIO_CONCURRENCY_HINT_IS_LOCKING( - REACTOR_IO, scheduler_.concurrency_hint())); -} - -void epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s) -{ - mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); - registered_descriptors_.free(s); -} - -void epoll_reactor::do_add_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.insert(&queue); -} - -void epoll_reactor::do_remove_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.erase(&queue); -} - -void epoll_reactor::update_timeout() -{ -#if defined(ASIO_HAS_TIMERFD) - if (timer_fd_ != -1) - { - itimerspec new_timeout; - itimerspec old_timeout; - int flags = get_timeout(new_timeout); - timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); - return; - } -#endif // defined(ASIO_HAS_TIMERFD) - interrupt(); -} - -int epoll_reactor::get_timeout(int msec) -{ - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - const int max_msec = 5 * 60 * 1000; - return timer_queues_.wait_duration_msec( - (msec < 0 || max_msec < msec) ? max_msec : msec); -} - -#if defined(ASIO_HAS_TIMERFD) -int epoll_reactor::get_timeout(itimerspec& ts) -{ - ts.it_interval.tv_sec = 0; - ts.it_interval.tv_nsec = 0; - - long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000); - ts.it_value.tv_sec = usec / 1000000; - ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1; - - return usec ? 0 : TFD_TIMER_ABSTIME; -} -#endif // defined(ASIO_HAS_TIMERFD) - -struct epoll_reactor::perform_io_cleanup_on_block_exit -{ - explicit perform_io_cleanup_on_block_exit(epoll_reactor* r) - : reactor_(r), first_op_(0) - { - } - - ~perform_io_cleanup_on_block_exit() - { - if (first_op_) - { - // Post the remaining completed operations for invocation. - if (!ops_.empty()) - reactor_->scheduler_.post_deferred_completions(ops_); - - // A user-initiated operation has completed, but there's no need to - // explicitly call work_finished() here. Instead, we'll take advantage of - // the fact that the scheduler will call work_finished() once we return. - } - else - { - // No user-initiated operations have completed, so we need to compensate - // for the work_finished() call that the scheduler will make once this - // operation returns. - reactor_->scheduler_.compensating_work_started(); - } - } - - epoll_reactor* reactor_; - op_queue ops_; - operation* first_op_; -}; - -epoll_reactor::descriptor_state::descriptor_state(bool locking) - : operation(&epoll_reactor::descriptor_state::do_complete), - mutex_(locking) -{ -} - -operation* epoll_reactor::descriptor_state::perform_io(uint32_t events) -{ - mutex_.lock(); - perform_io_cleanup_on_block_exit io_cleanup(reactor_); - mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock); - - // Exception operations must be processed first to ensure that any - // out-of-band data is read before normal data. - static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI }; - for (int j = max_ops - 1; j >= 0; --j) - { - if (events & (flag[j] | EPOLLERR | EPOLLHUP)) - { - try_speculative_[j] = true; - while (reactor_op* op = op_queue_[j].front()) - { - if (reactor_op::status status = op->perform()) - { - op_queue_[j].pop(); - io_cleanup.ops_.push(op); - if (status == reactor_op::done_and_exhausted) - { - try_speculative_[j] = false; - break; - } - } - else - break; - } - } - } - - // The first operation will be returned for completion now. The others will - // be posted for later by the io_cleanup object's destructor. - io_cleanup.first_op_ = io_cleanup.ops_.front(); - io_cleanup.ops_.pop(); - return io_cleanup.first_op_; -} - -void epoll_reactor::descriptor_state::do_complete( - void* owner, operation* base, - const asio::error_code& ec, std::size_t bytes_transferred) -{ - if (owner) - { - descriptor_state* descriptor_data = static_cast(base); - uint32_t events = static_cast(bytes_transferred); - if (operation* op = descriptor_data->perform_io(events)) - { - op->complete(owner, ec, 0); - } - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_EPOLL) - -#endif // ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP diff --git a/scout_sdk/asio/asio/detail/impl/eventfd_select_interrupter.ipp b/scout_sdk/asio/asio/detail/impl/eventfd_select_interrupter.ipp deleted file mode 100644 index c56e89a..0000000 --- a/scout_sdk/asio/asio/detail/impl/eventfd_select_interrupter.ipp +++ /dev/null @@ -1,165 +0,0 @@ -// -// detail/impl/eventfd_select_interrupter.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Roelof Naude (roelof.naude at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_EVENTFD_SELECT_INTERRUPTER_IPP -#define ASIO_DETAIL_IMPL_EVENTFD_SELECT_INTERRUPTER_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_EVENTFD) - -#include -#include -#include -#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 -# include -#else // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 -# include -#endif // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 -#include "asio/detail/cstdint.hpp" -#include "asio/detail/eventfd_select_interrupter.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -eventfd_select_interrupter::eventfd_select_interrupter() -{ - open_descriptors(); -} - -void eventfd_select_interrupter::open_descriptors() -{ -#if __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 - write_descriptor_ = read_descriptor_ = syscall(__NR_eventfd, 0); - if (read_descriptor_ != -1) - { - ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); - ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); - } -#else // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 -# if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) - write_descriptor_ = read_descriptor_ = - ::eventfd(0, EFD_CLOEXEC | EFD_NONBLOCK); -# else // defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) - errno = EINVAL; - write_descriptor_ = read_descriptor_ = -1; -# endif // defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK) - if (read_descriptor_ == -1 && errno == EINVAL) - { - write_descriptor_ = read_descriptor_ = ::eventfd(0, 0); - if (read_descriptor_ != -1) - { - ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); - ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); - } - } -#endif // __GLIBC__ == 2 && __GLIBC_MINOR__ < 8 - - if (read_descriptor_ == -1) - { - int pipe_fds[2]; - if (pipe(pipe_fds) == 0) - { - read_descriptor_ = pipe_fds[0]; - ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); - ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); - write_descriptor_ = pipe_fds[1]; - ::fcntl(write_descriptor_, F_SETFL, O_NONBLOCK); - ::fcntl(write_descriptor_, F_SETFD, FD_CLOEXEC); - } - else - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "eventfd_select_interrupter"); - } - } -} - -eventfd_select_interrupter::~eventfd_select_interrupter() -{ - close_descriptors(); -} - -void eventfd_select_interrupter::close_descriptors() -{ - if (write_descriptor_ != -1 && write_descriptor_ != read_descriptor_) - ::close(write_descriptor_); - if (read_descriptor_ != -1) - ::close(read_descriptor_); -} - -void eventfd_select_interrupter::recreate() -{ - close_descriptors(); - - write_descriptor_ = -1; - read_descriptor_ = -1; - - open_descriptors(); -} - -void eventfd_select_interrupter::interrupt() -{ - uint64_t counter(1UL); - int result = ::write(write_descriptor_, &counter, sizeof(uint64_t)); - (void)result; -} - -bool eventfd_select_interrupter::reset() -{ - if (write_descriptor_ == read_descriptor_) - { - for (;;) - { - // Only perform one read. The kernel maintains an atomic counter. - uint64_t counter(0); - errno = 0; - int bytes_read = ::read(read_descriptor_, &counter, sizeof(uint64_t)); - if (bytes_read < 0 && errno == EINTR) - continue; - bool was_interrupted = (bytes_read > 0); - return was_interrupted; - } - } - else - { - for (;;) - { - // Clear all data from the pipe. - char data[1024]; - int bytes_read = ::read(read_descriptor_, data, sizeof(data)); - if (bytes_read < 0 && errno == EINTR) - continue; - bool was_interrupted = (bytes_read > 0); - while (bytes_read == sizeof(data)) - bytes_read = ::read(read_descriptor_, data, sizeof(data)); - return was_interrupted; - } - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_EVENTFD) - -#endif // ASIO_DETAIL_IMPL_EVENTFD_SELECT_INTERRUPTER_IPP diff --git a/scout_sdk/asio/asio/detail/impl/handler_tracking.ipp b/scout_sdk/asio/asio/detail/impl/handler_tracking.ipp deleted file mode 100644 index 5a4ff6f..0000000 --- a/scout_sdk/asio/asio/detail/impl/handler_tracking.ipp +++ /dev/null @@ -1,358 +0,0 @@ -// -// detail/impl/handler_tracking.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_HANDLER_TRACKING_IPP -#define ASIO_DETAIL_IMPL_HANDLER_TRACKING_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_CUSTOM_HANDLER_TRACKING) - -// The handler tracking implementation is provided by the user-specified header. - -#elif defined(ASIO_ENABLE_HANDLER_TRACKING) - -#include -#include -#include "asio/detail/handler_tracking.hpp" - -#if defined(ASIO_HAS_BOOST_DATE_TIME) -# include "asio/time_traits.hpp" -#elif defined(ASIO_HAS_CHRONO) -# include "asio/detail/chrono.hpp" -# include "asio/detail/chrono_time_traits.hpp" -# include "asio/wait_traits.hpp" -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/socket_types.hpp" -#elif !defined(ASIO_WINDOWS) -# include -#endif // !defined(ASIO_WINDOWS) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct handler_tracking_timestamp -{ - uint64_t seconds; - uint64_t microseconds; - - handler_tracking_timestamp() - { -#if defined(ASIO_HAS_BOOST_DATE_TIME) - boost::posix_time::ptime epoch(boost::gregorian::date(1970, 1, 1)); - boost::posix_time::time_duration now = - boost::posix_time::microsec_clock::universal_time() - epoch; -#elif defined(ASIO_HAS_CHRONO) - typedef chrono_time_traits > traits_helper; - traits_helper::posix_time_duration now( - chrono::system_clock::now().time_since_epoch()); -#endif - seconds = static_cast(now.total_seconds()); - microseconds = static_cast(now.total_microseconds() % 1000000); - } -}; - -struct handler_tracking::tracking_state -{ - static_mutex mutex_; - uint64_t next_id_; - tss_ptr* current_completion_; -}; - -handler_tracking::tracking_state* handler_tracking::get_state() -{ - static tracking_state state = { ASIO_STATIC_MUTEX_INIT, 1, 0 }; - return &state; -} - -void handler_tracking::init() -{ - static tracking_state* state = get_state(); - - state->mutex_.init(); - - static_mutex::scoped_lock lock(state->mutex_); - if (state->current_completion_ == 0) - state->current_completion_ = new tss_ptr; -} - -void handler_tracking::creation(execution_context&, - handler_tracking::tracked_handler& h, - const char* object_type, void* object, - uintmax_t /*native_handle*/, const char* op_name) -{ - static tracking_state* state = get_state(); - - static_mutex::scoped_lock lock(state->mutex_); - h.id_ = state->next_id_++; - lock.unlock(); - - handler_tracking_timestamp timestamp; - - uint64_t current_id = 0; - if (completion* current_completion = *state->current_completion_) - current_id = current_completion->id_; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|%I64u*%I64u|%.20s@%p.%.50s\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|%llu*%llu|%.20s@%p.%.50s\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - current_id, h.id_, object_type, object, op_name); -} - -handler_tracking::completion::completion( - const handler_tracking::tracked_handler& h) - : id_(h.id_), - invoked_(false), - next_(*get_state()->current_completion_) -{ - *get_state()->current_completion_ = this; -} - -handler_tracking::completion::~completion() -{ - if (id_) - { - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|%c%I64u|\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|%c%llu|\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - invoked_ ? '!' : '~', id_); - } - - *get_state()->current_completion_ = next_; -} - -void handler_tracking::completion::invocation_begin() -{ - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|>%I64u|\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|>%llu|\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, id_); - - invoked_ = true; -} - -void handler_tracking::completion::invocation_begin( - const asio::error_code& ec) -{ - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|>%llu|ec=%.20s:%d\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - id_, ec.category().name(), ec.value()); - - invoked_ = true; -} - -void handler_tracking::completion::invocation_begin( - const asio::error_code& ec, std::size_t bytes_transferred) -{ - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d,bytes_transferred=%I64u\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|>%llu|ec=%.20s:%d,bytes_transferred=%llu\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - id_, ec.category().name(), ec.value(), - static_cast(bytes_transferred)); - - invoked_ = true; -} - -void handler_tracking::completion::invocation_begin( - const asio::error_code& ec, int signal_number) -{ - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d,signal_number=%d\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|>%llu|ec=%.20s:%d,signal_number=%d\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - id_, ec.category().name(), ec.value(), signal_number); - - invoked_ = true; -} - -void handler_tracking::completion::invocation_begin( - const asio::error_code& ec, const char* arg) -{ - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|>%I64u|ec=%.20s:%d,%.50s\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|>%llu|ec=%.20s:%d,%.50s\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - id_, ec.category().name(), ec.value(), arg); - - invoked_ = true; -} - -void handler_tracking::completion::invocation_end() -{ - if (id_) - { - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|<%I64u|\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|<%llu|\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, id_); - - id_ = 0; - } -} - -void handler_tracking::operation(execution_context&, - const char* object_type, void* object, - uintmax_t /*native_handle*/, const char* op_name) -{ - static tracking_state* state = get_state(); - - handler_tracking_timestamp timestamp; - - unsigned long long current_id = 0; - if (completion* current_completion = *state->current_completion_) - current_id = current_completion->id_; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|%I64u|%.20s@%p.%.50s\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|%llu|%.20s@%p.%.50s\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - current_id, object_type, object, op_name); -} - -void handler_tracking::reactor_registration(execution_context& /*context*/, - uintmax_t /*native_handle*/, uintmax_t /*registration*/) -{ -} - -void handler_tracking::reactor_deregistration(execution_context& /*context*/, - uintmax_t /*native_handle*/, uintmax_t /*registration*/) -{ -} - -void handler_tracking::reactor_events(execution_context& /*context*/, - uintmax_t /*native_handle*/, unsigned /*events*/) -{ -} - -void handler_tracking::reactor_operation( - const tracked_handler& h, const char* op_name, - const asio::error_code& ec) -{ - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|.%I64u|%s,ec=%.20s:%d\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|.%llu|%s,ec=%.20s:%d\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - h.id_, op_name, ec.category().name(), ec.value()); -} - -void handler_tracking::reactor_operation( - const tracked_handler& h, const char* op_name, - const asio::error_code& ec, std::size_t bytes_transferred) -{ - handler_tracking_timestamp timestamp; - - write_line( -#if defined(ASIO_WINDOWS) - "@asio|%I64u.%06I64u|.%I64u|%s,ec=%.20s:%d,bytes_transferred=%I64u\n", -#else // defined(ASIO_WINDOWS) - "@asio|%llu.%06llu|.%llu|%s,ec=%.20s:%d,bytes_transferred=%llu\n", -#endif // defined(ASIO_WINDOWS) - timestamp.seconds, timestamp.microseconds, - h.id_, op_name, ec.category().name(), ec.value(), - static_cast(bytes_transferred)); -} - -void handler_tracking::write_line(const char* format, ...) -{ - using namespace std; // For sprintf (or equivalent). - - va_list args; - va_start(args, format); - - char line[256] = ""; -#if defined(ASIO_HAS_SECURE_RTL) - int length = vsprintf_s(line, sizeof(line), format, args); -#else // defined(ASIO_HAS_SECURE_RTL) - int length = vsprintf(line, format, args); -#endif // defined(ASIO_HAS_SECURE_RTL) - - va_end(args); - -#if defined(ASIO_WINDOWS_RUNTIME) - wchar_t wline[256] = L""; - mbstowcs_s(0, wline, sizeof(wline) / sizeof(wchar_t), line, length); - ::OutputDebugStringW(wline); -#elif defined(ASIO_WINDOWS) - HANDLE stderr_handle = ::GetStdHandle(STD_ERROR_HANDLE); - DWORD bytes_written = 0; - ::WriteFile(stderr_handle, line, length, &bytes_written, 0); -#else // defined(ASIO_WINDOWS) - ::write(STDERR_FILENO, line, length); -#endif // defined(ASIO_WINDOWS) -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_HANDLER_TRACKING) - -#endif // ASIO_DETAIL_IMPL_HANDLER_TRACKING_IPP diff --git a/scout_sdk/asio/asio/detail/impl/kqueue_reactor.hpp b/scout_sdk/asio/asio/detail/impl/kqueue_reactor.hpp deleted file mode 100644 index 136d167..0000000 --- a/scout_sdk/asio/asio/detail/impl/kqueue_reactor.hpp +++ /dev/null @@ -1,93 +0,0 @@ -// -// detail/impl/kqueue_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_KQUEUE_REACTOR_HPP -#define ASIO_DETAIL_IMPL_KQUEUE_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_KQUEUE) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -void kqueue_reactor::add_timer_queue(timer_queue& queue) -{ - do_add_timer_queue(queue); -} - -// Remove a timer queue from the reactor. -template -void kqueue_reactor::remove_timer_queue(timer_queue& queue) -{ - do_remove_timer_queue(queue); -} - -template -void kqueue_reactor::schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op) -{ - mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - scheduler_.post_immediate_completion(op, false); - return; - } - - bool earliest = queue.enqueue_timer(time, timer, op); - scheduler_.work_started(); - if (earliest) - interrupt(); -} - -template -std::size_t kqueue_reactor::cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled) -{ - mutex::scoped_lock lock(mutex_); - op_queue ops; - std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); - lock.unlock(); - scheduler_.post_deferred_completions(ops); - return n; -} - -template -void kqueue_reactor::move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source) -{ - mutex::scoped_lock lock(mutex_); - op_queue ops; - queue.cancel_timer(target, ops); - queue.move_timer(target, source); - lock.unlock(); - scheduler_.post_deferred_completions(ops); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_KQUEUE) - -#endif // ASIO_DETAIL_IMPL_KQUEUE_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/impl/kqueue_reactor.ipp b/scout_sdk/asio/asio/detail/impl/kqueue_reactor.ipp deleted file mode 100644 index 73986e0..0000000 --- a/scout_sdk/asio/asio/detail/impl/kqueue_reactor.ipp +++ /dev/null @@ -1,566 +0,0 @@ -// -// detail/impl/kqueue_reactor.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_KQUEUE_REACTOR_IPP -#define ASIO_DETAIL_IMPL_KQUEUE_REACTOR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_KQUEUE) - -#include "asio/detail/kqueue_reactor.hpp" -#include "asio/detail/scheduler.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -#if defined(__NetBSD__) -# define ASIO_KQUEUE_EV_SET(ev, ident, filt, flags, fflags, data, udata) \ - EV_SET(ev, ident, filt, flags, fflags, data, \ - reinterpret_cast(static_cast(udata))) -#else -# define ASIO_KQUEUE_EV_SET(ev, ident, filt, flags, fflags, data, udata) \ - EV_SET(ev, ident, filt, flags, fflags, data, udata) -#endif - -namespace asio { -namespace detail { - -kqueue_reactor::kqueue_reactor(asio::execution_context& ctx) - : execution_context_service_base(ctx), - scheduler_(use_service(ctx)), - mutex_(ASIO_CONCURRENCY_HINT_IS_LOCKING( - REACTOR_REGISTRATION, scheduler_.concurrency_hint())), - kqueue_fd_(do_kqueue_create()), - interrupter_(), - shutdown_(false), - registered_descriptors_mutex_(mutex_.enabled()) -{ - struct kevent events[1]; - ASIO_KQUEUE_EV_SET(&events[0], interrupter_.read_descriptor(), - EVFILT_READ, EV_ADD, 0, 0, &interrupter_); - if (::kevent(kqueue_fd_, events, 1, 0, 0, 0) == -1) - { - asio::error_code error(errno, - asio::error::get_system_category()); - asio::detail::throw_error(error); - } -} - -kqueue_reactor::~kqueue_reactor() -{ - close(kqueue_fd_); -} - -void kqueue_reactor::shutdown() -{ - mutex::scoped_lock lock(mutex_); - shutdown_ = true; - lock.unlock(); - - op_queue ops; - - while (descriptor_state* state = registered_descriptors_.first()) - { - for (int i = 0; i < max_ops; ++i) - ops.push(state->op_queue_[i]); - state->shutdown_ = true; - registered_descriptors_.free(state); - } - - timer_queues_.get_all_timers(ops); - - scheduler_.abandon_operations(ops); -} - -void kqueue_reactor::notify_fork( - asio::execution_context::fork_event fork_ev) -{ - if (fork_ev == asio::execution_context::fork_child) - { - // The kqueue descriptor is automatically closed in the child. - kqueue_fd_ = -1; - kqueue_fd_ = do_kqueue_create(); - - interrupter_.recreate(); - - struct kevent events[2]; - ASIO_KQUEUE_EV_SET(&events[0], interrupter_.read_descriptor(), - EVFILT_READ, EV_ADD, 0, 0, &interrupter_); - if (::kevent(kqueue_fd_, events, 1, 0, 0, 0) == -1) - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "kqueue interrupter registration"); - } - - // Re-register all descriptors with kqueue. - mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); - for (descriptor_state* state = registered_descriptors_.first(); - state != 0; state = state->next_) - { - if (state->num_kevents_ > 0) - { - ASIO_KQUEUE_EV_SET(&events[0], state->descriptor_, - EVFILT_READ, EV_ADD | EV_CLEAR, 0, 0, state); - ASIO_KQUEUE_EV_SET(&events[1], state->descriptor_, - EVFILT_WRITE, EV_ADD | EV_CLEAR, 0, 0, state); - if (::kevent(kqueue_fd_, events, state->num_kevents_, 0, 0, 0) == -1) - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "kqueue re-registration"); - } - } - } - } -} - -void kqueue_reactor::init_task() -{ - scheduler_.init_task(); -} - -int kqueue_reactor::register_descriptor(socket_type descriptor, - kqueue_reactor::per_descriptor_data& descriptor_data) -{ - descriptor_data = allocate_descriptor_state(); - - ASIO_HANDLER_REACTOR_REGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - mutex::scoped_lock lock(descriptor_data->mutex_); - - descriptor_data->descriptor_ = descriptor; - descriptor_data->num_kevents_ = 0; - descriptor_data->shutdown_ = false; - - return 0; -} - -int kqueue_reactor::register_internal_descriptor( - int op_type, socket_type descriptor, - kqueue_reactor::per_descriptor_data& descriptor_data, reactor_op* op) -{ - descriptor_data = allocate_descriptor_state(); - - ASIO_HANDLER_REACTOR_REGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - mutex::scoped_lock lock(descriptor_data->mutex_); - - descriptor_data->descriptor_ = descriptor; - descriptor_data->num_kevents_ = 1; - descriptor_data->shutdown_ = false; - descriptor_data->op_queue_[op_type].push(op); - - struct kevent events[1]; - ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, - EV_ADD | EV_CLEAR, 0, 0, descriptor_data); - if (::kevent(kqueue_fd_, events, 1, 0, 0, 0) == -1) - return errno; - - return 0; -} - -void kqueue_reactor::move_descriptor(socket_type, - kqueue_reactor::per_descriptor_data& target_descriptor_data, - kqueue_reactor::per_descriptor_data& source_descriptor_data) -{ - target_descriptor_data = source_descriptor_data; - source_descriptor_data = 0; -} - -void kqueue_reactor::start_op(int op_type, socket_type descriptor, - kqueue_reactor::per_descriptor_data& descriptor_data, reactor_op* op, - bool is_continuation, bool allow_speculative) -{ - if (!descriptor_data) - { - op->ec_ = asio::error::bad_descriptor; - post_immediate_completion(op, is_continuation); - return; - } - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - if (descriptor_data->shutdown_) - { - post_immediate_completion(op, is_continuation); - return; - } - - if (descriptor_data->op_queue_[op_type].empty()) - { - static const int num_kevents[max_ops] = { 1, 2, 1 }; - - if (allow_speculative - && (op_type != read_op - || descriptor_data->op_queue_[except_op].empty())) - { - if (op->perform()) - { - descriptor_lock.unlock(); - scheduler_.post_immediate_completion(op, is_continuation); - return; - } - - if (descriptor_data->num_kevents_ < num_kevents[op_type]) - { - struct kevent events[2]; - ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, - EV_ADD | EV_CLEAR, 0, 0, descriptor_data); - ASIO_KQUEUE_EV_SET(&events[1], descriptor, EVFILT_WRITE, - EV_ADD | EV_CLEAR, 0, 0, descriptor_data); - if (::kevent(kqueue_fd_, events, num_kevents[op_type], 0, 0, 0) != -1) - { - descriptor_data->num_kevents_ = num_kevents[op_type]; - } - else - { - op->ec_ = asio::error_code(errno, - asio::error::get_system_category()); - scheduler_.post_immediate_completion(op, is_continuation); - return; - } - } - } - else - { - if (descriptor_data->num_kevents_ < num_kevents[op_type]) - descriptor_data->num_kevents_ = num_kevents[op_type]; - - struct kevent events[2]; - ASIO_KQUEUE_EV_SET(&events[0], descriptor, EVFILT_READ, - EV_ADD | EV_CLEAR, 0, 0, descriptor_data); - ASIO_KQUEUE_EV_SET(&events[1], descriptor, EVFILT_WRITE, - EV_ADD | EV_CLEAR, 0, 0, descriptor_data); - ::kevent(kqueue_fd_, events, descriptor_data->num_kevents_, 0, 0, 0); - } - } - - descriptor_data->op_queue_[op_type].push(op); - scheduler_.work_started(); -} - -void kqueue_reactor::cancel_ops(socket_type, - kqueue_reactor::per_descriptor_data& descriptor_data) -{ - if (!descriptor_data) - return; - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - op_queue ops; - for (int i = 0; i < max_ops; ++i) - { - while (reactor_op* op = descriptor_data->op_queue_[i].front()) - { - op->ec_ = asio::error::operation_aborted; - descriptor_data->op_queue_[i].pop(); - ops.push(op); - } - } - - descriptor_lock.unlock(); - - scheduler_.post_deferred_completions(ops); -} - -void kqueue_reactor::deregister_descriptor(socket_type descriptor, - kqueue_reactor::per_descriptor_data& descriptor_data, bool closing) -{ - if (!descriptor_data) - return; - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - if (!descriptor_data->shutdown_) - { - if (closing) - { - // The descriptor will be automatically removed from the kqueue when it - // is closed. - } - else - { - struct kevent events[2]; - ASIO_KQUEUE_EV_SET(&events[0], descriptor, - EVFILT_READ, EV_DELETE, 0, 0, 0); - ASIO_KQUEUE_EV_SET(&events[1], descriptor, - EVFILT_WRITE, EV_DELETE, 0, 0, 0); - ::kevent(kqueue_fd_, events, descriptor_data->num_kevents_, 0, 0, 0); - } - - op_queue ops; - for (int i = 0; i < max_ops; ++i) - { - while (reactor_op* op = descriptor_data->op_queue_[i].front()) - { - op->ec_ = asio::error::operation_aborted; - descriptor_data->op_queue_[i].pop(); - ops.push(op); - } - } - - descriptor_data->descriptor_ = -1; - descriptor_data->shutdown_ = true; - - descriptor_lock.unlock(); - - ASIO_HANDLER_REACTOR_DEREGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - scheduler_.post_deferred_completions(ops); - - // Leave descriptor_data set so that it will be freed by the subsequent - // call to cleanup_descriptor_data. - } - else - { - // We are shutting down, so prevent cleanup_descriptor_data from freeing - // the descriptor_data object and let the destructor free it instead. - descriptor_data = 0; - } -} - -void kqueue_reactor::deregister_internal_descriptor(socket_type descriptor, - kqueue_reactor::per_descriptor_data& descriptor_data) -{ - if (!descriptor_data) - return; - - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - if (!descriptor_data->shutdown_) - { - struct kevent events[2]; - ASIO_KQUEUE_EV_SET(&events[0], descriptor, - EVFILT_READ, EV_DELETE, 0, 0, 0); - ASIO_KQUEUE_EV_SET(&events[1], descriptor, - EVFILT_WRITE, EV_DELETE, 0, 0, 0); - ::kevent(kqueue_fd_, events, descriptor_data->num_kevents_, 0, 0, 0); - - op_queue ops; - for (int i = 0; i < max_ops; ++i) - ops.push(descriptor_data->op_queue_[i]); - - descriptor_data->descriptor_ = -1; - descriptor_data->shutdown_ = true; - - descriptor_lock.unlock(); - - ASIO_HANDLER_REACTOR_DEREGISTRATION(( - context(), static_cast(descriptor), - reinterpret_cast(descriptor_data))); - - // Leave descriptor_data set so that it will be freed by the subsequent - // call to cleanup_descriptor_data. - } - else - { - // We are shutting down, so prevent cleanup_descriptor_data from freeing - // the descriptor_data object and let the destructor free it instead. - descriptor_data = 0; - } -} - -void kqueue_reactor::cleanup_descriptor_data( - per_descriptor_data& descriptor_data) -{ - if (descriptor_data) - { - free_descriptor_state(descriptor_data); - descriptor_data = 0; - } -} - -void kqueue_reactor::run(long usec, op_queue& ops) -{ - mutex::scoped_lock lock(mutex_); - - // Determine how long to block while waiting for events. - timespec timeout_buf = { 0, 0 }; - timespec* timeout = usec ? get_timeout(usec, timeout_buf) : &timeout_buf; - - lock.unlock(); - - // Block on the kqueue descriptor. - struct kevent events[128]; - int num_events = kevent(kqueue_fd_, 0, 0, events, 128, timeout); - -#if defined(ASIO_ENABLE_HANDLER_TRACKING) - // Trace the waiting events. - for (int i = 0; i < num_events; ++i) - { - void* ptr = reinterpret_cast(events[i].udata); - if (ptr != &interrupter_) - { - unsigned event_mask = 0; - switch (events[i].filter) - { - case EVFILT_READ: - event_mask |= ASIO_HANDLER_REACTOR_READ_EVENT; - break; - case EVFILT_WRITE: - event_mask |= ASIO_HANDLER_REACTOR_WRITE_EVENT; - break; - } - if ((events[i].flags & (EV_ERROR | EV_OOBAND)) != 0) - event_mask |= ASIO_HANDLER_REACTOR_ERROR_EVENT; - ASIO_HANDLER_REACTOR_EVENTS((context(), - reinterpret_cast(ptr), event_mask)); - } - } -#endif // defined(ASIO_ENABLE_HANDLER_TRACKING) - - // Dispatch the waiting events. - for (int i = 0; i < num_events; ++i) - { - void* ptr = reinterpret_cast(events[i].udata); - if (ptr == &interrupter_) - { - interrupter_.reset(); - } - else - { - descriptor_state* descriptor_data = static_cast(ptr); - mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); - - if (events[i].filter == EVFILT_WRITE - && descriptor_data->num_kevents_ == 2 - && descriptor_data->op_queue_[write_op].empty()) - { - // Some descriptor types, like serial ports, don't seem to support - // EV_CLEAR with EVFILT_WRITE. Since we have no pending write - // operations we'll remove the EVFILT_WRITE registration here so that - // we don't end up in a tight spin. - struct kevent delete_events[1]; - ASIO_KQUEUE_EV_SET(&delete_events[0], - descriptor_data->descriptor_, EVFILT_WRITE, EV_DELETE, 0, 0, 0); - ::kevent(kqueue_fd_, delete_events, 1, 0, 0, 0); - descriptor_data->num_kevents_ = 1; - } - - // Exception operations must be processed first to ensure that any - // out-of-band data is read before normal data. -#if defined(__NetBSD__) - static const unsigned int filter[max_ops] = -#else - static const int filter[max_ops] = -#endif - { EVFILT_READ, EVFILT_WRITE, EVFILT_READ }; - for (int j = max_ops - 1; j >= 0; --j) - { - if (events[i].filter == filter[j]) - { - if (j != except_op || events[i].flags & EV_OOBAND) - { - while (reactor_op* op = descriptor_data->op_queue_[j].front()) - { - if (events[i].flags & EV_ERROR) - { - op->ec_ = asio::error_code( - static_cast(events[i].data), - asio::error::get_system_category()); - descriptor_data->op_queue_[j].pop(); - ops.push(op); - } - if (op->perform()) - { - descriptor_data->op_queue_[j].pop(); - ops.push(op); - } - else - break; - } - } - } - } - } - } - - lock.lock(); - timer_queues_.get_ready_timers(ops); -} - -void kqueue_reactor::interrupt() -{ - interrupter_.interrupt(); -} - -int kqueue_reactor::do_kqueue_create() -{ - int fd = ::kqueue(); - if (fd == -1) - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "kqueue"); - } - return fd; -} - -kqueue_reactor::descriptor_state* kqueue_reactor::allocate_descriptor_state() -{ - mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); - return registered_descriptors_.alloc(ASIO_CONCURRENCY_HINT_IS_LOCKING( - REACTOR_IO, scheduler_.concurrency_hint())); -} - -void kqueue_reactor::free_descriptor_state(kqueue_reactor::descriptor_state* s) -{ - mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); - registered_descriptors_.free(s); -} - -void kqueue_reactor::do_add_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.insert(&queue); -} - -void kqueue_reactor::do_remove_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.erase(&queue); -} - -timespec* kqueue_reactor::get_timeout(long usec, timespec& ts) -{ - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - const long max_usec = 5 * 60 * 1000 * 1000; - usec = timer_queues_.wait_duration_usec( - (usec < 0 || max_usec < usec) ? max_usec : usec); - ts.tv_sec = usec / 1000000; - ts.tv_nsec = (usec % 1000000) * 1000; - return &ts; -} - -} // namespace detail -} // namespace asio - -#undef ASIO_KQUEUE_EV_SET - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_KQUEUE) - -#endif // ASIO_DETAIL_IMPL_KQUEUE_REACTOR_IPP diff --git a/scout_sdk/asio/asio/detail/impl/null_event.ipp b/scout_sdk/asio/asio/detail/impl/null_event.ipp deleted file mode 100644 index 22ade40..0000000 --- a/scout_sdk/asio/asio/detail/impl/null_event.ipp +++ /dev/null @@ -1,74 +0,0 @@ -// -// detail/impl/null_event.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_NULL_EVENT_IPP -#define ASIO_DETAIL_IMPL_NULL_EVENT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# include "asio/detail/socket_types.hpp" -#else -# include -# if defined(__hpux) -# include -# endif -# if !defined(__hpux) || defined(__SELECT) -# include -# endif -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -void null_event::do_wait() -{ -#if defined(ASIO_WINDOWS_RUNTIME) - std::this_thread::sleep_until((std::chrono::steady_clock::time_point::max)()); -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ::Sleep(INFINITE); -#else - ::pause(); -#endif -} - -void null_event::do_wait_for_usec(long usec) -{ -#if defined(ASIO_WINDOWS_RUNTIME) - std::this_thread::sleep_for(std::chrono::microseconds(usec)); -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ::Sleep(usec / 1000); -#elif defined(__hpux) && defined(__SELECT) - timespec ts; - ts.tv_sec = usec / 1000000; - ts.tv_nsec = (usec % 1000000) * 1000; - ::pselect(0, 0, 0, 0, &ts, 0); -#else - timeval tv; - tv.tv_sec = usec / 1000000; - tv.tv_usec = usec % 1000000; - ::select(0, 0, 0, 0, &tv); -#endif -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_NULL_EVENT_IPP diff --git a/scout_sdk/asio/asio/detail/impl/pipe_select_interrupter.ipp b/scout_sdk/asio/asio/detail/impl/pipe_select_interrupter.ipp deleted file mode 100644 index 13931ab..0000000 --- a/scout_sdk/asio/asio/detail/impl/pipe_select_interrupter.ipp +++ /dev/null @@ -1,124 +0,0 @@ -// -// detail/impl/pipe_select_interrupter.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP -#define ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS_RUNTIME) -#if !defined(ASIO_WINDOWS) -#if !defined(__CYGWIN__) -#if !defined(__SYMBIAN32__) -#if !defined(ASIO_HAS_EVENTFD) - -#include -#include -#include -#include -#include "asio/detail/pipe_select_interrupter.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -pipe_select_interrupter::pipe_select_interrupter() -{ - open_descriptors(); -} - -void pipe_select_interrupter::open_descriptors() -{ - int pipe_fds[2]; - if (pipe(pipe_fds) == 0) - { - read_descriptor_ = pipe_fds[0]; - ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); - write_descriptor_ = pipe_fds[1]; - ::fcntl(write_descriptor_, F_SETFL, O_NONBLOCK); - -#if defined(FD_CLOEXEC) - ::fcntl(read_descriptor_, F_SETFD, FD_CLOEXEC); - ::fcntl(write_descriptor_, F_SETFD, FD_CLOEXEC); -#endif // defined(FD_CLOEXEC) - } - else - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "pipe_select_interrupter"); - } -} - -pipe_select_interrupter::~pipe_select_interrupter() -{ - close_descriptors(); -} - -void pipe_select_interrupter::close_descriptors() -{ - if (read_descriptor_ != -1) - ::close(read_descriptor_); - if (write_descriptor_ != -1) - ::close(write_descriptor_); -} - -void pipe_select_interrupter::recreate() -{ - close_descriptors(); - - write_descriptor_ = -1; - read_descriptor_ = -1; - - open_descriptors(); -} - -void pipe_select_interrupter::interrupt() -{ - char byte = 0; - signed_size_type result = ::write(write_descriptor_, &byte, 1); - (void)result; -} - -bool pipe_select_interrupter::reset() -{ - for (;;) - { - char data[1024]; - signed_size_type bytes_read = ::read(read_descriptor_, data, sizeof(data)); - if (bytes_read < 0 && errno == EINTR) - continue; - bool was_interrupted = (bytes_read > 0); - while (bytes_read == sizeof(data)) - bytes_read = ::read(read_descriptor_, data, sizeof(data)); - return was_interrupted; - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_EVENTFD) -#endif // !defined(__SYMBIAN32__) -#endif // !defined(__CYGWIN__) -#endif // !defined(ASIO_WINDOWS) -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_PIPE_SELECT_INTERRUPTER_IPP diff --git a/scout_sdk/asio/asio/detail/impl/posix_event.ipp b/scout_sdk/asio/asio/detail/impl/posix_event.ipp deleted file mode 100644 index 4b46ab0..0000000 --- a/scout_sdk/asio/asio/detail/impl/posix_event.ipp +++ /dev/null @@ -1,59 +0,0 @@ -// -// detail/impl/posix_event.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_POSIX_EVENT_IPP -#define ASIO_DETAIL_IMPL_POSIX_EVENT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include "asio/detail/posix_event.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -posix_event::posix_event() - : state_(0) -{ -#if (defined(__MACH__) && defined(__APPLE__)) \ - || (defined(__ANDROID__) && (__ANDROID_API__ < 21)) - int error = ::pthread_cond_init(&cond_, 0); -#else // (defined(__MACH__) && defined(__APPLE__)) - // || (defined(__ANDROID__) && (__ANDROID_API__ < 21)) - ::pthread_condattr_t attr; - ::pthread_condattr_init(&attr); - int error = ::pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); - if (error == 0) - error = ::pthread_cond_init(&cond_, &attr); -#endif // (defined(__MACH__) && defined(__APPLE__)) - // || (defined(__ANDROID__) && (__ANDROID_API__ < 21)) - - asio::error_code ec(error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "event"); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_IMPL_POSIX_EVENT_IPP diff --git a/scout_sdk/asio/asio/detail/impl/posix_mutex.ipp b/scout_sdk/asio/asio/detail/impl/posix_mutex.ipp deleted file mode 100644 index 27272b5..0000000 --- a/scout_sdk/asio/asio/detail/impl/posix_mutex.ipp +++ /dev/null @@ -1,46 +0,0 @@ -// -// detail/impl/posix_mutex.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_POSIX_MUTEX_IPP -#define ASIO_DETAIL_IMPL_POSIX_MUTEX_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include "asio/detail/posix_mutex.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -posix_mutex::posix_mutex() -{ - int error = ::pthread_mutex_init(&mutex_, 0); - asio::error_code ec(error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "mutex"); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_IMPL_POSIX_MUTEX_IPP diff --git a/scout_sdk/asio/asio/detail/impl/posix_thread.ipp b/scout_sdk/asio/asio/detail/impl/posix_thread.ipp deleted file mode 100644 index 69bd16f..0000000 --- a/scout_sdk/asio/asio/detail/impl/posix_thread.ipp +++ /dev/null @@ -1,84 +0,0 @@ -// -// detail/impl/posix_thread.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_POSIX_THREAD_IPP -#define ASIO_DETAIL_IMPL_POSIX_THREAD_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include "asio/detail/posix_thread.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -posix_thread::~posix_thread() -{ - if (!joined_) - ::pthread_detach(thread_); -} - -void posix_thread::join() -{ - if (!joined_) - { - ::pthread_join(thread_, 0); - joined_ = true; - } -} - -std::size_t posix_thread::hardware_concurrency() -{ -#if defined(_SC_NPROCESSORS_ONLN) - long result = sysconf(_SC_NPROCESSORS_ONLN); - if (result > 0) - return result; -#endif // defined(_SC_NPROCESSORS_ONLN) - return 0; -} - -void posix_thread::start_thread(func_base* arg) -{ - int error = ::pthread_create(&thread_, 0, - asio_detail_posix_thread_function, arg); - if (error != 0) - { - delete arg; - asio::error_code ec(error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "thread"); - } -} - -void* asio_detail_posix_thread_function(void* arg) -{ - posix_thread::auto_func_base_ptr func = { - static_cast(arg) }; - func.ptr->run(); - return 0; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_IMPL_POSIX_THREAD_IPP diff --git a/scout_sdk/asio/asio/detail/impl/posix_tss_ptr.ipp b/scout_sdk/asio/asio/detail/impl/posix_tss_ptr.ipp deleted file mode 100644 index 54b58bd..0000000 --- a/scout_sdk/asio/asio/detail/impl/posix_tss_ptr.ipp +++ /dev/null @@ -1,46 +0,0 @@ -// -// detail/impl/posix_tss_ptr.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_POSIX_TSS_PTR_IPP -#define ASIO_DETAIL_IMPL_POSIX_TSS_PTR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include "asio/detail/posix_tss_ptr.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -void posix_tss_ptr_create(pthread_key_t& key) -{ - int error = ::pthread_key_create(&key, 0); - asio::error_code ec(error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "tss"); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_IMPL_POSIX_TSS_PTR_IPP diff --git a/scout_sdk/asio/asio/detail/impl/reactive_descriptor_service.ipp b/scout_sdk/asio/asio/detail/impl/reactive_descriptor_service.ipp deleted file mode 100644 index f9505ca..0000000 --- a/scout_sdk/asio/asio/detail/impl/reactive_descriptor_service.ipp +++ /dev/null @@ -1,222 +0,0 @@ -// -// detail/impl/reactive_descriptor_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_REACTIVE_DESCRIPTOR_SERVICE_IPP -#define ASIO_DETAIL_IMPL_REACTIVE_DESCRIPTOR_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - -#include "asio/error.hpp" -#include "asio/detail/reactive_descriptor_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -reactive_descriptor_service::reactive_descriptor_service( - asio::io_context& io_context) - : service_base(io_context), - reactor_(asio::use_service(io_context)) -{ - reactor_.init_task(); -} - -void reactive_descriptor_service::shutdown() -{ -} - -void reactive_descriptor_service::construct( - reactive_descriptor_service::implementation_type& impl) -{ - impl.descriptor_ = -1; - impl.state_ = 0; -} - -void reactive_descriptor_service::move_construct( - reactive_descriptor_service::implementation_type& impl, - reactive_descriptor_service::implementation_type& other_impl) -{ - impl.descriptor_ = other_impl.descriptor_; - other_impl.descriptor_ = -1; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - reactor_.move_descriptor(impl.descriptor_, - impl.reactor_data_, other_impl.reactor_data_); -} - -void reactive_descriptor_service::move_assign( - reactive_descriptor_service::implementation_type& impl, - reactive_descriptor_service& other_service, - reactive_descriptor_service::implementation_type& other_impl) -{ - destroy(impl); - - impl.descriptor_ = other_impl.descriptor_; - other_impl.descriptor_ = -1; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - other_service.reactor_.move_descriptor(impl.descriptor_, - impl.reactor_data_, other_impl.reactor_data_); -} - -void reactive_descriptor_service::destroy( - reactive_descriptor_service::implementation_type& impl) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((reactor_.context(), - "descriptor", &impl, impl.descriptor_, "close")); - - reactor_.deregister_descriptor(impl.descriptor_, impl.reactor_data_, - (impl.state_ & descriptor_ops::possible_dup) == 0); - - asio::error_code ignored_ec; - descriptor_ops::close(impl.descriptor_, impl.state_, ignored_ec); - - reactor_.cleanup_descriptor_data(impl.reactor_data_); - } -} - -asio::error_code reactive_descriptor_service::assign( - reactive_descriptor_service::implementation_type& impl, - const native_handle_type& native_descriptor, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - if (int err = reactor_.register_descriptor( - native_descriptor, impl.reactor_data_)) - { - ec = asio::error_code(err, - asio::error::get_system_category()); - return ec; - } - - impl.descriptor_ = native_descriptor; - impl.state_ = descriptor_ops::possible_dup; - ec = asio::error_code(); - return ec; -} - -asio::error_code reactive_descriptor_service::close( - reactive_descriptor_service::implementation_type& impl, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((reactor_.context(), - "descriptor", &impl, impl.descriptor_, "close")); - - reactor_.deregister_descriptor(impl.descriptor_, impl.reactor_data_, - (impl.state_ & descriptor_ops::possible_dup) == 0); - - descriptor_ops::close(impl.descriptor_, impl.state_, ec); - - reactor_.cleanup_descriptor_data(impl.reactor_data_); - } - else - { - ec = asio::error_code(); - } - - // The descriptor is closed by the OS even if close() returns an error. - // - // (Actually, POSIX says the state of the descriptor is unspecified. On - // Linux the descriptor is apparently closed anyway; e.g. see - // http://lkml.org/lkml/2005/9/10/129 - // We'll just have to assume that other OSes follow the same behaviour.) - construct(impl); - - return ec; -} - -reactive_descriptor_service::native_handle_type -reactive_descriptor_service::release( - reactive_descriptor_service::implementation_type& impl) -{ - native_handle_type descriptor = impl.descriptor_; - - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((reactor_.context(), - "descriptor", &impl, impl.descriptor_, "release")); - - reactor_.deregister_descriptor(impl.descriptor_, impl.reactor_data_, false); - reactor_.cleanup_descriptor_data(impl.reactor_data_); - construct(impl); - } - - return descriptor; -} - -asio::error_code reactive_descriptor_service::cancel( - reactive_descriptor_service::implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return ec; - } - - ASIO_HANDLER_OPERATION((reactor_.context(), - "descriptor", &impl, impl.descriptor_, "cancel")); - - reactor_.cancel_ops(impl.descriptor_, impl.reactor_data_); - ec = asio::error_code(); - return ec; -} - -void reactive_descriptor_service::start_op( - reactive_descriptor_service::implementation_type& impl, - int op_type, reactor_op* op, bool is_continuation, - bool is_non_blocking, bool noop) -{ - if (!noop) - { - if ((impl.state_ & descriptor_ops::non_blocking) || - descriptor_ops::set_internal_non_blocking( - impl.descriptor_, impl.state_, true, op->ec_)) - { - reactor_.start_op(op_type, impl.descriptor_, - impl.reactor_data_, op, is_continuation, is_non_blocking); - return; - } - } - - reactor_.post_immediate_completion(op, is_continuation); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - -#endif // ASIO_DETAIL_IMPL_REACTIVE_DESCRIPTOR_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/reactive_serial_port_service.ipp b/scout_sdk/asio/asio/detail/impl/reactive_serial_port_service.ipp deleted file mode 100644 index c907835..0000000 --- a/scout_sdk/asio/asio/detail/impl/reactive_serial_port_service.ipp +++ /dev/null @@ -1,152 +0,0 @@ -// -// detail/impl/reactive_serial_port_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP -#define ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_SERIAL_PORT) -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include -#include "asio/detail/reactive_serial_port_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -reactive_serial_port_service::reactive_serial_port_service( - asio::io_context& io_context) - : service_base(io_context), - descriptor_service_(io_context) -{ -} - -void reactive_serial_port_service::shutdown() -{ - descriptor_service_.shutdown(); -} - -asio::error_code reactive_serial_port_service::open( - reactive_serial_port_service::implementation_type& impl, - const std::string& device, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - descriptor_ops::state_type state = 0; - int fd = descriptor_ops::open(device.c_str(), - O_RDWR | O_NONBLOCK | O_NOCTTY, ec); - if (fd < 0) - return ec; - - int s = descriptor_ops::fcntl(fd, F_GETFL, ec); - if (s >= 0) - s = descriptor_ops::fcntl(fd, F_SETFL, s | O_NONBLOCK, ec); - if (s < 0) - { - asio::error_code ignored_ec; - descriptor_ops::close(fd, state, ignored_ec); - return ec; - } - - // Set up default serial port options. - termios ios; - errno = 0; - s = descriptor_ops::error_wrapper(::tcgetattr(fd, &ios), ec); - if (s >= 0) - { -#if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) - ::cfmakeraw(&ios); -#else - ios.c_iflag &= ~(IGNBRK | BRKINT | PARMRK - | ISTRIP | INLCR | IGNCR | ICRNL | IXON); - ios.c_oflag &= ~OPOST; - ios.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); - ios.c_cflag &= ~(CSIZE | PARENB); - ios.c_cflag |= CS8; -#endif - ios.c_iflag |= IGNPAR; - ios.c_cflag |= CREAD | CLOCAL; - errno = 0; - s = descriptor_ops::error_wrapper(::tcsetattr(fd, TCSANOW, &ios), ec); - } - if (s < 0) - { - asio::error_code ignored_ec; - descriptor_ops::close(fd, state, ignored_ec); - return ec; - } - - // We're done. Take ownership of the serial port descriptor. - if (descriptor_service_.assign(impl, fd, ec)) - { - asio::error_code ignored_ec; - descriptor_ops::close(fd, state, ignored_ec); - } - - return ec; -} - -asio::error_code reactive_serial_port_service::do_set_option( - reactive_serial_port_service::implementation_type& impl, - reactive_serial_port_service::store_function_type store, - const void* option, asio::error_code& ec) -{ - termios ios; - errno = 0; - descriptor_ops::error_wrapper(::tcgetattr( - descriptor_service_.native_handle(impl), &ios), ec); - if (ec) - return ec; - - if (store(option, ios, ec)) - return ec; - - errno = 0; - descriptor_ops::error_wrapper(::tcsetattr( - descriptor_service_.native_handle(impl), TCSANOW, &ios), ec); - return ec; -} - -asio::error_code reactive_serial_port_service::do_get_option( - const reactive_serial_port_service::implementation_type& impl, - reactive_serial_port_service::load_function_type load, - void* option, asio::error_code& ec) const -{ - termios ios; - errno = 0; - descriptor_ops::error_wrapper(::tcgetattr( - descriptor_service_.native_handle(impl), &ios), ec); - if (ec) - return ec; - - return load(option, ios, ec); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) -#endif // defined(ASIO_HAS_SERIAL_PORT) - -#endif // ASIO_DETAIL_IMPL_REACTIVE_SERIAL_PORT_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/reactive_socket_service_base.ipp b/scout_sdk/asio/asio/detail/impl/reactive_socket_service_base.ipp deleted file mode 100644 index 129b851..0000000 --- a/scout_sdk/asio/asio/detail/impl/reactive_socket_service_base.ipp +++ /dev/null @@ -1,300 +0,0 @@ -// -// detail/reactive_socket_service_base.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP -#define ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_IOCP) \ - && !defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/reactive_socket_service_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -reactive_socket_service_base::reactive_socket_service_base( - asio::io_context& io_context) - : io_context_(io_context), - reactor_(use_service(io_context)) -{ - reactor_.init_task(); -} - -void reactive_socket_service_base::base_shutdown() -{ -} - -void reactive_socket_service_base::construct( - reactive_socket_service_base::base_implementation_type& impl) -{ - impl.socket_ = invalid_socket; - impl.state_ = 0; -} - -void reactive_socket_service_base::base_move_construct( - reactive_socket_service_base::base_implementation_type& impl, - reactive_socket_service_base::base_implementation_type& other_impl) -{ - impl.socket_ = other_impl.socket_; - other_impl.socket_ = invalid_socket; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - reactor_.move_descriptor(impl.socket_, - impl.reactor_data_, other_impl.reactor_data_); -} - -void reactive_socket_service_base::base_move_assign( - reactive_socket_service_base::base_implementation_type& impl, - reactive_socket_service_base& other_service, - reactive_socket_service_base::base_implementation_type& other_impl) -{ - destroy(impl); - - impl.socket_ = other_impl.socket_; - other_impl.socket_ = invalid_socket; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - other_service.reactor_.move_descriptor(impl.socket_, - impl.reactor_data_, other_impl.reactor_data_); -} - -void reactive_socket_service_base::destroy( - reactive_socket_service_base::base_implementation_type& impl) -{ - if (impl.socket_ != invalid_socket) - { - ASIO_HANDLER_OPERATION((reactor_.context(), - "socket", &impl, impl.socket_, "close")); - - reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, - (impl.state_ & socket_ops::possible_dup) == 0); - - asio::error_code ignored_ec; - socket_ops::close(impl.socket_, impl.state_, true, ignored_ec); - - reactor_.cleanup_descriptor_data(impl.reactor_data_); - } -} - -asio::error_code reactive_socket_service_base::close( - reactive_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((reactor_.context(), - "socket", &impl, impl.socket_, "close")); - - reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, - (impl.state_ & socket_ops::possible_dup) == 0); - - socket_ops::close(impl.socket_, impl.state_, false, ec); - - reactor_.cleanup_descriptor_data(impl.reactor_data_); - } - else - { - ec = asio::error_code(); - } - - // The descriptor is closed by the OS even if close() returns an error. - // - // (Actually, POSIX says the state of the descriptor is unspecified. On - // Linux the descriptor is apparently closed anyway; e.g. see - // http://lkml.org/lkml/2005/9/10/129 - // We'll just have to assume that other OSes follow the same behaviour. The - // known exception is when Windows's closesocket() function fails with - // WSAEWOULDBLOCK, but this case is handled inside socket_ops::close(). - construct(impl); - - return ec; -} - -socket_type reactive_socket_service_base::release( - reactive_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return invalid_socket; - } - - ASIO_HANDLER_OPERATION((reactor_.context(), - "socket", &impl, impl.socket_, "release")); - - reactor_.deregister_descriptor(impl.socket_, impl.reactor_data_, false); - reactor_.cleanup_descriptor_data(impl.reactor_data_); - socket_type sock = impl.socket_; - construct(impl); - ec = asio::error_code(); - return sock; -} - -asio::error_code reactive_socket_service_base::cancel( - reactive_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return ec; - } - - ASIO_HANDLER_OPERATION((reactor_.context(), - "socket", &impl, impl.socket_, "cancel")); - - reactor_.cancel_ops(impl.socket_, impl.reactor_data_); - ec = asio::error_code(); - return ec; -} - -asio::error_code reactive_socket_service_base::do_open( - reactive_socket_service_base::base_implementation_type& impl, - int af, int type, int protocol, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - socket_holder sock(socket_ops::socket(af, type, protocol, ec)); - if (sock.get() == invalid_socket) - return ec; - - if (int err = reactor_.register_descriptor(sock.get(), impl.reactor_data_)) - { - ec = asio::error_code(err, - asio::error::get_system_category()); - return ec; - } - - impl.socket_ = sock.release(); - switch (type) - { - case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; - case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; - default: impl.state_ = 0; break; - } - ec = asio::error_code(); - return ec; -} - -asio::error_code reactive_socket_service_base::do_assign( - reactive_socket_service_base::base_implementation_type& impl, int type, - const reactive_socket_service_base::native_handle_type& native_socket, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - if (int err = reactor_.register_descriptor( - native_socket, impl.reactor_data_)) - { - ec = asio::error_code(err, - asio::error::get_system_category()); - return ec; - } - - impl.socket_ = native_socket; - switch (type) - { - case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; - case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; - default: impl.state_ = 0; break; - } - impl.state_ |= socket_ops::possible_dup; - ec = asio::error_code(); - return ec; -} - -void reactive_socket_service_base::start_op( - reactive_socket_service_base::base_implementation_type& impl, - int op_type, reactor_op* op, bool is_continuation, - bool is_non_blocking, bool noop) -{ - if (!noop) - { - if ((impl.state_ & socket_ops::non_blocking) - || socket_ops::set_internal_non_blocking( - impl.socket_, impl.state_, true, op->ec_)) - { - reactor_.start_op(op_type, impl.socket_, - impl.reactor_data_, op, is_continuation, is_non_blocking); - return; - } - } - - reactor_.post_immediate_completion(op, is_continuation); -} - -void reactive_socket_service_base::start_accept_op( - reactive_socket_service_base::base_implementation_type& impl, - reactor_op* op, bool is_continuation, bool peer_is_open) -{ - if (!peer_is_open) - start_op(impl, reactor::read_op, op, is_continuation, true, false); - else - { - op->ec_ = asio::error::already_open; - reactor_.post_immediate_completion(op, is_continuation); - } -} - -void reactive_socket_service_base::start_connect_op( - reactive_socket_service_base::base_implementation_type& impl, - reactor_op* op, bool is_continuation, - const socket_addr_type* addr, size_t addrlen) -{ - if ((impl.state_ & socket_ops::non_blocking) - || socket_ops::set_internal_non_blocking( - impl.socket_, impl.state_, true, op->ec_)) - { - if (socket_ops::connect(impl.socket_, addr, addrlen, op->ec_) != 0) - { - if (op->ec_ == asio::error::in_progress - || op->ec_ == asio::error::would_block) - { - op->ec_ = asio::error_code(); - reactor_.start_op(reactor::connect_op, impl.socket_, - impl.reactor_data_, op, is_continuation, false); - return; - } - } - } - - reactor_.post_immediate_completion(op, is_continuation); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_IOCP) - // && !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_REACTIVE_SOCKET_SERVICE_BASE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/resolver_service_base.ipp b/scout_sdk/asio/asio/detail/impl/resolver_service_base.ipp deleted file mode 100644 index 540bb66..0000000 --- a/scout_sdk/asio/asio/detail/impl/resolver_service_base.ipp +++ /dev/null @@ -1,154 +0,0 @@ -// -// detail/impl/resolver_service_base.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP -#define ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/resolver_service_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class resolver_service_base::work_io_context_runner -{ -public: - work_io_context_runner(asio::io_context& io_context) - : io_context_(io_context) {} - void operator()() { io_context_.run(); } -private: - asio::io_context& io_context_; -}; - -resolver_service_base::resolver_service_base( - asio::io_context& io_context) - : io_context_impl_(asio::use_service(io_context)), - work_io_context_(new asio::io_context(-1)), - work_io_context_impl_(asio::use_service< - io_context_impl>(*work_io_context_)), - work_(asio::make_work_guard(*work_io_context_)), - work_thread_(0) -{ -} - -resolver_service_base::~resolver_service_base() -{ - base_shutdown(); -} - -void resolver_service_base::base_shutdown() -{ - work_.reset(); - if (work_io_context_.get()) - { - work_io_context_->stop(); - if (work_thread_.get()) - { - work_thread_->join(); - work_thread_.reset(); - } - work_io_context_.reset(); - } -} - -void resolver_service_base::base_notify_fork( - asio::io_context::fork_event fork_ev) -{ - if (work_thread_.get()) - { - if (fork_ev == asio::io_context::fork_prepare) - { - work_io_context_->stop(); - work_thread_->join(); - } - else - { - work_io_context_->restart(); - work_thread_.reset(new asio::detail::thread( - work_io_context_runner(*work_io_context_))); - } - } -} - -void resolver_service_base::construct( - resolver_service_base::implementation_type& impl) -{ - impl.reset(static_cast(0), socket_ops::noop_deleter()); -} - -void resolver_service_base::destroy( - resolver_service_base::implementation_type& impl) -{ - ASIO_HANDLER_OPERATION((io_context_impl_.context(), - "resolver", &impl, 0, "cancel")); - - impl.reset(); -} - -void resolver_service_base::move_construct(implementation_type& impl, - implementation_type& other_impl) -{ - impl = ASIO_MOVE_CAST(implementation_type)(other_impl); -} - -void resolver_service_base::move_assign(implementation_type& impl, - resolver_service_base&, implementation_type& other_impl) -{ - destroy(impl); - impl = ASIO_MOVE_CAST(implementation_type)(other_impl); -} - -void resolver_service_base::cancel( - resolver_service_base::implementation_type& impl) -{ - ASIO_HANDLER_OPERATION((io_context_impl_.context(), - "resolver", &impl, 0, "cancel")); - - impl.reset(static_cast(0), socket_ops::noop_deleter()); -} - -void resolver_service_base::start_resolve_op(resolve_op* op) -{ - if (ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER, - io_context_impl_.concurrency_hint())) - { - start_work_thread(); - io_context_impl_.work_started(); - work_io_context_impl_.post_immediate_completion(op, false); - } - else - { - op->ec_ = asio::error::operation_not_supported; - io_context_impl_.post_immediate_completion(op, false); - } -} - -void resolver_service_base::start_work_thread() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - if (!work_thread_.get()) - { - work_thread_.reset(new asio::detail::thread( - work_io_context_runner(*work_io_context_))); - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_RESOLVER_SERVICE_BASE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/scheduler.ipp b/scout_sdk/asio/asio/detail/impl/scheduler.ipp deleted file mode 100644 index 35bc678..0000000 --- a/scout_sdk/asio/asio/detail/impl/scheduler.ipp +++ /dev/null @@ -1,571 +0,0 @@ -// -// detail/impl/scheduler.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_SCHEDULER_IPP -#define ASIO_DETAIL_IMPL_SCHEDULER_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/concurrency_hint.hpp" -#include "asio/detail/event.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/reactor.hpp" -#include "asio/detail/scheduler.hpp" -#include "asio/detail/scheduler_thread_info.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct scheduler::task_cleanup -{ - ~task_cleanup() - { - if (this_thread_->private_outstanding_work > 0) - { - asio::detail::increment( - scheduler_->outstanding_work_, - this_thread_->private_outstanding_work); - } - this_thread_->private_outstanding_work = 0; - - // Enqueue the completed operations and reinsert the task at the end of - // the operation queue. - lock_->lock(); - scheduler_->task_interrupted_ = true; - scheduler_->op_queue_.push(this_thread_->private_op_queue); - scheduler_->op_queue_.push(&scheduler_->task_operation_); - } - - scheduler* scheduler_; - mutex::scoped_lock* lock_; - thread_info* this_thread_; -}; - -struct scheduler::work_cleanup -{ - ~work_cleanup() - { - if (this_thread_->private_outstanding_work > 1) - { - asio::detail::increment( - scheduler_->outstanding_work_, - this_thread_->private_outstanding_work - 1); - } - else if (this_thread_->private_outstanding_work < 1) - { - scheduler_->work_finished(); - } - this_thread_->private_outstanding_work = 0; - -#if defined(ASIO_HAS_THREADS) - if (!this_thread_->private_op_queue.empty()) - { - lock_->lock(); - scheduler_->op_queue_.push(this_thread_->private_op_queue); - } -#endif // defined(ASIO_HAS_THREADS) - } - - scheduler* scheduler_; - mutex::scoped_lock* lock_; - thread_info* this_thread_; -}; - -scheduler::scheduler( - asio::execution_context& ctx, int concurrency_hint) - : asio::detail::execution_context_service_base(ctx), - one_thread_(concurrency_hint == 1 - || !ASIO_CONCURRENCY_HINT_IS_LOCKING( - SCHEDULER, concurrency_hint) - || !ASIO_CONCURRENCY_HINT_IS_LOCKING( - REACTOR_IO, concurrency_hint)), - mutex_(ASIO_CONCURRENCY_HINT_IS_LOCKING( - SCHEDULER, concurrency_hint)), - task_(0), - task_interrupted_(true), - outstanding_work_(0), - stopped_(false), - shutdown_(false), - concurrency_hint_(concurrency_hint) -{ - ASIO_HANDLER_TRACKING_INIT; -} - -void scheduler::shutdown() -{ - mutex::scoped_lock lock(mutex_); - shutdown_ = true; - lock.unlock(); - - // Destroy handler objects. - while (!op_queue_.empty()) - { - operation* o = op_queue_.front(); - op_queue_.pop(); - if (o != &task_operation_) - o->destroy(); - } - - // Reset to initial state. - task_ = 0; -} - -void scheduler::init_task() -{ - mutex::scoped_lock lock(mutex_); - if (!shutdown_ && !task_) - { - task_ = &use_service(this->context()); - op_queue_.push(&task_operation_); - wake_one_thread_and_unlock(lock); - } -} - -std::size_t scheduler::run(asio::error_code& ec) -{ - ec = asio::error_code(); - if (outstanding_work_ == 0) - { - stop(); - return 0; - } - - thread_info this_thread; - this_thread.private_outstanding_work = 0; - thread_call_stack::context ctx(this, this_thread); - - mutex::scoped_lock lock(mutex_); - - std::size_t n = 0; - for (; do_run_one(lock, this_thread, ec); lock.lock()) - if (n != (std::numeric_limits::max)()) - ++n; - return n; -} - -std::size_t scheduler::run_one(asio::error_code& ec) -{ - ec = asio::error_code(); - if (outstanding_work_ == 0) - { - stop(); - return 0; - } - - thread_info this_thread; - this_thread.private_outstanding_work = 0; - thread_call_stack::context ctx(this, this_thread); - - mutex::scoped_lock lock(mutex_); - - return do_run_one(lock, this_thread, ec); -} - -std::size_t scheduler::wait_one(long usec, asio::error_code& ec) -{ - ec = asio::error_code(); - if (outstanding_work_ == 0) - { - stop(); - return 0; - } - - thread_info this_thread; - this_thread.private_outstanding_work = 0; - thread_call_stack::context ctx(this, this_thread); - - mutex::scoped_lock lock(mutex_); - - return do_wait_one(lock, this_thread, usec, ec); -} - -std::size_t scheduler::poll(asio::error_code& ec) -{ - ec = asio::error_code(); - if (outstanding_work_ == 0) - { - stop(); - return 0; - } - - thread_info this_thread; - this_thread.private_outstanding_work = 0; - thread_call_stack::context ctx(this, this_thread); - - mutex::scoped_lock lock(mutex_); - -#if defined(ASIO_HAS_THREADS) - // We want to support nested calls to poll() and poll_one(), so any handlers - // that are already on a thread-private queue need to be put on to the main - // queue now. - if (one_thread_) - if (thread_info* outer_info = static_cast(ctx.next_by_key())) - op_queue_.push(outer_info->private_op_queue); -#endif // defined(ASIO_HAS_THREADS) - - std::size_t n = 0; - for (; do_poll_one(lock, this_thread, ec); lock.lock()) - if (n != (std::numeric_limits::max)()) - ++n; - return n; -} - -std::size_t scheduler::poll_one(asio::error_code& ec) -{ - ec = asio::error_code(); - if (outstanding_work_ == 0) - { - stop(); - return 0; - } - - thread_info this_thread; - this_thread.private_outstanding_work = 0; - thread_call_stack::context ctx(this, this_thread); - - mutex::scoped_lock lock(mutex_); - -#if defined(ASIO_HAS_THREADS) - // We want to support nested calls to poll() and poll_one(), so any handlers - // that are already on a thread-private queue need to be put on to the main - // queue now. - if (one_thread_) - if (thread_info* outer_info = static_cast(ctx.next_by_key())) - op_queue_.push(outer_info->private_op_queue); -#endif // defined(ASIO_HAS_THREADS) - - return do_poll_one(lock, this_thread, ec); -} - -void scheduler::stop() -{ - mutex::scoped_lock lock(mutex_); - stop_all_threads(lock); -} - -bool scheduler::stopped() const -{ - mutex::scoped_lock lock(mutex_); - return stopped_; -} - -void scheduler::restart() -{ - mutex::scoped_lock lock(mutex_); - stopped_ = false; -} - -void scheduler::compensating_work_started() -{ - thread_info_base* this_thread = thread_call_stack::contains(this); - ++static_cast(this_thread)->private_outstanding_work; -} - -void scheduler::post_immediate_completion( - scheduler::operation* op, bool is_continuation) -{ -#if defined(ASIO_HAS_THREADS) - if (one_thread_ || is_continuation) - { - if (thread_info_base* this_thread = thread_call_stack::contains(this)) - { - ++static_cast(this_thread)->private_outstanding_work; - static_cast(this_thread)->private_op_queue.push(op); - return; - } - } -#else // defined(ASIO_HAS_THREADS) - (void)is_continuation; -#endif // defined(ASIO_HAS_THREADS) - - work_started(); - mutex::scoped_lock lock(mutex_); - op_queue_.push(op); - wake_one_thread_and_unlock(lock); -} - -void scheduler::post_deferred_completion(scheduler::operation* op) -{ -#if defined(ASIO_HAS_THREADS) - if (one_thread_) - { - if (thread_info_base* this_thread = thread_call_stack::contains(this)) - { - static_cast(this_thread)->private_op_queue.push(op); - return; - } - } -#endif // defined(ASIO_HAS_THREADS) - - mutex::scoped_lock lock(mutex_); - op_queue_.push(op); - wake_one_thread_and_unlock(lock); -} - -void scheduler::post_deferred_completions( - op_queue& ops) -{ - if (!ops.empty()) - { -#if defined(ASIO_HAS_THREADS) - if (one_thread_) - { - if (thread_info_base* this_thread = thread_call_stack::contains(this)) - { - static_cast(this_thread)->private_op_queue.push(ops); - return; - } - } -#endif // defined(ASIO_HAS_THREADS) - - mutex::scoped_lock lock(mutex_); - op_queue_.push(ops); - wake_one_thread_and_unlock(lock); - } -} - -void scheduler::do_dispatch( - scheduler::operation* op) -{ - work_started(); - mutex::scoped_lock lock(mutex_); - op_queue_.push(op); - wake_one_thread_and_unlock(lock); -} - -void scheduler::abandon_operations( - op_queue& ops) -{ - op_queue ops2; - ops2.push(ops); -} - -std::size_t scheduler::do_run_one(mutex::scoped_lock& lock, - scheduler::thread_info& this_thread, - const asio::error_code& ec) -{ - while (!stopped_) - { - if (!op_queue_.empty()) - { - // Prepare to execute first handler from queue. - operation* o = op_queue_.front(); - op_queue_.pop(); - bool more_handlers = (!op_queue_.empty()); - - if (o == &task_operation_) - { - task_interrupted_ = more_handlers; - - if (more_handlers && !one_thread_) - wakeup_event_.unlock_and_signal_one(lock); - else - lock.unlock(); - - task_cleanup on_exit = { this, &lock, &this_thread }; - (void)on_exit; - - // Run the task. May throw an exception. Only block if the operation - // queue is empty and we're not polling, otherwise we want to return - // as soon as possible. - task_->run(more_handlers ? 0 : -1, this_thread.private_op_queue); - } - else - { - std::size_t task_result = o->task_result_; - - if (more_handlers && !one_thread_) - wake_one_thread_and_unlock(lock); - else - lock.unlock(); - - // Ensure the count of outstanding work is decremented on block exit. - work_cleanup on_exit = { this, &lock, &this_thread }; - (void)on_exit; - - // Complete the operation. May throw an exception. Deletes the object. - o->complete(this, ec, task_result); - - return 1; - } - } - else - { - wakeup_event_.clear(lock); - wakeup_event_.wait(lock); - } - } - - return 0; -} - -std::size_t scheduler::do_wait_one(mutex::scoped_lock& lock, - scheduler::thread_info& this_thread, long usec, - const asio::error_code& ec) -{ - if (stopped_) - return 0; - - operation* o = op_queue_.front(); - if (o == 0) - { - wakeup_event_.clear(lock); - wakeup_event_.wait_for_usec(lock, usec); - usec = 0; // Wait at most once. - o = op_queue_.front(); - } - - if (o == &task_operation_) - { - op_queue_.pop(); - bool more_handlers = (!op_queue_.empty()); - - task_interrupted_ = more_handlers; - - if (more_handlers && !one_thread_) - wakeup_event_.unlock_and_signal_one(lock); - else - lock.unlock(); - - { - task_cleanup on_exit = { this, &lock, &this_thread }; - (void)on_exit; - - // Run the task. May throw an exception. Only block if the operation - // queue is empty and we're not polling, otherwise we want to return - // as soon as possible. - task_->run(more_handlers ? 0 : usec, this_thread.private_op_queue); - } - - o = op_queue_.front(); - if (o == &task_operation_) - { - if (!one_thread_) - wakeup_event_.maybe_unlock_and_signal_one(lock); - return 0; - } - } - - if (o == 0) - return 0; - - op_queue_.pop(); - bool more_handlers = (!op_queue_.empty()); - - std::size_t task_result = o->task_result_; - - if (more_handlers && !one_thread_) - wake_one_thread_and_unlock(lock); - else - lock.unlock(); - - // Ensure the count of outstanding work is decremented on block exit. - work_cleanup on_exit = { this, &lock, &this_thread }; - (void)on_exit; - - // Complete the operation. May throw an exception. Deletes the object. - o->complete(this, ec, task_result); - - return 1; -} - -std::size_t scheduler::do_poll_one(mutex::scoped_lock& lock, - scheduler::thread_info& this_thread, - const asio::error_code& ec) -{ - if (stopped_) - return 0; - - operation* o = op_queue_.front(); - if (o == &task_operation_) - { - op_queue_.pop(); - lock.unlock(); - - { - task_cleanup c = { this, &lock, &this_thread }; - (void)c; - - // Run the task. May throw an exception. Only block if the operation - // queue is empty and we're not polling, otherwise we want to return - // as soon as possible. - task_->run(0, this_thread.private_op_queue); - } - - o = op_queue_.front(); - if (o == &task_operation_) - { - wakeup_event_.maybe_unlock_and_signal_one(lock); - return 0; - } - } - - if (o == 0) - return 0; - - op_queue_.pop(); - bool more_handlers = (!op_queue_.empty()); - - std::size_t task_result = o->task_result_; - - if (more_handlers && !one_thread_) - wake_one_thread_and_unlock(lock); - else - lock.unlock(); - - // Ensure the count of outstanding work is decremented on block exit. - work_cleanup on_exit = { this, &lock, &this_thread }; - (void)on_exit; - - // Complete the operation. May throw an exception. Deletes the object. - o->complete(this, ec, task_result); - - return 1; -} - -void scheduler::stop_all_threads( - mutex::scoped_lock& lock) -{ - stopped_ = true; - wakeup_event_.signal_all(lock); - - if (!task_interrupted_ && task_) - { - task_interrupted_ = true; - task_->interrupt(); - } -} - -void scheduler::wake_one_thread_and_unlock( - mutex::scoped_lock& lock) -{ - if (!wakeup_event_.maybe_unlock_and_signal_one(lock)) - { - if (!task_interrupted_ && task_) - { - task_interrupted_ = true; - task_->interrupt(); - } - lock.unlock(); - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_SCHEDULER_IPP diff --git a/scout_sdk/asio/asio/detail/impl/select_reactor.hpp b/scout_sdk/asio/asio/detail/impl/select_reactor.hpp deleted file mode 100644 index 04a04d4..0000000 --- a/scout_sdk/asio/asio/detail/impl/select_reactor.hpp +++ /dev/null @@ -1,100 +0,0 @@ -// -// detail/impl/select_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP -#define ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) \ - || (!defined(ASIO_HAS_DEV_POLL) \ - && !defined(ASIO_HAS_EPOLL) \ - && !defined(ASIO_HAS_KQUEUE) \ - && !defined(ASIO_WINDOWS_RUNTIME)) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -void select_reactor::add_timer_queue(timer_queue& queue) -{ - do_add_timer_queue(queue); -} - -// Remove a timer queue from the reactor. -template -void select_reactor::remove_timer_queue(timer_queue& queue) -{ - do_remove_timer_queue(queue); -} - -template -void select_reactor::schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - scheduler_.post_immediate_completion(op, false); - return; - } - - bool earliest = queue.enqueue_timer(time, timer, op); - scheduler_.work_started(); - if (earliest) - interrupter_.interrupt(); -} - -template -std::size_t select_reactor::cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue ops; - std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); - lock.unlock(); - scheduler_.post_deferred_completions(ops); - return n; -} - -template -void select_reactor::move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue ops; - queue.cancel_timer(target, ops); - queue.move_timer(target, source); - lock.unlock(); - scheduler_.post_deferred_completions(ops); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - // || (!defined(ASIO_HAS_DEV_POLL) - // && !defined(ASIO_HAS_EPOLL) - // && !defined(ASIO_HAS_KQUEUE) - // && !defined(ASIO_WINDOWS_RUNTIME)) - -#endif // ASIO_DETAIL_IMPL_SELECT_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/impl/select_reactor.ipp b/scout_sdk/asio/asio/detail/impl/select_reactor.ipp deleted file mode 100644 index 262bc69..0000000 --- a/scout_sdk/asio/asio/detail/impl/select_reactor.ipp +++ /dev/null @@ -1,333 +0,0 @@ -// -// detail/impl/select_reactor.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP -#define ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) \ - || (!defined(ASIO_HAS_DEV_POLL) \ - && !defined(ASIO_HAS_EPOLL) \ - && !defined(ASIO_HAS_KQUEUE) \ - && !defined(ASIO_WINDOWS_RUNTIME)) - -#include "asio/detail/fd_set_adapter.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/signal_blocker.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_IOCP) -class select_reactor::thread_function -{ -public: - explicit thread_function(select_reactor* r) - : this_(r) - { - } - - void operator()() - { - this_->run_thread(); - } - -private: - select_reactor* this_; -}; -#endif // defined(ASIO_HAS_IOCP) - -select_reactor::select_reactor(asio::execution_context& ctx) - : execution_context_service_base(ctx), - scheduler_(use_service(ctx)), - mutex_(), - interrupter_(), -#if defined(ASIO_HAS_IOCP) - stop_thread_(false), - thread_(0), -#endif // defined(ASIO_HAS_IOCP) - shutdown_(false) -{ -#if defined(ASIO_HAS_IOCP) - asio::detail::signal_blocker sb; - thread_ = new asio::detail::thread(thread_function(this)); -#endif // defined(ASIO_HAS_IOCP) -} - -select_reactor::~select_reactor() -{ - shutdown(); -} - -void select_reactor::shutdown() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; -#if defined(ASIO_HAS_IOCP) - stop_thread_ = true; -#endif // defined(ASIO_HAS_IOCP) - lock.unlock(); - -#if defined(ASIO_HAS_IOCP) - if (thread_) - { - interrupter_.interrupt(); - thread_->join(); - delete thread_; - thread_ = 0; - } -#endif // defined(ASIO_HAS_IOCP) - - op_queue ops; - - for (int i = 0; i < max_ops; ++i) - op_queue_[i].get_all_operations(ops); - - timer_queues_.get_all_timers(ops); - - scheduler_.abandon_operations(ops); -} - -void select_reactor::notify_fork( - asio::execution_context::fork_event fork_ev) -{ - if (fork_ev == asio::execution_context::fork_child) - interrupter_.recreate(); -} - -void select_reactor::init_task() -{ - scheduler_.init_task(); -} - -int select_reactor::register_descriptor(socket_type, - select_reactor::per_descriptor_data&) -{ - return 0; -} - -int select_reactor::register_internal_descriptor( - int op_type, socket_type descriptor, - select_reactor::per_descriptor_data&, reactor_op* op) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - op_queue_[op_type].enqueue_operation(descriptor, op); - interrupter_.interrupt(); - - return 0; -} - -void select_reactor::move_descriptor(socket_type, - select_reactor::per_descriptor_data&, - select_reactor::per_descriptor_data&) -{ -} - -void select_reactor::start_op(int op_type, socket_type descriptor, - select_reactor::per_descriptor_data&, reactor_op* op, - bool is_continuation, bool) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - post_immediate_completion(op, is_continuation); - return; - } - - bool first = op_queue_[op_type].enqueue_operation(descriptor, op); - scheduler_.work_started(); - if (first) - interrupter_.interrupt(); -} - -void select_reactor::cancel_ops(socket_type descriptor, - select_reactor::per_descriptor_data&) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor, asio::error::operation_aborted); -} - -void select_reactor::deregister_descriptor(socket_type descriptor, - select_reactor::per_descriptor_data&, bool) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor, asio::error::operation_aborted); -} - -void select_reactor::deregister_internal_descriptor( - socket_type descriptor, select_reactor::per_descriptor_data&) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue ops; - for (int i = 0; i < max_ops; ++i) - op_queue_[i].cancel_operations(descriptor, ops); -} - -void select_reactor::cleanup_descriptor_data( - select_reactor::per_descriptor_data&) -{ -} - -void select_reactor::run(long usec, op_queue& ops) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - -#if defined(ASIO_HAS_IOCP) - // Check if the thread is supposed to stop. - if (stop_thread_) - return; -#endif // defined(ASIO_HAS_IOCP) - - // Set up the descriptor sets. - for (int i = 0; i < max_select_ops; ++i) - fd_sets_[i].reset(); - fd_sets_[read_op].set(interrupter_.read_descriptor()); - socket_type max_fd = 0; - bool have_work_to_do = !timer_queues_.all_empty(); - for (int i = 0; i < max_select_ops; ++i) - { - have_work_to_do = have_work_to_do || !op_queue_[i].empty(); - fd_sets_[i].set(op_queue_[i], ops); - if (fd_sets_[i].max_descriptor() > max_fd) - max_fd = fd_sets_[i].max_descriptor(); - } - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Connection operations on Windows use both except and write fd_sets. - have_work_to_do = have_work_to_do || !op_queue_[connect_op].empty(); - fd_sets_[write_op].set(op_queue_[connect_op], ops); - if (fd_sets_[write_op].max_descriptor() > max_fd) - max_fd = fd_sets_[write_op].max_descriptor(); - fd_sets_[except_op].set(op_queue_[connect_op], ops); - if (fd_sets_[except_op].max_descriptor() > max_fd) - max_fd = fd_sets_[except_op].max_descriptor(); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - - // We can return immediately if there's no work to do and the reactor is - // not supposed to block. - if (!usec && !have_work_to_do) - return; - - // Determine how long to block while waiting for events. - timeval tv_buf = { 0, 0 }; - timeval* tv = usec ? get_timeout(usec, tv_buf) : &tv_buf; - - lock.unlock(); - - // Block on the select call until descriptors become ready. - asio::error_code ec; - int retval = socket_ops::select(static_cast(max_fd + 1), - fd_sets_[read_op], fd_sets_[write_op], fd_sets_[except_op], tv, ec); - - // Reset the interrupter. - if (retval > 0 && fd_sets_[read_op].is_set(interrupter_.read_descriptor())) - { - interrupter_.reset(); - --retval; - } - - lock.lock(); - - // Dispatch all ready operations. - if (retval > 0) - { -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Connection operations on Windows use both except and write fd_sets. - fd_sets_[except_op].perform(op_queue_[connect_op], ops); - fd_sets_[write_op].perform(op_queue_[connect_op], ops); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - - // Exception operations must be processed first to ensure that any - // out-of-band data is read before normal data. - for (int i = max_select_ops - 1; i >= 0; --i) - fd_sets_[i].perform(op_queue_[i], ops); - } - timer_queues_.get_ready_timers(ops); -} - -void select_reactor::interrupt() -{ - interrupter_.interrupt(); -} - -#if defined(ASIO_HAS_IOCP) -void select_reactor::run_thread() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - while (!stop_thread_) - { - lock.unlock(); - op_queue ops; - run(true, ops); - scheduler_.post_deferred_completions(ops); - lock.lock(); - } -} -#endif // defined(ASIO_HAS_IOCP) - -void select_reactor::do_add_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.insert(&queue); -} - -void select_reactor::do_remove_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.erase(&queue); -} - -timeval* select_reactor::get_timeout(long usec, timeval& tv) -{ - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - const long max_usec = 5 * 60 * 1000 * 1000; - usec = timer_queues_.wait_duration_usec( - (usec < 0 || max_usec < usec) ? max_usec : usec); - tv.tv_sec = usec / 1000000; - tv.tv_usec = usec % 1000000; - return &tv; -} - -void select_reactor::cancel_ops_unlocked(socket_type descriptor, - const asio::error_code& ec) -{ - bool need_interrupt = false; - op_queue ops; - for (int i = 0; i < max_ops; ++i) - need_interrupt = op_queue_[i].cancel_operations( - descriptor, ops, ec) || need_interrupt; - scheduler_.post_deferred_completions(ops); - if (need_interrupt) - interrupter_.interrupt(); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - // || (!defined(ASIO_HAS_DEV_POLL) - // && !defined(ASIO_HAS_EPOLL) - // && !defined(ASIO_HAS_KQUEUE)) - // && !defined(ASIO_WINDOWS_RUNTIME)) - -#endif // ASIO_DETAIL_IMPL_SELECT_REACTOR_IPP diff --git a/scout_sdk/asio/asio/detail/impl/service_registry.hpp b/scout_sdk/asio/asio/detail/impl/service_registry.hpp deleted file mode 100644 index d4db589..0000000 --- a/scout_sdk/asio/asio/detail/impl/service_registry.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// detail/impl/service_registry.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP -#define ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -Service& service_registry::use_service() -{ - execution_context::service::key key; - init_key(key, 0); - factory_type factory = &service_registry::create; - return *static_cast(do_use_service(key, factory, &owner_)); -} - -template -Service& service_registry::use_service(io_context& owner) -{ - execution_context::service::key key; - init_key(key, 0); - factory_type factory = &service_registry::create; - return *static_cast(do_use_service(key, factory, &owner)); -} - -template -void service_registry::add_service(Service* new_service) -{ - execution_context::service::key key; - init_key(key, 0); - return do_add_service(key, new_service); -} - -template -bool service_registry::has_service() const -{ - execution_context::service::key key; - init_key(key, 0); - return do_has_service(key); -} - -template -inline void service_registry::init_key( - execution_context::service::key& key, ...) -{ - init_key_from_id(key, Service::id); -} - -#if !defined(ASIO_NO_TYPEID) -template -void service_registry::init_key(execution_context::service::key& key, - typename enable_if< - is_base_of::value>::type*) -{ - key.type_info_ = &typeid(typeid_wrapper); - key.id_ = 0; -} - -template -void service_registry::init_key_from_id(execution_context::service::key& key, - const service_id& /*id*/) -{ - key.type_info_ = &typeid(typeid_wrapper); - key.id_ = 0; -} -#endif // !defined(ASIO_NO_TYPEID) - -template -execution_context::service* service_registry::create(void* owner) -{ - return new Service(*static_cast(owner)); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_HPP diff --git a/scout_sdk/asio/asio/detail/impl/service_registry.ipp b/scout_sdk/asio/asio/detail/impl/service_registry.ipp deleted file mode 100644 index a465033..0000000 --- a/scout_sdk/asio/asio/detail/impl/service_registry.ipp +++ /dev/null @@ -1,197 +0,0 @@ -// -// detail/impl/service_registry.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP -#define ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/service_registry.hpp" -#include "asio/detail/throw_exception.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -service_registry::service_registry(execution_context& owner) - : owner_(owner), - first_service_(0) -{ -} - -service_registry::~service_registry() -{ -} - -void service_registry::shutdown_services() -{ - execution_context::service* service = first_service_; - while (service) - { - service->shutdown(); - service = service->next_; - } -} - -void service_registry::destroy_services() -{ - while (first_service_) - { - execution_context::service* next_service = first_service_->next_; - destroy(first_service_); - first_service_ = next_service; - } -} - -void service_registry::notify_fork(execution_context::fork_event fork_ev) -{ - // Make a copy of all of the services while holding the lock. We don't want - // to hold the lock while calling into each service, as it may try to call - // back into this class. - std::vector services; - { - asio::detail::mutex::scoped_lock lock(mutex_); - execution_context::service* service = first_service_; - while (service) - { - services.push_back(service); - service = service->next_; - } - } - - // If processing the fork_prepare event, we want to go in reverse order of - // service registration, which happens to be the existing order of the - // services in the vector. For the other events we want to go in the other - // direction. - std::size_t num_services = services.size(); - if (fork_ev == execution_context::fork_prepare) - for (std::size_t i = 0; i < num_services; ++i) - services[i]->notify_fork(fork_ev); - else - for (std::size_t i = num_services; i > 0; --i) - services[i - 1]->notify_fork(fork_ev); -} - -void service_registry::init_key_from_id(execution_context::service::key& key, - const execution_context::id& id) -{ - key.type_info_ = 0; - key.id_ = &id; -} - -bool service_registry::keys_match( - const execution_context::service::key& key1, - const execution_context::service::key& key2) -{ - if (key1.id_ && key2.id_) - if (key1.id_ == key2.id_) - return true; - if (key1.type_info_ && key2.type_info_) - if (*key1.type_info_ == *key2.type_info_) - return true; - return false; -} - -void service_registry::destroy(execution_context::service* service) -{ - delete service; -} - -execution_context::service* service_registry::do_use_service( - const execution_context::service::key& key, - factory_type factory, void* owner) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - // First see if there is an existing service object with the given key. - execution_context::service* service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - return service; - service = service->next_; - } - - // Create a new service object. The service registry's mutex is not locked - // at this time to allow for nested calls into this function from the new - // service's constructor. - lock.unlock(); - auto_service_ptr new_service = { factory(owner) }; - new_service.ptr_->key_ = key; - lock.lock(); - - // Check that nobody else created another service object of the same type - // while the lock was released. - service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - return service; - service = service->next_; - } - - // Service was successfully initialised, pass ownership to registry. - new_service.ptr_->next_ = first_service_; - first_service_ = new_service.ptr_; - new_service.ptr_ = 0; - return first_service_; -} - -void service_registry::do_add_service( - const execution_context::service::key& key, - execution_context::service* new_service) -{ - if (&owner_ != &new_service->context()) - asio::detail::throw_exception(invalid_service_owner()); - - asio::detail::mutex::scoped_lock lock(mutex_); - - // Check if there is an existing service object with the given key. - execution_context::service* service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - asio::detail::throw_exception(service_already_exists()); - service = service->next_; - } - - // Take ownership of the service object. - new_service->key_ = key; - new_service->next_ = first_service_; - first_service_ = new_service; -} - -bool service_registry::do_has_service( - const execution_context::service::key& key) const -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - execution_context::service* service = first_service_; - while (service) - { - if (keys_match(service->key_, key)) - return true; - service = service->next_; - } - - return false; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_SERVICE_REGISTRY_IPP diff --git a/scout_sdk/asio/asio/detail/impl/signal_set_service.ipp b/scout_sdk/asio/asio/detail/impl/signal_set_service.ipp deleted file mode 100644 index dd68fc1..0000000 --- a/scout_sdk/asio/asio/detail/impl/signal_set_service.ipp +++ /dev/null @@ -1,669 +0,0 @@ -// -// detail/impl/signal_set_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP -#define ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include -#include "asio/detail/reactor.hpp" -#include "asio/detail/signal_blocker.hpp" -#include "asio/detail/signal_set_service.hpp" -#include "asio/detail/static_mutex.hpp" -#include "asio/detail/throw_exception.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct signal_state -{ - // Mutex used for protecting global state. - static_mutex mutex_; - - // The read end of the pipe used for signal notifications. - int read_descriptor_; - - // The write end of the pipe used for signal notifications. - int write_descriptor_; - - // Whether the signal state has been prepared for a fork. - bool fork_prepared_; - - // The head of a linked list of all signal_set_service instances. - class signal_set_service* service_list_; - - // A count of the number of objects that are registered for each signal. - std::size_t registration_count_[max_signal_number]; -}; - -signal_state* get_signal_state() -{ - static signal_state state = { - ASIO_STATIC_MUTEX_INIT, -1, -1, false, 0, { 0 } }; - return &state; -} - -void asio_signal_handler(int signal_number) -{ -#if defined(ASIO_WINDOWS) \ - || defined(ASIO_WINDOWS_RUNTIME) \ - || defined(__CYGWIN__) - signal_set_service::deliver_signal(signal_number); -#else // defined(ASIO_WINDOWS) - // || defined(ASIO_WINDOWS_RUNTIME) - // || defined(__CYGWIN__) - int saved_errno = errno; - signal_state* state = get_signal_state(); - signed_size_type result = ::write(state->write_descriptor_, - &signal_number, sizeof(signal_number)); - (void)result; - errno = saved_errno; -#endif // defined(ASIO_WINDOWS) - // || defined(ASIO_WINDOWS_RUNTIME) - // || defined(__CYGWIN__) - -#if defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION) - ::signal(signal_number, asio_signal_handler); -#endif // defined(ASIO_HAS_SIGNAL) && !defined(ASIO_HAS_SIGACTION) -} - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) -class signal_set_service::pipe_read_op : public reactor_op -{ -public: - pipe_read_op() - : reactor_op(&pipe_read_op::do_perform, pipe_read_op::do_complete) - { - } - - static status do_perform(reactor_op*) - { - signal_state* state = get_signal_state(); - - int fd = state->read_descriptor_; - int signal_number = 0; - while (::read(fd, &signal_number, sizeof(int)) == sizeof(int)) - if (signal_number >= 0 && signal_number < max_signal_number) - signal_set_service::deliver_signal(signal_number); - - return not_done; - } - - static void do_complete(void* /*owner*/, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - pipe_read_op* o(static_cast(base)); - delete o; - } -}; -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - -signal_set_service::signal_set_service( - asio::io_context& io_context) - : service_base(io_context), - io_context_(asio::use_service(io_context)), -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - reactor_(asio::use_service(io_context)), -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - next_(0), - prev_(0) -{ - get_signal_state()->mutex_.init(); - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - reactor_.init_task(); -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - - for (int i = 0; i < max_signal_number; ++i) - registrations_[i] = 0; - - add_service(this); -} - -signal_set_service::~signal_set_service() -{ - remove_service(this); -} - -void signal_set_service::shutdown() -{ - remove_service(this); - - op_queue ops; - - for (int i = 0; i < max_signal_number; ++i) - { - registration* reg = registrations_[i]; - while (reg) - { - ops.push(*reg->queue_); - reg = reg->next_in_table_; - } - } - - io_context_.abandon_operations(ops); -} - -void signal_set_service::notify_fork( - asio::io_context::fork_event fork_ev) -{ -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - switch (fork_ev) - { - case asio::io_context::fork_prepare: - { - int read_descriptor = state->read_descriptor_; - state->fork_prepared_ = true; - lock.unlock(); - reactor_.deregister_internal_descriptor(read_descriptor, reactor_data_); - reactor_.cleanup_descriptor_data(reactor_data_); - } - break; - case asio::io_context::fork_parent: - if (state->fork_prepared_) - { - int read_descriptor = state->read_descriptor_; - state->fork_prepared_ = false; - lock.unlock(); - reactor_.register_internal_descriptor(reactor::read_op, - read_descriptor, reactor_data_, new pipe_read_op); - } - break; - case asio::io_context::fork_child: - if (state->fork_prepared_) - { - asio::detail::signal_blocker blocker; - close_descriptors(); - open_descriptors(); - int read_descriptor = state->read_descriptor_; - state->fork_prepared_ = false; - lock.unlock(); - reactor_.register_internal_descriptor(reactor::read_op, - read_descriptor, reactor_data_, new pipe_read_op); - } - break; - default: - break; - } -#else // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - (void)fork_ev; -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::construct( - signal_set_service::implementation_type& impl) -{ - impl.signals_ = 0; -} - -void signal_set_service::destroy( - signal_set_service::implementation_type& impl) -{ - asio::error_code ignored_ec; - clear(impl, ignored_ec); - cancel(impl, ignored_ec); -} - -asio::error_code signal_set_service::add( - signal_set_service::implementation_type& impl, - int signal_number, asio::error_code& ec) -{ - // Check that the signal number is valid. - if (signal_number < 0 || signal_number >= max_signal_number) - { - ec = asio::error::invalid_argument; - return ec; - } - - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - // Find the appropriate place to insert the registration. - registration** insertion_point = &impl.signals_; - registration* next = impl.signals_; - while (next && next->signal_number_ < signal_number) - { - insertion_point = &next->next_in_set_; - next = next->next_in_set_; - } - - // Only do something if the signal is not already registered. - if (next == 0 || next->signal_number_ != signal_number) - { - registration* new_registration = new registration; - -#if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - // Register for the signal if we're the first. - if (state->registration_count_[signal_number] == 0) - { -# if defined(ASIO_HAS_SIGACTION) - using namespace std; // For memset. - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = asio_signal_handler; - sigfillset(&sa.sa_mask); - if (::sigaction(signal_number, &sa, 0) == -1) -# else // defined(ASIO_HAS_SIGACTION) - if (::signal(signal_number, asio_signal_handler) == SIG_ERR) -# endif // defined(ASIO_HAS_SIGACTION) - { -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error::invalid_argument; -# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error_code(errno, - asio::error::get_system_category()); -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - delete new_registration; - return ec; - } - } -#endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - - // Record the new registration in the set. - new_registration->signal_number_ = signal_number; - new_registration->queue_ = &impl.queue_; - new_registration->next_in_set_ = next; - *insertion_point = new_registration; - - // Insert registration into the registration table. - new_registration->next_in_table_ = registrations_[signal_number]; - if (registrations_[signal_number]) - registrations_[signal_number]->prev_in_table_ = new_registration; - registrations_[signal_number] = new_registration; - - ++state->registration_count_[signal_number]; - } - - ec = asio::error_code(); - return ec; -} - -asio::error_code signal_set_service::remove( - signal_set_service::implementation_type& impl, - int signal_number, asio::error_code& ec) -{ - // Check that the signal number is valid. - if (signal_number < 0 || signal_number >= max_signal_number) - { - ec = asio::error::invalid_argument; - return ec; - } - - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - // Find the signal number in the list of registrations. - registration** deletion_point = &impl.signals_; - registration* reg = impl.signals_; - while (reg && reg->signal_number_ < signal_number) - { - deletion_point = ®->next_in_set_; - reg = reg->next_in_set_; - } - - if (reg != 0 && reg->signal_number_ == signal_number) - { -#if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - // Set signal handler back to the default if we're the last. - if (state->registration_count_[signal_number] == 1) - { -# if defined(ASIO_HAS_SIGACTION) - using namespace std; // For memset. - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = SIG_DFL; - if (::sigaction(signal_number, &sa, 0) == -1) -# else // defined(ASIO_HAS_SIGACTION) - if (::signal(signal_number, SIG_DFL) == SIG_ERR) -# endif // defined(ASIO_HAS_SIGACTION) - { -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error::invalid_argument; -# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error_code(errno, - asio::error::get_system_category()); -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - return ec; - } - } -#endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - - // Remove the registration from the set. - *deletion_point = reg->next_in_set_; - - // Remove the registration from the registration table. - if (registrations_[signal_number] == reg) - registrations_[signal_number] = reg->next_in_table_; - if (reg->prev_in_table_) - reg->prev_in_table_->next_in_table_ = reg->next_in_table_; - if (reg->next_in_table_) - reg->next_in_table_->prev_in_table_ = reg->prev_in_table_; - - --state->registration_count_[signal_number]; - - delete reg; - } - - ec = asio::error_code(); - return ec; -} - -asio::error_code signal_set_service::clear( - signal_set_service::implementation_type& impl, - asio::error_code& ec) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - while (registration* reg = impl.signals_) - { -#if defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - // Set signal handler back to the default if we're the last. - if (state->registration_count_[reg->signal_number_] == 1) - { -# if defined(ASIO_HAS_SIGACTION) - using namespace std; // For memset. - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sa.sa_handler = SIG_DFL; - if (::sigaction(reg->signal_number_, &sa, 0) == -1) -# else // defined(ASIO_HAS_SIGACTION) - if (::signal(reg->signal_number_, SIG_DFL) == SIG_ERR) -# endif // defined(ASIO_HAS_SIGACTION) - { -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error::invalid_argument; -# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error_code(errno, - asio::error::get_system_category()); -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - return ec; - } - } -#endif // defined(ASIO_HAS_SIGNAL) || defined(ASIO_HAS_SIGACTION) - - // Remove the registration from the registration table. - if (registrations_[reg->signal_number_] == reg) - registrations_[reg->signal_number_] = reg->next_in_table_; - if (reg->prev_in_table_) - reg->prev_in_table_->next_in_table_ = reg->next_in_table_; - if (reg->next_in_table_) - reg->next_in_table_->prev_in_table_ = reg->prev_in_table_; - - --state->registration_count_[reg->signal_number_]; - - impl.signals_ = reg->next_in_set_; - delete reg; - } - - ec = asio::error_code(); - return ec; -} - -asio::error_code signal_set_service::cancel( - signal_set_service::implementation_type& impl, - asio::error_code& ec) -{ - ASIO_HANDLER_OPERATION((io_context_.context(), - "signal_set", &impl, 0, "cancel")); - - op_queue ops; - { - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - while (signal_op* op = impl.queue_.front()) - { - op->ec_ = asio::error::operation_aborted; - impl.queue_.pop(); - ops.push(op); - } - } - - io_context_.post_deferred_completions(ops); - - ec = asio::error_code(); - return ec; -} - -void signal_set_service::deliver_signal(int signal_number) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - signal_set_service* service = state->service_list_; - while (service) - { - op_queue ops; - - registration* reg = service->registrations_[signal_number]; - while (reg) - { - if (reg->queue_->empty()) - { - ++reg->undelivered_; - } - else - { - while (signal_op* op = reg->queue_->front()) - { - op->signal_number_ = signal_number; - reg->queue_->pop(); - ops.push(op); - } - } - - reg = reg->next_in_table_; - } - - service->io_context_.post_deferred_completions(ops); - - service = service->next_; - } -} - -void signal_set_service::add_service(signal_set_service* service) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - // If this is the first service to be created, open a new pipe. - if (state->service_list_ == 0) - open_descriptors(); -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - - // If an io_context object is thread-unsafe then it must be the only - // io_context used to create signal_set objects. - if (state->service_list_ != 0) - { - if (!ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER, - service->io_context_.concurrency_hint()) - || !ASIO_CONCURRENCY_HINT_IS_LOCKING(SCHEDULER, - state->service_list_->io_context_.concurrency_hint())) - { - std::logic_error ex( - "Thread-unsafe io_context objects require " - "exclusive access to signal handling."); - asio::detail::throw_exception(ex); - } - } - - // Insert service into linked list of all services. - service->next_ = state->service_list_; - service->prev_ = 0; - if (state->service_list_) - state->service_list_->prev_ = service; - state->service_list_ = service; - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - // Register for pipe readiness notifications. - int read_descriptor = state->read_descriptor_; - lock.unlock(); - service->reactor_.register_internal_descriptor(reactor::read_op, - read_descriptor, service->reactor_data_, new pipe_read_op); -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::remove_service(signal_set_service* service) -{ - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - if (service->next_ || service->prev_ || state->service_list_ == service) - { -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - // Disable the pipe readiness notifications. - int read_descriptor = state->read_descriptor_; - lock.unlock(); - service->reactor_.deregister_internal_descriptor( - read_descriptor, service->reactor_data_); - service->reactor_.cleanup_descriptor_data(service->reactor_data_); - lock.lock(); -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - - // Remove service from linked list of all services. - if (state->service_list_ == service) - state->service_list_ = service->next_; - if (service->prev_) - service->prev_->next_ = service->next_; - if (service->next_) - service->next_->prev_= service->prev_; - service->next_ = 0; - service->prev_ = 0; - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - // If this is the last service to be removed, close the pipe. - if (state->service_list_ == 0) - close_descriptors(); -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - } -} - -void signal_set_service::open_descriptors() -{ -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - signal_state* state = get_signal_state(); - - int pipe_fds[2]; - if (::pipe(pipe_fds) == 0) - { - state->read_descriptor_ = pipe_fds[0]; - ::fcntl(state->read_descriptor_, F_SETFL, O_NONBLOCK); - - state->write_descriptor_ = pipe_fds[1]; - ::fcntl(state->write_descriptor_, F_SETFL, O_NONBLOCK); - -#if defined(FD_CLOEXEC) - ::fcntl(state->read_descriptor_, F_SETFD, FD_CLOEXEC); - ::fcntl(state->write_descriptor_, F_SETFD, FD_CLOEXEC); -#endif // defined(FD_CLOEXEC) - } - else - { - asio::error_code ec(errno, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "signal_set_service pipe"); - } -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::close_descriptors() -{ -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - signal_state* state = get_signal_state(); - - if (state->read_descriptor_ != -1) - ::close(state->read_descriptor_); - state->read_descriptor_ = -1; - - if (state->write_descriptor_ != -1) - ::close(state->write_descriptor_); - state->write_descriptor_ = -1; -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) -} - -void signal_set_service::start_wait_op( - signal_set_service::implementation_type& impl, signal_op* op) -{ - io_context_.work_started(); - - signal_state* state = get_signal_state(); - static_mutex::scoped_lock lock(state->mutex_); - - registration* reg = impl.signals_; - while (reg) - { - if (reg->undelivered_ > 0) - { - --reg->undelivered_; - op->signal_number_ = reg->signal_number_; - io_context_.post_deferred_completion(op); - return; - } - - reg = reg->next_in_set_; - } - - impl.queue_.push(op); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_SIGNAL_SET_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/socket_ops.ipp b/scout_sdk/asio/asio/detail/impl/socket_ops.ipp deleted file mode 100644 index 5e74733..0000000 --- a/scout_sdk/asio/asio/detail/impl/socket_ops.ipp +++ /dev/null @@ -1,3571 +0,0 @@ -// -// detail/impl/socket_ops.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_OPS_IPP -#define ASIO_DETAIL_SOCKET_OPS_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include -#include -#include -#include -#include -#include "asio/detail/assert.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include -# include -# include -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) \ - || defined(__MACH__) && defined(__APPLE__) -# if defined(ASIO_HAS_PTHREADS) -# include -# endif // defined(ASIO_HAS_PTHREADS) -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // || defined(__MACH__) && defined(__APPLE__) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { -namespace socket_ops { - -#if !defined(ASIO_WINDOWS_RUNTIME) - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -struct msghdr { int msg_namelen; }; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#if defined(__hpux) -// HP-UX doesn't declare these functions extern "C", so they are declared again -// here to avoid linker errors about undefined symbols. -extern "C" char* if_indextoname(unsigned int, char*); -extern "C" unsigned int if_nametoindex(const char*); -#endif // defined(__hpux) - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -inline void clear_last_error() -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - WSASetLastError(0); -#else - errno = 0; -#endif -} - -#if !defined(ASIO_WINDOWS_RUNTIME) - -template -inline ReturnType error_wrapper(ReturnType return_value, - asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ec = asio::error_code(WSAGetLastError(), - asio::error::get_system_category()); -#else - ec = asio::error_code(errno, - asio::error::get_system_category()); -#endif - return return_value; -} - -template -inline socket_type call_accept(SockLenType msghdr::*, - socket_type s, socket_addr_type* addr, std::size_t* addrlen) -{ - SockLenType tmp_addrlen = addrlen ? (SockLenType)*addrlen : 0; - socket_type result = ::accept(s, addr, addrlen ? &tmp_addrlen : 0); - if (addrlen) - *addrlen = (std::size_t)tmp_addrlen; - return result; -} - -socket_type accept(socket_type s, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return invalid_socket; - } - - clear_last_error(); - - socket_type new_s = error_wrapper(call_accept( - &msghdr::msg_namelen, s, addr, addrlen), ec); - if (new_s == invalid_socket) - return new_s; - -#if defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__) - int optval = 1; - int result = error_wrapper(::setsockopt(new_s, - SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec); - if (result != 0) - { - ::close(new_s); - return invalid_socket; - } -#endif - - ec = asio::error_code(); - return new_s; -} - -socket_type sync_accept(socket_type s, state_type state, - socket_addr_type* addr, std::size_t* addrlen, asio::error_code& ec) -{ - // Accept a socket. - for (;;) - { - // Try to complete the operation without blocking. - socket_type new_socket = socket_ops::accept(s, addr, addrlen, ec); - - // Check if operation succeeded. - if (new_socket != invalid_socket) - return new_socket; - - // Operation failed. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - { - if (state & user_set_non_blocking) - return invalid_socket; - // Fall through to retry operation. - } - else if (ec == asio::error::connection_aborted) - { - if (state & enable_connection_aborted) - return invalid_socket; - // Fall through to retry operation. - } -#if defined(EPROTO) - else if (ec.value() == EPROTO) - { - if (state & enable_connection_aborted) - return invalid_socket; - // Fall through to retry operation. - } -#endif // defined(EPROTO) - else - return invalid_socket; - - // Wait for socket to become ready. - if (socket_ops::poll_read(s, 0, -1, ec) < 0) - return invalid_socket; - } -} - -#if defined(ASIO_HAS_IOCP) - -void complete_iocp_accept(socket_type s, - void* output_buffer, DWORD address_length, - socket_addr_type* addr, std::size_t* addrlen, - socket_type new_socket, asio::error_code& ec) -{ - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_NETNAME_DELETED) - ec = asio::error::connection_aborted; - - if (!ec) - { - // Get the address of the peer. - if (addr && addrlen) - { - LPSOCKADDR local_addr = 0; - int local_addr_length = 0; - LPSOCKADDR remote_addr = 0; - int remote_addr_length = 0; - GetAcceptExSockaddrs(output_buffer, 0, address_length, - address_length, &local_addr, &local_addr_length, - &remote_addr, &remote_addr_length); - if (static_cast(remote_addr_length) > *addrlen) - { - ec = asio::error::invalid_argument; - } - else - { - using namespace std; // For memcpy. - memcpy(addr, remote_addr, remote_addr_length); - *addrlen = static_cast(remote_addr_length); - } - } - - // Need to set the SO_UPDATE_ACCEPT_CONTEXT option so that getsockname - // and getpeername will work on the accepted socket. - SOCKET update_ctx_param = s; - socket_ops::state_type state = 0; - socket_ops::setsockopt(new_socket, state, - SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, - &update_ctx_param, sizeof(SOCKET), ec); - } -} - -#else // defined(ASIO_HAS_IOCP) - -bool non_blocking_accept(socket_type s, - state_type state, socket_addr_type* addr, std::size_t* addrlen, - asio::error_code& ec, socket_type& new_socket) -{ - for (;;) - { - // Accept the waiting connection. - new_socket = socket_ops::accept(s, addr, addrlen, ec); - - // Check if operation succeeded. - if (new_socket != invalid_socket) - return true; - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Operation failed. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - { - // Fall through to retry operation. - } - else if (ec == asio::error::connection_aborted) - { - if (state & enable_connection_aborted) - return true; - // Fall through to retry operation. - } -#if defined(EPROTO) - else if (ec.value() == EPROTO) - { - if (state & enable_connection_aborted) - return true; - // Fall through to retry operation. - } -#endif // defined(EPROTO) - else - return true; - - return false; - } -} - -#endif // defined(ASIO_HAS_IOCP) - -template -inline int call_bind(SockLenType msghdr::*, - socket_type s, const socket_addr_type* addr, std::size_t addrlen) -{ - return ::bind(s, addr, (SockLenType)addrlen); -} - -int bind(socket_type s, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - clear_last_error(); - int result = error_wrapper(call_bind( - &msghdr::msg_namelen, s, addr, addrlen), ec); - if (result == 0) - ec = asio::error_code(); - return result; -} - -int close(socket_type s, state_type& state, - bool destruction, asio::error_code& ec) -{ - int result = 0; - if (s != invalid_socket) - { - // We don't want the destructor to block, so set the socket to linger in - // the background. If the user doesn't like this behaviour then they need - // to explicitly close the socket. - if (destruction && (state & user_set_linger)) - { - ::linger opt; - opt.l_onoff = 0; - opt.l_linger = 0; - asio::error_code ignored_ec; - socket_ops::setsockopt(s, state, SOL_SOCKET, - SO_LINGER, &opt, sizeof(opt), ignored_ec); - } - - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - result = error_wrapper(::closesocket(s), ec); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - result = error_wrapper(::close(s), ec); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - - if (result != 0 - && (ec == asio::error::would_block - || ec == asio::error::try_again)) - { - // According to UNIX Network Programming Vol. 1, it is possible for - // close() to fail with EWOULDBLOCK under certain circumstances. What - // isn't clear is the state of the descriptor after this error. The one - // current OS where this behaviour is seen, Windows, says that the socket - // remains open. Therefore we'll put the descriptor back into blocking - // mode and have another attempt at closing it. -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ioctl_arg_type arg = 0; - ::ioctlsocket(s, FIONBIO, &arg); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if defined(__SYMBIAN32__) - int flags = ::fcntl(s, F_GETFL, 0); - if (flags >= 0) - ::fcntl(s, F_SETFL, flags & ~O_NONBLOCK); -# else // defined(__SYMBIAN32__) - ioctl_arg_type arg = 0; - ::ioctl(s, FIONBIO, &arg); -# endif // defined(__SYMBIAN32__) -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - state &= ~non_blocking; - - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - result = error_wrapper(::closesocket(s), ec); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - result = error_wrapper(::close(s), ec); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - } - } - - if (result == 0) - ec = asio::error_code(); - return result; -} - -bool set_user_non_blocking(socket_type s, - state_type& state, bool value, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return false; - } - - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ioctl_arg_type arg = (value ? 1 : 0); - int result = error_wrapper(::ioctlsocket(s, FIONBIO, &arg), ec); -#elif defined(__SYMBIAN32__) - int result = error_wrapper(::fcntl(s, F_GETFL, 0), ec); - if (result >= 0) - { - clear_last_error(); - int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); - result = error_wrapper(::fcntl(s, F_SETFL, flag), ec); - } -#else - ioctl_arg_type arg = (value ? 1 : 0); - int result = error_wrapper(::ioctl(s, FIONBIO, &arg), ec); -#endif - - if (result >= 0) - { - ec = asio::error_code(); - if (value) - state |= user_set_non_blocking; - else - { - // Clearing the user-set non-blocking mode always overrides any - // internally-set non-blocking flag. Any subsequent asynchronous - // operations will need to re-enable non-blocking I/O. - state &= ~(user_set_non_blocking | internal_non_blocking); - } - return true; - } - - return false; -} - -bool set_internal_non_blocking(socket_type s, - state_type& state, bool value, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return false; - } - - if (!value && (state & user_set_non_blocking)) - { - // It does not make sense to clear the internal non-blocking flag if the - // user still wants non-blocking behaviour. Return an error and let the - // caller figure out whether to update the user-set non-blocking flag. - ec = asio::error::invalid_argument; - return false; - } - - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - ioctl_arg_type arg = (value ? 1 : 0); - int result = error_wrapper(::ioctlsocket(s, FIONBIO, &arg), ec); -#elif defined(__SYMBIAN32__) - int result = error_wrapper(::fcntl(s, F_GETFL, 0), ec); - if (result >= 0) - { - clear_last_error(); - int flag = (value ? (result | O_NONBLOCK) : (result & ~O_NONBLOCK)); - result = error_wrapper(::fcntl(s, F_SETFL, flag), ec); - } -#else - ioctl_arg_type arg = (value ? 1 : 0); - int result = error_wrapper(::ioctl(s, FIONBIO, &arg), ec); -#endif - - if (result >= 0) - { - ec = asio::error_code(); - if (value) - state |= internal_non_blocking; - else - state &= ~internal_non_blocking; - return true; - } - - return false; -} - -int shutdown(socket_type s, int what, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - clear_last_error(); - int result = error_wrapper(::shutdown(s, what), ec); - if (result == 0) - ec = asio::error_code(); - return result; -} - -template -inline int call_connect(SockLenType msghdr::*, - socket_type s, const socket_addr_type* addr, std::size_t addrlen) -{ - return ::connect(s, addr, (SockLenType)addrlen); -} - -int connect(socket_type s, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - clear_last_error(); - int result = error_wrapper(call_connect( - &msghdr::msg_namelen, s, addr, addrlen), ec); - if (result == 0) - ec = asio::error_code(); -#if defined(__linux__) - else if (ec == asio::error::try_again) - ec = asio::error::no_buffer_space; -#endif // defined(__linux__) - return result; -} - -void sync_connect(socket_type s, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec) -{ - // Perform the connect operation. - socket_ops::connect(s, addr, addrlen, ec); - if (ec != asio::error::in_progress - && ec != asio::error::would_block) - { - // The connect operation finished immediately. - return; - } - - // Wait for socket to become ready. - if (socket_ops::poll_connect(s, -1, ec) < 0) - return; - - // Get the error code from the connect operation. - int connect_error = 0; - size_t connect_error_len = sizeof(connect_error); - if (socket_ops::getsockopt(s, 0, SOL_SOCKET, SO_ERROR, - &connect_error, &connect_error_len, ec) == socket_error_retval) - return; - - // Return the result of the connect operation. - ec = asio::error_code(connect_error, - asio::error::get_system_category()); -} - -#if defined(ASIO_HAS_IOCP) - -void complete_iocp_connect(socket_type s, asio::error_code& ec) -{ - // Map non-portable errors to their portable counterparts. - switch (ec.value()) - { - case ERROR_CONNECTION_REFUSED: - ec = asio::error::connection_refused; - break; - case ERROR_NETWORK_UNREACHABLE: - ec = asio::error::network_unreachable; - break; - case ERROR_HOST_UNREACHABLE: - ec = asio::error::host_unreachable; - break; - case ERROR_SEM_TIMEOUT: - ec = asio::error::timed_out; - break; - default: - break; - } - - if (!ec) - { - // Need to set the SO_UPDATE_CONNECT_CONTEXT option so that getsockname - // and getpeername will work on the connected socket. - socket_ops::state_type state = 0; - const int so_update_connect_context = 0x7010; - socket_ops::setsockopt(s, state, SOL_SOCKET, - so_update_connect_context, 0, 0, ec); - } -} - -#endif // defined(ASIO_HAS_IOCP) - -bool non_blocking_connect(socket_type s, asio::error_code& ec) -{ - // Check if the connect operation has finished. This is required since we may - // get spurious readiness notifications from the reactor. -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - fd_set write_fds; - FD_ZERO(&write_fds); - FD_SET(s, &write_fds); - fd_set except_fds; - FD_ZERO(&except_fds); - FD_SET(s, &except_fds); - timeval zero_timeout; - zero_timeout.tv_sec = 0; - zero_timeout.tv_usec = 0; - int ready = ::select(s + 1, 0, &write_fds, &except_fds, &zero_timeout); -#else // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - pollfd fds; - fds.fd = s; - fds.events = POLLOUT; - fds.revents = 0; - int ready = ::poll(&fds, 1, 0); -#endif // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - if (ready == 0) - { - // The asynchronous connect operation is still in progress. - return false; - } - - // Get the error code from the connect operation. - int connect_error = 0; - size_t connect_error_len = sizeof(connect_error); - if (socket_ops::getsockopt(s, 0, SOL_SOCKET, SO_ERROR, - &connect_error, &connect_error_len, ec) == 0) - { - if (connect_error) - { - ec = asio::error_code(connect_error, - asio::error::get_system_category()); - } - else - ec = asio::error_code(); - } - - return true; -} - -int socketpair(int af, int type, int protocol, - socket_type sv[2], asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - (void)(af); - (void)(type); - (void)(protocol); - (void)(sv); - ec = asio::error::operation_not_supported; - return socket_error_retval; -#else - clear_last_error(); - int result = error_wrapper(::socketpair(af, type, protocol, sv), ec); - if (result == 0) - ec = asio::error_code(); - return result; -#endif -} - -bool sockatmark(socket_type s, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return false; - } - -#if defined(SIOCATMARK) - ioctl_arg_type value = 0; -# if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - int result = error_wrapper(::ioctlsocket(s, SIOCATMARK, &value), ec); -# else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - int result = error_wrapper(::ioctl(s, SIOCATMARK, &value), ec); -# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - if (result == 0) - ec = asio::error_code(); -# if defined(ENOTTY) - if (ec.value() == ENOTTY) - ec = asio::error::not_socket; -# endif // defined(ENOTTY) -#else // defined(SIOCATMARK) - int value = error_wrapper(::sockatmark(s), ec); - if (value != -1) - ec = asio::error_code(); -#endif // defined(SIOCATMARK) - - return ec ? false : value != 0; -} - -size_t available(socket_type s, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return 0; - } - - ioctl_arg_type value = 0; -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - int result = error_wrapper(::ioctlsocket(s, FIONREAD, &value), ec); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - int result = error_wrapper(::ioctl(s, FIONREAD, &value), ec); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - if (result == 0) - ec = asio::error_code(); -#if defined(ENOTTY) - if (ec.value() == ENOTTY) - ec = asio::error::not_socket; -#endif // defined(ENOTTY) - - return ec ? static_cast(0) : static_cast(value); -} - -int listen(socket_type s, int backlog, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - clear_last_error(); - int result = error_wrapper(::listen(s, backlog), ec); - if (result == 0) - ec = asio::error_code(); - return result; -} - -inline void init_buf_iov_base(void*& base, void* addr) -{ - base = addr; -} - -template -inline void init_buf_iov_base(T& base, void* addr) -{ - base = static_cast(addr); -} - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -typedef WSABUF buf; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -typedef iovec buf; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -void init_buf(buf& b, void* data, size_t size) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - b.buf = static_cast(data); - b.len = static_cast(size); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - init_buf_iov_base(b.iov_base, data); - b.iov_len = size; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -void init_buf(buf& b, const void* data, size_t size) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - b.buf = static_cast(const_cast(data)); - b.len = static_cast(size); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - init_buf_iov_base(b.iov_base, const_cast(data)); - b.iov_len = size; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -inline void init_msghdr_msg_name(void*& name, socket_addr_type* addr) -{ - name = addr; -} - -inline void init_msghdr_msg_name(void*& name, const socket_addr_type* addr) -{ - name = const_cast(addr); -} - -template -inline void init_msghdr_msg_name(T& name, socket_addr_type* addr) -{ - name = reinterpret_cast(addr); -} - -template -inline void init_msghdr_msg_name(T& name, const socket_addr_type* addr) -{ - name = reinterpret_cast(const_cast(addr)); -} - -signed_size_type recv(socket_type s, buf* bufs, size_t count, - int flags, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Receive some data. - DWORD recv_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = error_wrapper(::WSARecv(s, bufs, - recv_buf_count, &bytes_transferred, &recv_flags, 0, 0), ec); - if (ec.value() == ERROR_NETNAME_DELETED) - ec = asio::error::connection_reset; - else if (ec.value() == ERROR_PORT_UNREACHABLE) - ec = asio::error::connection_refused; - else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) - ec.assign(0, ec.category()); - if (result != 0) - return socket_error_retval; - ec = asio::error_code(); - return bytes_transferred; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - msghdr msg = msghdr(); - msg.msg_iov = bufs; - msg.msg_iovlen = static_cast(count); - signed_size_type result = error_wrapper(::recvmsg(s, &msg, flags), ec); - if (result >= 0) - ec = asio::error_code(); - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -size_t sync_recv(socket_type s, state_type state, buf* bufs, - size_t count, int flags, bool all_empty, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // A request to read 0 bytes on a stream is a no-op. - if (all_empty && (state & stream_oriented)) - { - ec = asio::error_code(); - return 0; - } - - // Read some data. - for (;;) - { - // Try to complete the operation without blocking. - signed_size_type bytes = socket_ops::recv(s, bufs, count, flags, ec); - - // Check if operation succeeded. - if (bytes > 0) - return bytes; - - // Check for EOF. - if ((state & stream_oriented) && bytes == 0) - { - ec = asio::error::eof; - return 0; - } - - // Operation failed. - if ((state & user_set_non_blocking) - || (ec != asio::error::would_block - && ec != asio::error::try_again)) - return 0; - - // Wait for socket to become ready. - if (socket_ops::poll_read(s, 0, -1, ec) < 0) - return 0; - } -} - -#if defined(ASIO_HAS_IOCP) - -void complete_iocp_recv(state_type state, - const weak_cancel_token_type& cancel_token, bool all_empty, - asio::error_code& ec, size_t bytes_transferred) -{ - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_NETNAME_DELETED) - { - if (cancel_token.expired()) - ec = asio::error::operation_aborted; - else - ec = asio::error::connection_reset; - } - else if (ec.value() == ERROR_PORT_UNREACHABLE) - { - ec = asio::error::connection_refused; - } - else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) - { - ec.assign(0, ec.category()); - } - - // Check for connection closed. - else if (!ec && bytes_transferred == 0 - && (state & stream_oriented) != 0 - && !all_empty) - { - ec = asio::error::eof; - } -} - -#else // defined(ASIO_HAS_IOCP) - -bool non_blocking_recv(socket_type s, - buf* bufs, size_t count, int flags, bool is_stream, - asio::error_code& ec, size_t& bytes_transferred) -{ - for (;;) - { - // Read some data. - signed_size_type bytes = socket_ops::recv(s, bufs, count, flags, ec); - - // Check for end of stream. - if (is_stream && bytes == 0) - { - ec = asio::error::eof; - return true; - } - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Check if we need to run the operation again. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - return false; - - // Operation is complete. - if (bytes >= 0) - { - ec = asio::error_code(); - bytes_transferred = bytes; - } - else - bytes_transferred = 0; - - return true; - } -} - -#endif // defined(ASIO_HAS_IOCP) - -signed_size_type recvfrom(socket_type s, buf* bufs, size_t count, - int flags, socket_addr_type* addr, std::size_t* addrlen, - asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Receive some data. - DWORD recv_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int tmp_addrlen = (int)*addrlen; - int result = error_wrapper(::WSARecvFrom(s, bufs, recv_buf_count, - &bytes_transferred, &recv_flags, addr, &tmp_addrlen, 0, 0), ec); - *addrlen = (std::size_t)tmp_addrlen; - if (ec.value() == ERROR_NETNAME_DELETED) - ec = asio::error::connection_reset; - else if (ec.value() == ERROR_PORT_UNREACHABLE) - ec = asio::error::connection_refused; - else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) - ec.assign(0, ec.category()); - if (result != 0) - return socket_error_retval; - ec = asio::error_code(); - return bytes_transferred; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - msghdr msg = msghdr(); - init_msghdr_msg_name(msg.msg_name, addr); - msg.msg_namelen = static_cast(*addrlen); - msg.msg_iov = bufs; - msg.msg_iovlen = static_cast(count); - signed_size_type result = error_wrapper(::recvmsg(s, &msg, flags), ec); - *addrlen = msg.msg_namelen; - if (result >= 0) - ec = asio::error_code(); - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -size_t sync_recvfrom(socket_type s, state_type state, buf* bufs, - size_t count, int flags, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // Read some data. - for (;;) - { - // Try to complete the operation without blocking. - signed_size_type bytes = socket_ops::recvfrom( - s, bufs, count, flags, addr, addrlen, ec); - - // Check if operation succeeded. - if (bytes >= 0) - return bytes; - - // Operation failed. - if ((state & user_set_non_blocking) - || (ec != asio::error::would_block - && ec != asio::error::try_again)) - return 0; - - // Wait for socket to become ready. - if (socket_ops::poll_read(s, 0, -1, ec) < 0) - return 0; - } -} - -#if defined(ASIO_HAS_IOCP) - -void complete_iocp_recvfrom( - const weak_cancel_token_type& cancel_token, - asio::error_code& ec) -{ - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_NETNAME_DELETED) - { - if (cancel_token.expired()) - ec = asio::error::operation_aborted; - else - ec = asio::error::connection_reset; - } - else if (ec.value() == ERROR_PORT_UNREACHABLE) - { - ec = asio::error::connection_refused; - } - else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) - { - ec.assign(0, ec.category()); - } -} - -#else // defined(ASIO_HAS_IOCP) - -bool non_blocking_recvfrom(socket_type s, - buf* bufs, size_t count, int flags, - socket_addr_type* addr, std::size_t* addrlen, - asio::error_code& ec, size_t& bytes_transferred) -{ - for (;;) - { - // Read some data. - signed_size_type bytes = socket_ops::recvfrom( - s, bufs, count, flags, addr, addrlen, ec); - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Check if we need to run the operation again. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - return false; - - // Operation is complete. - if (bytes >= 0) - { - ec = asio::error_code(); - bytes_transferred = bytes; - } - else - bytes_transferred = 0; - - return true; - } -} - -#endif // defined(ASIO_HAS_IOCP) - -signed_size_type recvmsg(socket_type s, buf* bufs, size_t count, - int in_flags, int& out_flags, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - out_flags = 0; - return socket_ops::recv(s, bufs, count, in_flags, ec); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - msghdr msg = msghdr(); - msg.msg_iov = bufs; - msg.msg_iovlen = static_cast(count); - signed_size_type result = error_wrapper(::recvmsg(s, &msg, in_flags), ec); - if (result >= 0) - { - ec = asio::error_code(); - out_flags = msg.msg_flags; - } - else - out_flags = 0; - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -size_t sync_recvmsg(socket_type s, state_type state, - buf* bufs, size_t count, int in_flags, int& out_flags, - asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // Read some data. - for (;;) - { - // Try to complete the operation without blocking. - signed_size_type bytes = socket_ops::recvmsg( - s, bufs, count, in_flags, out_flags, ec); - - // Check if operation succeeded. - if (bytes >= 0) - return bytes; - - // Operation failed. - if ((state & user_set_non_blocking) - || (ec != asio::error::would_block - && ec != asio::error::try_again)) - return 0; - - // Wait for socket to become ready. - if (socket_ops::poll_read(s, 0, -1, ec) < 0) - return 0; - } -} - -#if defined(ASIO_HAS_IOCP) - -void complete_iocp_recvmsg( - const weak_cancel_token_type& cancel_token, - asio::error_code& ec) -{ - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_NETNAME_DELETED) - { - if (cancel_token.expired()) - ec = asio::error::operation_aborted; - else - ec = asio::error::connection_reset; - } - else if (ec.value() == ERROR_PORT_UNREACHABLE) - { - ec = asio::error::connection_refused; - } - else if (ec.value() == WSAEMSGSIZE || ec.value() == ERROR_MORE_DATA) - { - ec.assign(0, ec.category()); - } -} - -#else // defined(ASIO_HAS_IOCP) - -bool non_blocking_recvmsg(socket_type s, - buf* bufs, size_t count, int in_flags, int& out_flags, - asio::error_code& ec, size_t& bytes_transferred) -{ - for (;;) - { - // Read some data. - signed_size_type bytes = socket_ops::recvmsg( - s, bufs, count, in_flags, out_flags, ec); - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Check if we need to run the operation again. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - return false; - - // Operation is complete. - if (bytes >= 0) - { - ec = asio::error_code(); - bytes_transferred = bytes; - } - else - bytes_transferred = 0; - - return true; - } -} - -#endif // defined(ASIO_HAS_IOCP) - -signed_size_type send(socket_type s, const buf* bufs, size_t count, - int flags, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Send the data. - DWORD send_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - DWORD send_flags = flags; - int result = error_wrapper(::WSASend(s, const_cast(bufs), - send_buf_count, &bytes_transferred, send_flags, 0, 0), ec); - if (ec.value() == ERROR_NETNAME_DELETED) - ec = asio::error::connection_reset; - else if (ec.value() == ERROR_PORT_UNREACHABLE) - ec = asio::error::connection_refused; - if (result != 0) - return socket_error_retval; - ec = asio::error_code(); - return bytes_transferred; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - msghdr msg = msghdr(); - msg.msg_iov = const_cast(bufs); - msg.msg_iovlen = static_cast(count); -#if defined(__linux__) - flags |= MSG_NOSIGNAL; -#endif // defined(__linux__) - signed_size_type result = error_wrapper(::sendmsg(s, &msg, flags), ec); - if (result >= 0) - ec = asio::error_code(); - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -size_t sync_send(socket_type s, state_type state, const buf* bufs, - size_t count, int flags, bool all_empty, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // A request to write 0 bytes to a stream is a no-op. - if (all_empty && (state & stream_oriented)) - { - ec = asio::error_code(); - return 0; - } - - // Read some data. - for (;;) - { - // Try to complete the operation without blocking. - signed_size_type bytes = socket_ops::send(s, bufs, count, flags, ec); - - // Check if operation succeeded. - if (bytes >= 0) - return bytes; - - // Operation failed. - if ((state & user_set_non_blocking) - || (ec != asio::error::would_block - && ec != asio::error::try_again)) - return 0; - - // Wait for socket to become ready. - if (socket_ops::poll_write(s, 0, -1, ec) < 0) - return 0; - } -} - -#if defined(ASIO_HAS_IOCP) - -void complete_iocp_send( - const weak_cancel_token_type& cancel_token, - asio::error_code& ec) -{ - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_NETNAME_DELETED) - { - if (cancel_token.expired()) - ec = asio::error::operation_aborted; - else - ec = asio::error::connection_reset; - } - else if (ec.value() == ERROR_PORT_UNREACHABLE) - { - ec = asio::error::connection_refused; - } -} - -#else // defined(ASIO_HAS_IOCP) - -bool non_blocking_send(socket_type s, - const buf* bufs, size_t count, int flags, - asio::error_code& ec, size_t& bytes_transferred) -{ - for (;;) - { - // Write some data. - signed_size_type bytes = socket_ops::send(s, bufs, count, flags, ec); - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Check if we need to run the operation again. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - return false; - - // Operation is complete. - if (bytes >= 0) - { - ec = asio::error_code(); - bytes_transferred = bytes; - } - else - bytes_transferred = 0; - - return true; - } -} - -#endif // defined(ASIO_HAS_IOCP) - -signed_size_type sendto(socket_type s, const buf* bufs, size_t count, - int flags, const socket_addr_type* addr, std::size_t addrlen, - asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - // Send the data. - DWORD send_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - int result = error_wrapper(::WSASendTo(s, const_cast(bufs), - send_buf_count, &bytes_transferred, flags, addr, - static_cast(addrlen), 0, 0), ec); - if (ec.value() == ERROR_NETNAME_DELETED) - ec = asio::error::connection_reset; - else if (ec.value() == ERROR_PORT_UNREACHABLE) - ec = asio::error::connection_refused; - if (result != 0) - return socket_error_retval; - ec = asio::error_code(); - return bytes_transferred; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - msghdr msg = msghdr(); - init_msghdr_msg_name(msg.msg_name, addr); - msg.msg_namelen = static_cast(addrlen); - msg.msg_iov = const_cast(bufs); - msg.msg_iovlen = static_cast(count); -#if defined(__linux__) - flags |= MSG_NOSIGNAL; -#endif // defined(__linux__) - signed_size_type result = error_wrapper(::sendmsg(s, &msg, flags), ec); - if (result >= 0) - ec = asio::error_code(); - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -size_t sync_sendto(socket_type s, state_type state, const buf* bufs, - size_t count, int flags, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // Write some data. - for (;;) - { - // Try to complete the operation without blocking. - signed_size_type bytes = socket_ops::sendto( - s, bufs, count, flags, addr, addrlen, ec); - - // Check if operation succeeded. - if (bytes >= 0) - return bytes; - - // Operation failed. - if ((state & user_set_non_blocking) - || (ec != asio::error::would_block - && ec != asio::error::try_again)) - return 0; - - // Wait for socket to become ready. - if (socket_ops::poll_write(s, 0, -1, ec) < 0) - return 0; - } -} - -#if !defined(ASIO_HAS_IOCP) - -bool non_blocking_sendto(socket_type s, - const buf* bufs, size_t count, int flags, - const socket_addr_type* addr, std::size_t addrlen, - asio::error_code& ec, size_t& bytes_transferred) -{ - for (;;) - { - // Write some data. - signed_size_type bytes = socket_ops::sendto( - s, bufs, count, flags, addr, addrlen, ec); - - // Retry operation if interrupted by signal. - if (ec == asio::error::interrupted) - continue; - - // Check if we need to run the operation again. - if (ec == asio::error::would_block - || ec == asio::error::try_again) - return false; - - // Operation is complete. - if (bytes >= 0) - { - ec = asio::error_code(); - bytes_transferred = bytes; - } - else - bytes_transferred = 0; - - return true; - } -} - -#endif // !defined(ASIO_HAS_IOCP) - -socket_type socket(int af, int type, int protocol, - asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - socket_type s = error_wrapper(::WSASocketW(af, type, protocol, 0, 0, - WSA_FLAG_OVERLAPPED), ec); - if (s == invalid_socket) - return s; - - if (af == ASIO_OS_DEF(AF_INET6)) - { - // Try to enable the POSIX default behaviour of having IPV6_V6ONLY set to - // false. This will only succeed on Windows Vista and later versions of - // Windows, where a dual-stack IPv4/v6 implementation is available. - DWORD optval = 0; - ::setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, - reinterpret_cast(&optval), sizeof(optval)); - } - - ec = asio::error_code(); - - return s; -#elif defined(__MACH__) && defined(__APPLE__) || defined(__FreeBSD__) - socket_type s = error_wrapper(::socket(af, type, protocol), ec); - if (s == invalid_socket) - return s; - - int optval = 1; - int result = error_wrapper(::setsockopt(s, - SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)), ec); - if (result != 0) - { - ::close(s); - return invalid_socket; - } - - return s; -#else - int s = error_wrapper(::socket(af, type, protocol), ec); - if (s >= 0) - ec = asio::error_code(); - return s; -#endif -} - -template -inline int call_setsockopt(SockLenType msghdr::*, - socket_type s, int level, int optname, - const void* optval, std::size_t optlen) -{ - return ::setsockopt(s, level, optname, - (const char*)optval, (SockLenType)optlen); -} - -int setsockopt(socket_type s, state_type& state, int level, int optname, - const void* optval, std::size_t optlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - if (level == custom_socket_option_level && optname == always_fail_option) - { - ec = asio::error::invalid_argument; - return socket_error_retval; - } - - if (level == custom_socket_option_level - && optname == enable_connection_aborted_option) - { - if (optlen != sizeof(int)) - { - ec = asio::error::invalid_argument; - return socket_error_retval; - } - - if (*static_cast(optval)) - state |= enable_connection_aborted; - else - state &= ~enable_connection_aborted; - ec = asio::error_code(); - return 0; - } - - if (level == SOL_SOCKET && optname == SO_LINGER) - state |= user_set_linger; - -#if defined(__BORLANDC__) - // Mysteriously, using the getsockopt and setsockopt functions directly with - // Borland C++ results in incorrect values being set and read. The bug can be - // worked around by using function addresses resolved with GetProcAddress. - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - typedef int (WSAAPI *sso_t)(SOCKET, int, int, const char*, int); - if (sso_t sso = (sso_t)::GetProcAddress(winsock_module, "setsockopt")) - { - clear_last_error(); - return error_wrapper(sso(s, level, optname, - reinterpret_cast(optval), - static_cast(optlen)), ec); - } - } - ec = asio::error::fault; - return socket_error_retval; -#else // defined(__BORLANDC__) - clear_last_error(); - int result = error_wrapper(call_setsockopt(&msghdr::msg_namelen, - s, level, optname, optval, optlen), ec); - if (result == 0) - { - ec = asio::error_code(); - -#if defined(__MACH__) && defined(__APPLE__) \ - || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) - // To implement portable behaviour for SO_REUSEADDR with UDP sockets we - // need to also set SO_REUSEPORT on BSD-based platforms. - if ((state & datagram_oriented) - && level == SOL_SOCKET && optname == SO_REUSEADDR) - { - call_setsockopt(&msghdr::msg_namelen, s, - SOL_SOCKET, SO_REUSEPORT, optval, optlen); - } -#endif - } - - return result; -#endif // defined(__BORLANDC__) -} - -template -inline int call_getsockopt(SockLenType msghdr::*, - socket_type s, int level, int optname, - void* optval, std::size_t* optlen) -{ - SockLenType tmp_optlen = (SockLenType)*optlen; - int result = ::getsockopt(s, level, optname, (char*)optval, &tmp_optlen); - *optlen = (std::size_t)tmp_optlen; - return result; -} - -int getsockopt(socket_type s, state_type state, int level, int optname, - void* optval, size_t* optlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - if (level == custom_socket_option_level && optname == always_fail_option) - { - ec = asio::error::invalid_argument; - return socket_error_retval; - } - - if (level == custom_socket_option_level - && optname == enable_connection_aborted_option) - { - if (*optlen != sizeof(int)) - { - ec = asio::error::invalid_argument; - return socket_error_retval; - } - - *static_cast(optval) = (state & enable_connection_aborted) ? 1 : 0; - ec = asio::error_code(); - return 0; - } - -#if defined(__BORLANDC__) - // Mysteriously, using the getsockopt and setsockopt functions directly with - // Borland C++ results in incorrect values being set and read. The bug can be - // worked around by using function addresses resolved with GetProcAddress. - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - typedef int (WSAAPI *gso_t)(SOCKET, int, int, char*, int*); - if (gso_t gso = (gso_t)::GetProcAddress(winsock_module, "getsockopt")) - { - clear_last_error(); - int tmp_optlen = static_cast(*optlen); - int result = error_wrapper(gso(s, level, optname, - reinterpret_cast(optval), &tmp_optlen), ec); - *optlen = static_cast(tmp_optlen); - if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY - && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD)) - { - // Dual-stack IPv4/v6 sockets, and the IPV6_V6ONLY socket option, are - // only supported on Windows Vista and later. To simplify program logic - // we will fake success of getting this option and specify that the - // value is non-zero (i.e. true). This corresponds to the behavior of - // IPv6 sockets on Windows platforms pre-Vista. - *static_cast(optval) = 1; - ec = asio::error_code(); - } - return result; - } - } - ec = asio::error::fault; - return socket_error_retval; -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) - clear_last_error(); - int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen, - s, level, optname, optval, optlen), ec); - if (result != 0 && level == IPPROTO_IPV6 && optname == IPV6_V6ONLY - && ec.value() == WSAENOPROTOOPT && *optlen == sizeof(DWORD)) - { - // Dual-stack IPv4/v6 sockets, and the IPV6_V6ONLY socket option, are only - // supported on Windows Vista and later. To simplify program logic we will - // fake success of getting this option and specify that the value is - // non-zero (i.e. true). This corresponds to the behavior of IPv6 sockets - // on Windows platforms pre-Vista. - *static_cast(optval) = 1; - ec = asio::error_code(); - } - if (result == 0) - ec = asio::error_code(); - return result; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - clear_last_error(); - int result = error_wrapper(call_getsockopt(&msghdr::msg_namelen, - s, level, optname, optval, optlen), ec); -#if defined(__linux__) - if (result == 0 && level == SOL_SOCKET && *optlen == sizeof(int) - && (optname == SO_SNDBUF || optname == SO_RCVBUF)) - { - // On Linux, setting SO_SNDBUF or SO_RCVBUF to N actually causes the kernel - // to set the buffer size to N*2. Linux puts additional stuff into the - // buffers so that only about half is actually available to the application. - // The retrieved value is divided by 2 here to make it appear as though the - // correct value has been set. - *static_cast(optval) /= 2; - } -#endif // defined(__linux__) - if (result == 0) - ec = asio::error_code(); - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -template -inline int call_getpeername(SockLenType msghdr::*, - socket_type s, socket_addr_type* addr, std::size_t* addrlen) -{ - SockLenType tmp_addrlen = (SockLenType)*addrlen; - int result = ::getpeername(s, addr, &tmp_addrlen); - *addrlen = (std::size_t)tmp_addrlen; - return result; -} - -int getpeername(socket_type s, socket_addr_type* addr, - std::size_t* addrlen, bool cached, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - -#if defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP) \ - || defined(__CYGWIN__) - if (cached) - { - // Check if socket is still connected. - DWORD connect_time = 0; - size_t connect_time_len = sizeof(connect_time); - if (socket_ops::getsockopt(s, 0, SOL_SOCKET, SO_CONNECT_TIME, - &connect_time, &connect_time_len, ec) == socket_error_retval) - { - return socket_error_retval; - } - if (connect_time == 0xFFFFFFFF) - { - ec = asio::error::not_connected; - return socket_error_retval; - } - - // The cached value is still valid. - ec = asio::error_code(); - return 0; - } -#else // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP) - // || defined(__CYGWIN__) - (void)cached; -#endif // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP) - // || defined(__CYGWIN__) - - clear_last_error(); - int result = error_wrapper(call_getpeername( - &msghdr::msg_namelen, s, addr, addrlen), ec); - if (result == 0) - ec = asio::error_code(); - return result; -} - -template -inline int call_getsockname(SockLenType msghdr::*, - socket_type s, socket_addr_type* addr, std::size_t* addrlen) -{ - SockLenType tmp_addrlen = (SockLenType)*addrlen; - int result = ::getsockname(s, addr, &tmp_addrlen); - *addrlen = (std::size_t)tmp_addrlen; - return result; -} - -int getsockname(socket_type s, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - clear_last_error(); - int result = error_wrapper(call_getsockname( - &msghdr::msg_namelen, s, addr, addrlen), ec); - if (result == 0) - ec = asio::error_code(); - return result; -} - -int ioctl(socket_type s, state_type& state, int cmd, - ioctl_arg_type* arg, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - int result = error_wrapper(::ioctlsocket(s, cmd, arg), ec); -#elif defined(__MACH__) && defined(__APPLE__) \ - || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) - int result = error_wrapper(::ioctl(s, - static_cast(cmd), arg), ec); -#else - int result = error_wrapper(::ioctl(s, cmd, arg), ec); -#endif - if (result >= 0) - { - ec = asio::error_code(); - - // When updating the non-blocking mode we always perform the ioctl syscall, - // even if the flags would otherwise indicate that the socket is already in - // the correct state. This ensures that the underlying socket is put into - // the state that has been requested by the user. If the ioctl syscall was - // successful then we need to update the flags to match. - if (cmd == static_cast(FIONBIO)) - { - if (*arg) - { - state |= user_set_non_blocking; - } - else - { - // Clearing the non-blocking mode always overrides any internally-set - // non-blocking flag. Any subsequent asynchronous operations will need - // to re-enable non-blocking I/O. - state &= ~(user_set_non_blocking | internal_non_blocking); - } - } - } - - return result; -} - -int select(int nfds, fd_set* readfds, fd_set* writefds, - fd_set* exceptfds, timeval* timeout, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - if (!readfds && !writefds && !exceptfds && timeout) - { - DWORD milliseconds = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; - if (milliseconds == 0) - milliseconds = 1; // Force context switch. - ::Sleep(milliseconds); - ec = asio::error_code(); - return 0; - } - - // The select() call allows timeout values measured in microseconds, but the - // system clock (as wrapped by boost::posix_time::microsec_clock) typically - // has a resolution of 10 milliseconds. This can lead to a spinning select - // reactor, meaning increased CPU usage, when waiting for the earliest - // scheduled timeout if it's less than 10 milliseconds away. To avoid a tight - // spin we'll use a minimum timeout of 1 millisecond. - if (timeout && timeout->tv_sec == 0 - && timeout->tv_usec > 0 && timeout->tv_usec < 1000) - timeout->tv_usec = 1000; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#if defined(__hpux) && defined(__SELECT) - timespec ts; - ts.tv_sec = timeout ? timeout->tv_sec : 0; - ts.tv_nsec = timeout ? timeout->tv_usec * 1000 : 0; - return error_wrapper(::pselect(nfds, readfds, - writefds, exceptfds, timeout ? &ts : 0, 0), ec); -#else - int result = error_wrapper(::select(nfds, readfds, - writefds, exceptfds, timeout), ec); - if (result >= 0) - ec = asio::error_code(); - return result; -#endif -} - -int poll_read(socket_type s, state_type state, - int msec, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - fd_set fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - timeval timeout_obj; - timeval* timeout; - if (state & user_set_non_blocking) - { - timeout_obj.tv_sec = 0; - timeout_obj.tv_usec = 0; - timeout = &timeout_obj; - } - else if (msec >= 0) - { - timeout_obj.tv_sec = msec / 1000; - timeout_obj.tv_usec = (msec % 1000) * 1000; - timeout = &timeout_obj; - } - else - timeout = 0; - clear_last_error(); - int result = error_wrapper(::select(s + 1, &fds, 0, 0, timeout), ec); -#else // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - pollfd fds; - fds.fd = s; - fds.events = POLLIN; - fds.revents = 0; - int timeout = (state & user_set_non_blocking) ? 0 : msec; - clear_last_error(); - int result = error_wrapper(::poll(&fds, 1, timeout), ec); -#endif // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - if (result == 0) - ec = (state & user_set_non_blocking) - ? asio::error::would_block : asio::error_code(); - else if (result > 0) - ec = asio::error_code(); - return result; -} - -int poll_write(socket_type s, state_type state, - int msec, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - fd_set fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - timeval timeout_obj; - timeval* timeout; - if (state & user_set_non_blocking) - { - timeout_obj.tv_sec = 0; - timeout_obj.tv_usec = 0; - timeout = &timeout_obj; - } - else if (msec >= 0) - { - timeout_obj.tv_sec = msec / 1000; - timeout_obj.tv_usec = (msec % 1000) * 1000; - timeout = &timeout_obj; - } - else - timeout = 0; - clear_last_error(); - int result = error_wrapper(::select(s + 1, 0, &fds, 0, timeout), ec); -#else // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - pollfd fds; - fds.fd = s; - fds.events = POLLOUT; - fds.revents = 0; - int timeout = (state & user_set_non_blocking) ? 0 : msec; - clear_last_error(); - int result = error_wrapper(::poll(&fds, 1, timeout), ec); -#endif // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - if (result == 0) - ec = (state & user_set_non_blocking) - ? asio::error::would_block : asio::error_code(); - else if (result > 0) - ec = asio::error_code(); - return result; -} - -int poll_error(socket_type s, state_type state, - int msec, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - fd_set fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - timeval timeout_obj; - timeval* timeout; - if (state & user_set_non_blocking) - { - timeout_obj.tv_sec = 0; - timeout_obj.tv_usec = 0; - timeout = &timeout_obj; - } - else if (msec >= 0) - { - timeout_obj.tv_sec = msec / 1000; - timeout_obj.tv_usec = (msec % 1000) * 1000; - timeout = &timeout_obj; - } - else - timeout = 0; - clear_last_error(); - int result = error_wrapper(::select(s + 1, 0, 0, &fds, timeout), ec); -#else // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - pollfd fds; - fds.fd = s; - fds.events = POLLPRI | POLLERR | POLLHUP; - fds.revents = 0; - int timeout = (state & user_set_non_blocking) ? 0 : msec; - clear_last_error(); - int result = error_wrapper(::poll(&fds, 1, timeout), ec); -#endif // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - if (result == 0) - ec = (state & user_set_non_blocking) - ? asio::error::would_block : asio::error_code(); - else if (result > 0) - ec = asio::error_code(); - return result; -} - -int poll_connect(socket_type s, int msec, asio::error_code& ec) -{ - if (s == invalid_socket) - { - ec = asio::error::bad_descriptor; - return socket_error_retval; - } - -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - fd_set write_fds; - FD_ZERO(&write_fds); - FD_SET(s, &write_fds); - fd_set except_fds; - FD_ZERO(&except_fds); - FD_SET(s, &except_fds); - timeval timeout_obj; - timeval* timeout; - if (msec >= 0) - { - timeout_obj.tv_sec = msec / 1000; - timeout_obj.tv_usec = (msec % 1000) * 1000; - timeout = &timeout_obj; - } - else - timeout = 0; - clear_last_error(); - int result = error_wrapper(::select( - s + 1, 0, &write_fds, &except_fds, timeout), ec); - if (result >= 0) - ec = asio::error_code(); - return result; -#else // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - pollfd fds; - fds.fd = s; - fds.events = POLLOUT; - fds.revents = 0; - clear_last_error(); - int result = error_wrapper(::poll(&fds, 1, msec), ec); - if (result >= 0) - ec = asio::error_code(); - return result; -#endif // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) -} - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -const char* inet_ntop(int af, const void* src, char* dest, size_t length, - unsigned long scope_id, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS_RUNTIME) - using namespace std; // For sprintf. - const unsigned char* bytes = static_cast(src); - if (af == ASIO_OS_DEF(AF_INET)) - { - sprintf_s(dest, length, "%u.%u.%u.%u", - bytes[0], bytes[1], bytes[2], bytes[3]); - return dest; - } - else if (af == ASIO_OS_DEF(AF_INET6)) - { - size_t n = 0, b = 0, z = 0; - while (n < length && b < 16) - { - if (bytes[b] == 0 && bytes[b + 1] == 0 && z == 0) - { - do b += 2; while (b < 16 && bytes[b] == 0 && bytes[b + 1] == 0); - n += sprintf_s(dest + n, length - n, ":%s", b < 16 ? "" : ":"), ++z; - } - else - { - n += sprintf_s(dest + n, length - n, "%s%x", b ? ":" : "", - (static_cast(bytes[b]) << 8) | bytes[b + 1]); - b += 2; - } - } - if (scope_id) - n += sprintf_s(dest + n, length - n, "%%%lu", scope_id); - return dest; - } - else - { - ec = asio::error::address_family_not_supported; - return 0; - } -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) - using namespace std; // For memcpy. - - if (af != ASIO_OS_DEF(AF_INET) && af != ASIO_OS_DEF(AF_INET6)) - { - ec = asio::error::address_family_not_supported; - return 0; - } - - union - { - socket_addr_type base; - sockaddr_storage_type storage; - sockaddr_in4_type v4; - sockaddr_in6_type v6; - } address; - DWORD address_length; - if (af == ASIO_OS_DEF(AF_INET)) - { - address_length = sizeof(sockaddr_in4_type); - address.v4.sin_family = ASIO_OS_DEF(AF_INET); - address.v4.sin_port = 0; - memcpy(&address.v4.sin_addr, src, sizeof(in4_addr_type)); - } - else // AF_INET6 - { - address_length = sizeof(sockaddr_in6_type); - address.v6.sin6_family = ASIO_OS_DEF(AF_INET6); - address.v6.sin6_port = 0; - address.v6.sin6_flowinfo = 0; - address.v6.sin6_scope_id = scope_id; - memcpy(&address.v6.sin6_addr, src, sizeof(in6_addr_type)); - } - - DWORD string_length = static_cast(length); -#if defined(BOOST_NO_ANSI_APIS) || (defined(_MSC_VER) && (_MSC_VER >= 1800)) - LPWSTR string_buffer = (LPWSTR)_alloca(length * sizeof(WCHAR)); - int result = error_wrapper(::WSAAddressToStringW(&address.base, - address_length, 0, string_buffer, &string_length), ec); - ::WideCharToMultiByte(CP_ACP, 0, string_buffer, -1, - dest, static_cast(length), 0, 0); -#else - int result = error_wrapper(::WSAAddressToStringA( - &address.base, address_length, 0, dest, &string_length), ec); -#endif - - // Windows may set error code on success. - if (result != socket_error_retval) - ec = asio::error_code(); - - // Windows may not set an error code on failure. - else if (result == socket_error_retval && !ec) - ec = asio::error::invalid_argument; - - return result == socket_error_retval ? 0 : dest; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - const char* result = error_wrapper(::inet_ntop( - af, src, dest, static_cast(length)), ec); - if (result == 0 && !ec) - ec = asio::error::invalid_argument; - if (result != 0 && af == ASIO_OS_DEF(AF_INET6) && scope_id != 0) - { - using namespace std; // For strcat and sprintf. - char if_name[IF_NAMESIZE + 1] = "%"; - const in6_addr_type* ipv6_address = static_cast(src); - bool is_link_local = ((ipv6_address->s6_addr[0] == 0xfe) - && ((ipv6_address->s6_addr[1] & 0xc0) == 0x80)); - bool is_multicast_link_local = ((ipv6_address->s6_addr[0] == 0xff) - && ((ipv6_address->s6_addr[1] & 0x0f) == 0x02)); - if ((!is_link_local && !is_multicast_link_local) - || if_indextoname(static_cast(scope_id), if_name + 1) == 0) - sprintf(if_name + 1, "%lu", scope_id); - strcat(dest, if_name); - } - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -int inet_pton(int af, const char* src, void* dest, - unsigned long* scope_id, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS_RUNTIME) - using namespace std; // For sscanf. - unsigned char* bytes = static_cast(dest); - if (af == ASIO_OS_DEF(AF_INET)) - { - unsigned int b0, b1, b2, b3; - if (sscanf_s(src, "%u.%u.%u.%u", &b0, &b1, &b2, &b3) != 4) - { - ec = asio::error::invalid_argument; - return -1; - } - if (b0 > 255 || b1 > 255 || b2 > 255 || b3 > 255) - { - ec = asio::error::invalid_argument; - return -1; - } - bytes[0] = static_cast(b0); - bytes[1] = static_cast(b1); - bytes[2] = static_cast(b2); - bytes[3] = static_cast(b3); - ec = asio::error_code(); - return 1; - } - else if (af == ASIO_OS_DEF(AF_INET6)) - { - unsigned char* bytes = static_cast(dest); - std::memset(bytes, 0, 16); - unsigned char back_bytes[16] = { 0 }; - int num_front_bytes = 0, num_back_bytes = 0; - const char* p = src; - - enum { fword, fcolon, bword, scope, done } state = fword; - unsigned long current_word = 0; - while (state != done) - { - if (current_word > 0xFFFF) - { - ec = asio::error::invalid_argument; - return -1; - } - - switch (state) - { - case fword: - if (*p >= '0' && *p <= '9') - current_word = current_word * 16 + *p++ - '0'; - else if (*p >= 'a' && *p <= 'f') - current_word = current_word * 16 + *p++ - 'a' + 10; - else if (*p >= 'A' && *p <= 'F') - current_word = current_word * 16 + *p++ - 'A' + 10; - else - { - if (num_front_bytes == 16) - { - ec = asio::error::invalid_argument; - return -1; - } - - bytes[num_front_bytes++] = (current_word >> 8) & 0xFF; - bytes[num_front_bytes++] = current_word & 0xFF; - current_word = 0; - - if (*p == ':') - state = fcolon, ++p; - else if (*p == '%') - state = scope, ++p; - else if (*p == 0) - state = done; - else - { - ec = asio::error::invalid_argument; - return -1; - } - } - break; - - case fcolon: - if (*p == ':') - state = bword, ++p; - else - state = fword; - break; - - case bword: - if (*p >= '0' && *p <= '9') - current_word = current_word * 16 + *p++ - '0'; - else if (*p >= 'a' && *p <= 'f') - current_word = current_word * 16 + *p++ - 'a' + 10; - else if (*p >= 'A' && *p <= 'F') - current_word = current_word * 16 + *p++ - 'A' + 10; - else - { - if (num_front_bytes + num_back_bytes == 16) - { - ec = asio::error::invalid_argument; - return -1; - } - - back_bytes[num_back_bytes++] = (current_word >> 8) & 0xFF; - back_bytes[num_back_bytes++] = current_word & 0xFF; - current_word = 0; - - if (*p == ':') - state = bword, ++p; - else if (*p == '%') - state = scope, ++p; - else if (*p == 0) - state = done; - else - { - ec = asio::error::invalid_argument; - return -1; - } - } - break; - - case scope: - if (*p >= '0' && *p <= '9') - current_word = current_word * 10 + *p++ - '0'; - else if (*p == 0) - *scope_id = current_word, state = done; - else - { - ec = asio::error::invalid_argument; - return -1; - } - break; - - default: - break; - } - } - - for (int i = 0; i < num_back_bytes; ++i) - bytes[16 - num_back_bytes + i] = back_bytes[i]; - - ec = asio::error_code(); - return 1; - } - else - { - ec = asio::error::address_family_not_supported; - return -1; - } -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) - using namespace std; // For memcpy and strcmp. - - if (af != ASIO_OS_DEF(AF_INET) && af != ASIO_OS_DEF(AF_INET6)) - { - ec = asio::error::address_family_not_supported; - return -1; - } - - union - { - socket_addr_type base; - sockaddr_storage_type storage; - sockaddr_in4_type v4; - sockaddr_in6_type v6; - } address; - int address_length = sizeof(sockaddr_storage_type); -#if defined(BOOST_NO_ANSI_APIS) || (defined(_MSC_VER) && (_MSC_VER >= 1800)) - int num_wide_chars = static_cast(strlen(src)) + 1; - LPWSTR wide_buffer = (LPWSTR)_alloca(num_wide_chars * sizeof(WCHAR)); - ::MultiByteToWideChar(CP_ACP, 0, src, -1, wide_buffer, num_wide_chars); - int result = error_wrapper(::WSAStringToAddressW( - wide_buffer, af, 0, &address.base, &address_length), ec); -#else - int result = error_wrapper(::WSAStringToAddressA( - const_cast(src), af, 0, &address.base, &address_length), ec); -#endif - - if (af == ASIO_OS_DEF(AF_INET)) - { - if (result != socket_error_retval) - { - memcpy(dest, &address.v4.sin_addr, sizeof(in4_addr_type)); - ec = asio::error_code(); - } - else if (strcmp(src, "255.255.255.255") == 0) - { - static_cast(dest)->s_addr = INADDR_NONE; - ec = asio::error_code(); - } - } - else // AF_INET6 - { - if (result != socket_error_retval) - { - memcpy(dest, &address.v6.sin6_addr, sizeof(in6_addr_type)); - if (scope_id) - *scope_id = address.v6.sin6_scope_id; - ec = asio::error_code(); - } - } - - // Windows may not set an error code on failure. - if (result == socket_error_retval && !ec) - ec = asio::error::invalid_argument; - - if (result != socket_error_retval) - ec = asio::error_code(); - - return result == socket_error_retval ? -1 : 1; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - using namespace std; // For strchr, memcpy and atoi. - - // On some platforms, inet_pton fails if an address string contains a scope - // id. Detect and remove the scope id before passing the string to inet_pton. - const bool is_v6 = (af == ASIO_OS_DEF(AF_INET6)); - const char* if_name = is_v6 ? strchr(src, '%') : 0; - char src_buf[max_addr_v6_str_len + 1]; - const char* src_ptr = src; - if (if_name != 0) - { - if (if_name - src > max_addr_v6_str_len) - { - ec = asio::error::invalid_argument; - return 0; - } - memcpy(src_buf, src, if_name - src); - src_buf[if_name - src] = 0; - src_ptr = src_buf; - } - - int result = error_wrapper(::inet_pton(af, src_ptr, dest), ec); - if (result <= 0 && !ec) - ec = asio::error::invalid_argument; - if (result > 0 && is_v6 && scope_id) - { - using namespace std; // For strchr and atoi. - *scope_id = 0; - if (if_name != 0) - { - in6_addr_type* ipv6_address = static_cast(dest); - bool is_link_local = ((ipv6_address->s6_addr[0] == 0xfe) - && ((ipv6_address->s6_addr[1] & 0xc0) == 0x80)); - bool is_multicast_link_local = ((ipv6_address->s6_addr[0] == 0xff) - && ((ipv6_address->s6_addr[1] & 0x0f) == 0x02)); - if (is_link_local || is_multicast_link_local) - *scope_id = if_nametoindex(if_name + 1); - if (*scope_id == 0) - *scope_id = atoi(if_name + 1); - } - } - return result; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -} - -int gethostname(char* name, int namelen, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS_RUNTIME) - try - { - using namespace Windows::Foundation::Collections; - using namespace Windows::Networking; - using namespace Windows::Networking::Connectivity; - IVectorView^ hostnames = NetworkInformation::GetHostNames(); - for (unsigned i = 0; i < hostnames->Size; ++i) - { - HostName^ hostname = hostnames->GetAt(i); - if (hostname->Type == HostNameType::DomainName) - { - std::wstring_convert> converter; - std::string raw_name = converter.to_bytes(hostname->RawName->Data()); - if (namelen > 0 && raw_name.size() < static_cast(namelen)) - { - strcpy_s(name, namelen, raw_name.c_str()); - return 0; - } - } - } - return -1; - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - return -1; - } -#else // defined(ASIO_WINDOWS_RUNTIME) - int result = error_wrapper(::gethostname(name, namelen), ec); -# if defined(ASIO_WINDOWS) - if (result == 0) - ec = asio::error_code(); -# endif // defined(ASIO_WINDOWS) - return result; -#endif // defined(ASIO_WINDOWS_RUNTIME) -} - -#if !defined(ASIO_WINDOWS_RUNTIME) - -#if !defined(ASIO_HAS_GETADDRINFO) - -// The following functions are only needed for emulation of getaddrinfo and -// getnameinfo. - -inline asio::error_code translate_netdb_error(int error) -{ - switch (error) - { - case 0: - return asio::error_code(); - case HOST_NOT_FOUND: - return asio::error::host_not_found; - case TRY_AGAIN: - return asio::error::host_not_found_try_again; - case NO_RECOVERY: - return asio::error::no_recovery; - case NO_DATA: - return asio::error::no_data; - default: - ASIO_ASSERT(false); - return asio::error::invalid_argument; - } -} - -inline hostent* gethostbyaddr(const char* addr, int length, int af, - hostent* result, char* buffer, int buflength, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - (void)(buffer); - (void)(buflength); - hostent* retval = error_wrapper(::gethostbyaddr(addr, length, af), ec); - if (!retval) - return 0; - ec = asio::error_code(); - *result = *retval; - return retval; -#elif defined(__sun) || defined(__QNX__) - int error = 0; - hostent* retval = error_wrapper(::gethostbyaddr_r(addr, length, af, result, - buffer, buflength, &error), ec); - if (error) - ec = translate_netdb_error(error); - return retval; -#elif defined(__MACH__) && defined(__APPLE__) - (void)(buffer); - (void)(buflength); - int error = 0; - hostent* retval = error_wrapper(::getipnodebyaddr( - addr, length, af, &error), ec); - if (error) - ec = translate_netdb_error(error); - if (!retval) - return 0; - *result = *retval; - return retval; -#else - hostent* retval = 0; - int error = 0; - error_wrapper(::gethostbyaddr_r(addr, length, af, result, buffer, - buflength, &retval, &error), ec); - if (error) - ec = translate_netdb_error(error); - return retval; -#endif -} - -inline hostent* gethostbyname(const char* name, int af, struct hostent* result, - char* buffer, int buflength, int ai_flags, asio::error_code& ec) -{ - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - (void)(buffer); - (void)(buflength); - (void)(ai_flags); - if (af != ASIO_OS_DEF(AF_INET)) - { - ec = asio::error::address_family_not_supported; - return 0; - } - hostent* retval = error_wrapper(::gethostbyname(name), ec); - if (!retval) - return 0; - ec = asio::error_code(); - *result = *retval; - return result; -#elif defined(__sun) || defined(__QNX__) - (void)(ai_flags); - if (af != ASIO_OS_DEF(AF_INET)) - { - ec = asio::error::address_family_not_supported; - return 0; - } - int error = 0; - hostent* retval = error_wrapper(::gethostbyname_r(name, result, buffer, - buflength, &error), ec); - if (error) - ec = translate_netdb_error(error); - return retval; -#elif defined(__MACH__) && defined(__APPLE__) - (void)(buffer); - (void)(buflength); - int error = 0; - hostent* retval = error_wrapper(::getipnodebyname( - name, af, ai_flags, &error), ec); - if (error) - ec = translate_netdb_error(error); - if (!retval) - return 0; - *result = *retval; - return retval; -#else - (void)(ai_flags); - if (af != ASIO_OS_DEF(AF_INET)) - { - ec = asio::error::address_family_not_supported; - return 0; - } - hostent* retval = 0; - int error = 0; - error_wrapper(::gethostbyname_r(name, result, - buffer, buflength, &retval, &error), ec); - if (error) - ec = translate_netdb_error(error); - return retval; -#endif -} - -inline void freehostent(hostent* h) -{ -#if defined(__MACH__) && defined(__APPLE__) - if (h) - ::freehostent(h); -#else - (void)(h); -#endif -} - -// Emulation of getaddrinfo based on implementation in: -// Stevens, W. R., UNIX Network Programming Vol. 1, 2nd Ed., Prentice-Hall 1998. - -struct gai_search -{ - const char* host; - int family; -}; - -inline int gai_nsearch(const char* host, - const addrinfo_type* hints, gai_search (&search)[2]) -{ - int search_count = 0; - if (host == 0 || host[0] == '\0') - { - if (hints->ai_flags & AI_PASSIVE) - { - // No host and AI_PASSIVE implies wildcard bind. - switch (hints->ai_family) - { - case ASIO_OS_DEF(AF_INET): - search[search_count].host = "0.0.0.0"; - search[search_count].family = ASIO_OS_DEF(AF_INET); - ++search_count; - break; - case ASIO_OS_DEF(AF_INET6): - search[search_count].host = "0::0"; - search[search_count].family = ASIO_OS_DEF(AF_INET6); - ++search_count; - break; - case ASIO_OS_DEF(AF_UNSPEC): - search[search_count].host = "0::0"; - search[search_count].family = ASIO_OS_DEF(AF_INET6); - ++search_count; - search[search_count].host = "0.0.0.0"; - search[search_count].family = ASIO_OS_DEF(AF_INET); - ++search_count; - break; - default: - break; - } - } - else - { - // No host and not AI_PASSIVE means connect to local host. - switch (hints->ai_family) - { - case ASIO_OS_DEF(AF_INET): - search[search_count].host = "localhost"; - search[search_count].family = ASIO_OS_DEF(AF_INET); - ++search_count; - break; - case ASIO_OS_DEF(AF_INET6): - search[search_count].host = "localhost"; - search[search_count].family = ASIO_OS_DEF(AF_INET6); - ++search_count; - break; - case ASIO_OS_DEF(AF_UNSPEC): - search[search_count].host = "localhost"; - search[search_count].family = ASIO_OS_DEF(AF_INET6); - ++search_count; - search[search_count].host = "localhost"; - search[search_count].family = ASIO_OS_DEF(AF_INET); - ++search_count; - break; - default: - break; - } - } - } - else - { - // Host is specified. - switch (hints->ai_family) - { - case ASIO_OS_DEF(AF_INET): - search[search_count].host = host; - search[search_count].family = ASIO_OS_DEF(AF_INET); - ++search_count; - break; - case ASIO_OS_DEF(AF_INET6): - search[search_count].host = host; - search[search_count].family = ASIO_OS_DEF(AF_INET6); - ++search_count; - break; - case ASIO_OS_DEF(AF_UNSPEC): - search[search_count].host = host; - search[search_count].family = ASIO_OS_DEF(AF_INET6); - ++search_count; - search[search_count].host = host; - search[search_count].family = ASIO_OS_DEF(AF_INET); - ++search_count; - break; - default: - break; - } - } - return search_count; -} - -template -inline T* gai_alloc(std::size_t size = sizeof(T)) -{ - using namespace std; - T* p = static_cast(::operator new(size, std::nothrow)); - if (p) - memset(p, 0, size); - return p; -} - -inline void gai_free(void* p) -{ - ::operator delete(p); -} - -inline void gai_strcpy(char* target, const char* source, std::size_t max_size) -{ - using namespace std; -#if defined(ASIO_HAS_SECURE_RTL) - strcpy_s(target, max_size, source); -#else // defined(ASIO_HAS_SECURE_RTL) - *target = 0; - if (max_size > 0) - strncat(target, source, max_size - 1); -#endif // defined(ASIO_HAS_SECURE_RTL) -} - -enum { gai_clone_flag = 1 << 30 }; - -inline int gai_aistruct(addrinfo_type*** next, const addrinfo_type* hints, - const void* addr, int family) -{ - using namespace std; - - addrinfo_type* ai = gai_alloc(); - if (ai == 0) - return EAI_MEMORY; - - ai->ai_next = 0; - **next = ai; - *next = &ai->ai_next; - - ai->ai_canonname = 0; - ai->ai_socktype = hints->ai_socktype; - if (ai->ai_socktype == 0) - ai->ai_flags |= gai_clone_flag; - ai->ai_protocol = hints->ai_protocol; - ai->ai_family = family; - - switch (ai->ai_family) - { - case ASIO_OS_DEF(AF_INET): - { - sockaddr_in4_type* sinptr = gai_alloc(); - if (sinptr == 0) - return EAI_MEMORY; - sinptr->sin_family = ASIO_OS_DEF(AF_INET); - memcpy(&sinptr->sin_addr, addr, sizeof(in4_addr_type)); - ai->ai_addr = reinterpret_cast(sinptr); - ai->ai_addrlen = sizeof(sockaddr_in4_type); - break; - } - case ASIO_OS_DEF(AF_INET6): - { - sockaddr_in6_type* sin6ptr = gai_alloc(); - if (sin6ptr == 0) - return EAI_MEMORY; - sin6ptr->sin6_family = ASIO_OS_DEF(AF_INET6); - memcpy(&sin6ptr->sin6_addr, addr, sizeof(in6_addr_type)); - ai->ai_addr = reinterpret_cast(sin6ptr); - ai->ai_addrlen = sizeof(sockaddr_in6_type); - break; - } - default: - break; - } - - return 0; -} - -inline addrinfo_type* gai_clone(addrinfo_type* ai) -{ - using namespace std; - - addrinfo_type* new_ai = gai_alloc(); - if (new_ai == 0) - return new_ai; - - new_ai->ai_next = ai->ai_next; - ai->ai_next = new_ai; - - new_ai->ai_flags = 0; - new_ai->ai_family = ai->ai_family; - new_ai->ai_socktype = ai->ai_socktype; - new_ai->ai_protocol = ai->ai_protocol; - new_ai->ai_canonname = 0; - new_ai->ai_addrlen = ai->ai_addrlen; - new_ai->ai_addr = gai_alloc(ai->ai_addrlen); - memcpy(new_ai->ai_addr, ai->ai_addr, ai->ai_addrlen); - - return new_ai; -} - -inline int gai_port(addrinfo_type* aihead, int port, int socktype) -{ - int num_found = 0; - - for (addrinfo_type* ai = aihead; ai; ai = ai->ai_next) - { - if (ai->ai_flags & gai_clone_flag) - { - if (ai->ai_socktype != 0) - { - ai = gai_clone(ai); - if (ai == 0) - return -1; - // ai now points to newly cloned entry. - } - } - else if (ai->ai_socktype != socktype) - { - // Ignore if mismatch on socket type. - continue; - } - - ai->ai_socktype = socktype; - - switch (ai->ai_family) - { - case ASIO_OS_DEF(AF_INET): - { - sockaddr_in4_type* sinptr = - reinterpret_cast(ai->ai_addr); - sinptr->sin_port = port; - ++num_found; - break; - } - case ASIO_OS_DEF(AF_INET6): - { - sockaddr_in6_type* sin6ptr = - reinterpret_cast(ai->ai_addr); - sin6ptr->sin6_port = port; - ++num_found; - break; - } - default: - break; - } - } - - return num_found; -} - -inline int gai_serv(addrinfo_type* aihead, - const addrinfo_type* hints, const char* serv) -{ - using namespace std; - - int num_found = 0; - - if ( -#if defined(AI_NUMERICSERV) - (hints->ai_flags & AI_NUMERICSERV) || -#endif - isdigit(static_cast(serv[0]))) - { - int port = htons(atoi(serv)); - if (hints->ai_socktype) - { - // Caller specifies socket type. - int rc = gai_port(aihead, port, hints->ai_socktype); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - else - { - // Caller does not specify socket type. - int rc = gai_port(aihead, port, SOCK_STREAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - rc = gai_port(aihead, port, SOCK_DGRAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - } - else - { - // Try service name with TCP first, then UDP. - if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_STREAM) - { - servent* sptr = getservbyname(serv, "tcp"); - if (sptr != 0) - { - int rc = gai_port(aihead, sptr->s_port, SOCK_STREAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - } - if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_DGRAM) - { - servent* sptr = getservbyname(serv, "udp"); - if (sptr != 0) - { - int rc = gai_port(aihead, sptr->s_port, SOCK_DGRAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - } - } - - if (num_found == 0) - { - if (hints->ai_socktype == 0) - { - // All calls to getservbyname() failed. - return EAI_NONAME; - } - else - { - // Service not supported for socket type. - return EAI_SERVICE; - } - } - - return 0; -} - -inline int gai_echeck(const char* host, const char* service, - int flags, int family, int socktype, int protocol) -{ - (void)(flags); - (void)(protocol); - - // Host or service must be specified. - if (host == 0 || host[0] == '\0') - if (service == 0 || service[0] == '\0') - return EAI_NONAME; - - // Check combination of family and socket type. - switch (family) - { - case ASIO_OS_DEF(AF_UNSPEC): - break; - case ASIO_OS_DEF(AF_INET): - case ASIO_OS_DEF(AF_INET6): - if (service != 0 && service[0] != '\0') - if (socktype != 0 && socktype != SOCK_STREAM && socktype != SOCK_DGRAM) - return EAI_SOCKTYPE; - break; - default: - return EAI_FAMILY; - } - - return 0; -} - -inline void freeaddrinfo_emulation(addrinfo_type* aihead) -{ - addrinfo_type* ai = aihead; - while (ai) - { - gai_free(ai->ai_addr); - gai_free(ai->ai_canonname); - addrinfo_type* ainext = ai->ai_next; - gai_free(ai); - ai = ainext; - } -} - -inline int getaddrinfo_emulation(const char* host, const char* service, - const addrinfo_type* hintsp, addrinfo_type** result) -{ - // Set up linked list of addrinfo structures. - addrinfo_type* aihead = 0; - addrinfo_type** ainext = &aihead; - char* canon = 0; - - // Supply default hints if not specified by caller. - addrinfo_type hints = addrinfo_type(); - hints.ai_family = ASIO_OS_DEF(AF_UNSPEC); - if (hintsp) - hints = *hintsp; - - // If the resolution is not specifically for AF_INET6, remove the AI_V4MAPPED - // and AI_ALL flags. -#if defined(AI_V4MAPPED) - if (hints.ai_family != ASIO_OS_DEF(AF_INET6)) - hints.ai_flags &= ~AI_V4MAPPED; -#endif -#if defined(AI_ALL) - if (hints.ai_family != ASIO_OS_DEF(AF_INET6)) - hints.ai_flags &= ~AI_ALL; -#endif - - // Basic error checking. - int rc = gai_echeck(host, service, hints.ai_flags, hints.ai_family, - hints.ai_socktype, hints.ai_protocol); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - return rc; - } - - gai_search search[2]; - int search_count = gai_nsearch(host, &hints, search); - for (gai_search* sptr = search; sptr < search + search_count; ++sptr) - { - // Check for IPv4 dotted decimal string. - in4_addr_type inaddr; - asio::error_code ec; - if (socket_ops::inet_pton(ASIO_OS_DEF(AF_INET), - sptr->host, &inaddr, 0, ec) == 1) - { - if (hints.ai_family != ASIO_OS_DEF(AF_UNSPEC) - && hints.ai_family != ASIO_OS_DEF(AF_INET)) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return EAI_FAMILY; - } - if (sptr->family == ASIO_OS_DEF(AF_INET)) - { - rc = gai_aistruct(&ainext, &hints, &inaddr, ASIO_OS_DEF(AF_INET)); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return rc; - } - } - continue; - } - - // Check for IPv6 hex string. - in6_addr_type in6addr; - if (socket_ops::inet_pton(ASIO_OS_DEF(AF_INET6), - sptr->host, &in6addr, 0, ec) == 1) - { - if (hints.ai_family != ASIO_OS_DEF(AF_UNSPEC) - && hints.ai_family != ASIO_OS_DEF(AF_INET6)) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return EAI_FAMILY; - } - if (sptr->family == ASIO_OS_DEF(AF_INET6)) - { - rc = gai_aistruct(&ainext, &hints, &in6addr, - ASIO_OS_DEF(AF_INET6)); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return rc; - } - } - continue; - } - - // Look up hostname. - hostent hent; - char hbuf[8192] = ""; - hostent* hptr = socket_ops::gethostbyname(sptr->host, - sptr->family, &hent, hbuf, sizeof(hbuf), hints.ai_flags, ec); - if (hptr == 0) - { - if (search_count == 2) - { - // Failure is OK if there are multiple searches. - continue; - } - freeaddrinfo_emulation(aihead); - gai_free(canon); - if (ec == asio::error::host_not_found) - return EAI_NONAME; - if (ec == asio::error::host_not_found_try_again) - return EAI_AGAIN; - if (ec == asio::error::no_recovery) - return EAI_FAIL; - if (ec == asio::error::no_data) - return EAI_NONAME; - return EAI_NONAME; - } - - // Check for address family mismatch if one was specified. - if (hints.ai_family != ASIO_OS_DEF(AF_UNSPEC) - && hints.ai_family != hptr->h_addrtype) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - socket_ops::freehostent(hptr); - return EAI_FAMILY; - } - - // Save canonical name first time. - if (host != 0 && host[0] != '\0' && hptr->h_name && hptr->h_name[0] - && (hints.ai_flags & AI_CANONNAME) && canon == 0) - { - std::size_t canon_len = strlen(hptr->h_name) + 1; - canon = gai_alloc(canon_len); - if (canon == 0) - { - freeaddrinfo_emulation(aihead); - socket_ops::freehostent(hptr); - return EAI_MEMORY; - } - gai_strcpy(canon, hptr->h_name, canon_len); - } - - // Create an addrinfo structure for each returned address. - for (char** ap = hptr->h_addr_list; *ap; ++ap) - { - rc = gai_aistruct(&ainext, &hints, *ap, hptr->h_addrtype); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - socket_ops::freehostent(hptr); - return EAI_FAMILY; - } - } - - socket_ops::freehostent(hptr); - } - - // Check if we found anything. - if (aihead == 0) - { - gai_free(canon); - return EAI_NONAME; - } - - // Return canonical name in first entry. - if (host != 0 && host[0] != '\0' && (hints.ai_flags & AI_CANONNAME)) - { - if (canon) - { - aihead->ai_canonname = canon; - canon = 0; - } - else - { - std::size_t canonname_len = strlen(search[0].host) + 1; - aihead->ai_canonname = gai_alloc(canonname_len); - if (aihead->ai_canonname == 0) - { - freeaddrinfo_emulation(aihead); - return EAI_MEMORY; - } - gai_strcpy(aihead->ai_canonname, search[0].host, canonname_len); - } - } - gai_free(canon); - - // Process the service name. - if (service != 0 && service[0] != '\0') - { - rc = gai_serv(aihead, &hints, service); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - return rc; - } - } - - // Return result to caller. - *result = aihead; - return 0; -} - -inline asio::error_code getnameinfo_emulation( - const socket_addr_type* sa, std::size_t salen, char* host, - std::size_t hostlen, char* serv, std::size_t servlen, int flags, - asio::error_code& ec) -{ - using namespace std; - - const char* addr; - size_t addr_len; - unsigned short port; - switch (sa->sa_family) - { - case ASIO_OS_DEF(AF_INET): - if (salen != sizeof(sockaddr_in4_type)) - { - return ec = asio::error::invalid_argument; - } - addr = reinterpret_cast( - &reinterpret_cast(sa)->sin_addr); - addr_len = sizeof(in4_addr_type); - port = reinterpret_cast(sa)->sin_port; - break; - case ASIO_OS_DEF(AF_INET6): - if (salen != sizeof(sockaddr_in6_type)) - { - return ec = asio::error::invalid_argument; - } - addr = reinterpret_cast( - &reinterpret_cast(sa)->sin6_addr); - addr_len = sizeof(in6_addr_type); - port = reinterpret_cast(sa)->sin6_port; - break; - default: - return ec = asio::error::address_family_not_supported; - } - - if (host && hostlen > 0) - { - if (flags & NI_NUMERICHOST) - { - if (socket_ops::inet_ntop(sa->sa_family, addr, host, hostlen, 0, ec) == 0) - { - return ec; - } - } - else - { - hostent hent; - char hbuf[8192] = ""; - hostent* hptr = socket_ops::gethostbyaddr(addr, - static_cast(addr_len), sa->sa_family, - &hent, hbuf, sizeof(hbuf), ec); - if (hptr && hptr->h_name && hptr->h_name[0] != '\0') - { - if (flags & NI_NOFQDN) - { - char* dot = strchr(hptr->h_name, '.'); - if (dot) - { - *dot = 0; - } - } - gai_strcpy(host, hptr->h_name, hostlen); - socket_ops::freehostent(hptr); - } - else - { - socket_ops::freehostent(hptr); - if (flags & NI_NAMEREQD) - { - return ec = asio::error::host_not_found; - } - if (socket_ops::inet_ntop(sa->sa_family, - addr, host, hostlen, 0, ec) == 0) - { - return ec; - } - } - } - } - - if (serv && servlen > 0) - { - if (flags & NI_NUMERICSERV) - { - if (servlen < 6) - { - return ec = asio::error::no_buffer_space; - } -#if defined(ASIO_HAS_SECURE_RTL) - sprintf_s(serv, servlen, "%u", ntohs(port)); -#else // defined(ASIO_HAS_SECURE_RTL) - sprintf(serv, "%u", ntohs(port)); -#endif // defined(ASIO_HAS_SECURE_RTL) - } - else - { -#if defined(ASIO_HAS_PTHREADS) - static ::pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - ::pthread_mutex_lock(&mutex); -#endif // defined(ASIO_HAS_PTHREADS) - servent* sptr = ::getservbyport(port, (flags & NI_DGRAM) ? "udp" : 0); - if (sptr && sptr->s_name && sptr->s_name[0] != '\0') - { - gai_strcpy(serv, sptr->s_name, servlen); - } - else - { - if (servlen < 6) - { - return ec = asio::error::no_buffer_space; - } -#if defined(ASIO_HAS_SECURE_RTL) - sprintf_s(serv, servlen, "%u", ntohs(port)); -#else // defined(ASIO_HAS_SECURE_RTL) - sprintf(serv, "%u", ntohs(port)); -#endif // defined(ASIO_HAS_SECURE_RTL) - } -#if defined(ASIO_HAS_PTHREADS) - ::pthread_mutex_unlock(&mutex); -#endif // defined(ASIO_HAS_PTHREADS) - } - } - - ec = asio::error_code(); - return ec; -} - -#endif // !defined(ASIO_HAS_GETADDRINFO) - -inline asio::error_code translate_addrinfo_error(int error) -{ - switch (error) - { - case 0: - return asio::error_code(); - case EAI_AGAIN: - return asio::error::host_not_found_try_again; - case EAI_BADFLAGS: - return asio::error::invalid_argument; - case EAI_FAIL: - return asio::error::no_recovery; - case EAI_FAMILY: - return asio::error::address_family_not_supported; - case EAI_MEMORY: - return asio::error::no_memory; - case EAI_NONAME: -#if defined(EAI_ADDRFAMILY) - case EAI_ADDRFAMILY: -#endif -#if defined(EAI_NODATA) && (EAI_NODATA != EAI_NONAME) - case EAI_NODATA: -#endif - return asio::error::host_not_found; - case EAI_SERVICE: - return asio::error::service_not_found; - case EAI_SOCKTYPE: - return asio::error::socket_type_not_supported; - default: // Possibly the non-portable EAI_SYSTEM. -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - return asio::error_code( - WSAGetLastError(), asio::error::get_system_category()); -#else - return asio::error_code( - errno, asio::error::get_system_category()); -#endif - } -} - -asio::error_code getaddrinfo(const char* host, - const char* service, const addrinfo_type& hints, - addrinfo_type** result, asio::error_code& ec) -{ - host = (host && *host) ? host : 0; - service = (service && *service) ? service : 0; - clear_last_error(); -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if defined(ASIO_HAS_GETADDRINFO) - // Building for Windows XP, Windows Server 2003, or later. - int error = ::getaddrinfo(host, service, &hints, result); - return ec = translate_addrinfo_error(error); -# else - // Building for Windows 2000 or earlier. - typedef int (WSAAPI *gai_t)(const char*, - const char*, const addrinfo_type*, addrinfo_type**); - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - if (gai_t gai = (gai_t)::GetProcAddress(winsock_module, "getaddrinfo")) - { - int error = gai(host, service, &hints, result); - return ec = translate_addrinfo_error(error); - } - } - int error = getaddrinfo_emulation(host, service, &hints, result); - return ec = translate_addrinfo_error(error); -# endif -#elif !defined(ASIO_HAS_GETADDRINFO) - int error = getaddrinfo_emulation(host, service, &hints, result); - return ec = translate_addrinfo_error(error); -#else - int error = ::getaddrinfo(host, service, &hints, result); -#if defined(__MACH__) && defined(__APPLE__) - using namespace std; // For isdigit and atoi. - if (error == 0 && service && isdigit(static_cast(service[0]))) - { - u_short_type port = host_to_network_short(atoi(service)); - for (addrinfo_type* ai = *result; ai; ai = ai->ai_next) - { - switch (ai->ai_family) - { - case ASIO_OS_DEF(AF_INET): - { - sockaddr_in4_type* sinptr = - reinterpret_cast(ai->ai_addr); - if (sinptr->sin_port == 0) - sinptr->sin_port = port; - break; - } - case ASIO_OS_DEF(AF_INET6): - { - sockaddr_in6_type* sin6ptr = - reinterpret_cast(ai->ai_addr); - if (sin6ptr->sin6_port == 0) - sin6ptr->sin6_port = port; - break; - } - default: - break; - } - } - } -#endif - return ec = translate_addrinfo_error(error); -#endif -} - -asio::error_code background_getaddrinfo( - const weak_cancel_token_type& cancel_token, const char* host, - const char* service, const addrinfo_type& hints, - addrinfo_type** result, asio::error_code& ec) -{ - if (cancel_token.expired()) - ec = asio::error::operation_aborted; - else - socket_ops::getaddrinfo(host, service, hints, result, ec); - return ec; -} - -void freeaddrinfo(addrinfo_type* ai) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if defined(ASIO_HAS_GETADDRINFO) - // Building for Windows XP, Windows Server 2003, or later. - ::freeaddrinfo(ai); -# else - // Building for Windows 2000 or earlier. - typedef int (WSAAPI *fai_t)(addrinfo_type*); - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - if (fai_t fai = (fai_t)::GetProcAddress(winsock_module, "freeaddrinfo")) - { - fai(ai); - return; - } - } - freeaddrinfo_emulation(ai); -# endif -#elif !defined(ASIO_HAS_GETADDRINFO) - freeaddrinfo_emulation(ai); -#else - ::freeaddrinfo(ai); -#endif -} - -asio::error_code getnameinfo(const socket_addr_type* addr, - std::size_t addrlen, char* host, std::size_t hostlen, - char* serv, std::size_t servlen, int flags, asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if defined(ASIO_HAS_GETADDRINFO) - // Building for Windows XP, Windows Server 2003, or later. - clear_last_error(); - int error = ::getnameinfo(addr, static_cast(addrlen), - host, static_cast(hostlen), - serv, static_cast(servlen), flags); - return ec = translate_addrinfo_error(error); -# else - // Building for Windows 2000 or earlier. - typedef int (WSAAPI *gni_t)(const socket_addr_type*, - int, char*, DWORD, char*, DWORD, int); - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - if (gni_t gni = (gni_t)::GetProcAddress(winsock_module, "getnameinfo")) - { - clear_last_error(); - int error = gni(addr, static_cast(addrlen), - host, static_cast(hostlen), - serv, static_cast(servlen), flags); - return ec = translate_addrinfo_error(error); - } - } - clear_last_error(); - return getnameinfo_emulation(addr, addrlen, - host, hostlen, serv, servlen, flags, ec); -# endif -#elif !defined(ASIO_HAS_GETADDRINFO) - using namespace std; // For memcpy. - sockaddr_storage_type tmp_addr; - memcpy(&tmp_addr, addr, addrlen); - addr = reinterpret_cast(&tmp_addr); - clear_last_error(); - return getnameinfo_emulation(addr, addrlen, - host, hostlen, serv, servlen, flags, ec); -#else - clear_last_error(); - int error = ::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags); - return ec = translate_addrinfo_error(error); -#endif -} - -asio::error_code sync_getnameinfo( - const socket_addr_type* addr, std::size_t addrlen, - char* host, std::size_t hostlen, char* serv, - std::size_t servlen, int sock_type, asio::error_code& ec) -{ - // First try resolving with the service name. If that fails try resolving - // but allow the service to be returned as a number. - int flags = (sock_type == SOCK_DGRAM) ? NI_DGRAM : 0; - socket_ops::getnameinfo(addr, addrlen, host, - hostlen, serv, servlen, flags, ec); - if (ec) - { - socket_ops::getnameinfo(addr, addrlen, host, hostlen, - serv, servlen, flags | NI_NUMERICSERV, ec); - } - - return ec; -} - -asio::error_code background_getnameinfo( - const weak_cancel_token_type& cancel_token, - const socket_addr_type* addr, std::size_t addrlen, - char* host, std::size_t hostlen, char* serv, - std::size_t servlen, int sock_type, asio::error_code& ec) -{ - if (cancel_token.expired()) - { - ec = asio::error::operation_aborted; - } - else - { - // First try resolving with the service name. If that fails try resolving - // but allow the service to be returned as a number. - int flags = (sock_type == SOCK_DGRAM) ? NI_DGRAM : 0; - socket_ops::getnameinfo(addr, addrlen, host, - hostlen, serv, servlen, flags, ec); - if (ec) - { - socket_ops::getnameinfo(addr, addrlen, host, hostlen, - serv, servlen, flags | NI_NUMERICSERV, ec); - } - } - - return ec; -} - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -u_long_type network_to_host_long(u_long_type value) -{ -#if defined(ASIO_WINDOWS_RUNTIME) - unsigned char* value_p = reinterpret_cast(&value); - u_long_type result = (static_cast(value_p[0]) << 24) - | (static_cast(value_p[1]) << 16) - | (static_cast(value_p[2]) << 8) - | static_cast(value_p[3]); - return result; -#else // defined(ASIO_WINDOWS_RUNTIME) - return ntohl(value); -#endif // defined(ASIO_WINDOWS_RUNTIME) -} - -u_long_type host_to_network_long(u_long_type value) -{ -#if defined(ASIO_WINDOWS_RUNTIME) - u_long_type result; - unsigned char* result_p = reinterpret_cast(&result); - result_p[0] = static_cast((value >> 24) & 0xFF); - result_p[1] = static_cast((value >> 16) & 0xFF); - result_p[2] = static_cast((value >> 8) & 0xFF); - result_p[3] = static_cast(value & 0xFF); - return result; -#else // defined(ASIO_WINDOWS_RUNTIME) - return htonl(value); -#endif // defined(ASIO_WINDOWS_RUNTIME) -} - -u_short_type network_to_host_short(u_short_type value) -{ -#if defined(ASIO_WINDOWS_RUNTIME) - unsigned char* value_p = reinterpret_cast(&value); - u_short_type result = (static_cast(value_p[0]) << 8) - | static_cast(value_p[1]); - return result; -#else // defined(ASIO_WINDOWS_RUNTIME) - return ntohs(value); -#endif // defined(ASIO_WINDOWS_RUNTIME) -} - -u_short_type host_to_network_short(u_short_type value) -{ -#if defined(ASIO_WINDOWS_RUNTIME) - u_short_type result; - unsigned char* result_p = reinterpret_cast(&result); - result_p[0] = static_cast((value >> 8) & 0xFF); - result_p[1] = static_cast(value & 0xFF); - return result; -#else // defined(ASIO_WINDOWS_RUNTIME) - return htons(value); -#endif // defined(ASIO_WINDOWS_RUNTIME) -} - -} // namespace socket_ops -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_OPS_IPP diff --git a/scout_sdk/asio/asio/detail/impl/socket_select_interrupter.ipp b/scout_sdk/asio/asio/detail/impl/socket_select_interrupter.ipp deleted file mode 100644 index 052f2a7..0000000 --- a/scout_sdk/asio/asio/detail/impl/socket_select_interrupter.ipp +++ /dev/null @@ -1,176 +0,0 @@ -// -// detail/impl/socket_select_interrupter.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_SOCKET_SELECT_INTERRUPTER_IPP -#define ASIO_DETAIL_IMPL_SOCKET_SELECT_INTERRUPTER_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS_RUNTIME) - -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - -#include -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_select_interrupter.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -socket_select_interrupter::socket_select_interrupter() -{ - open_descriptors(); -} - -void socket_select_interrupter::open_descriptors() -{ - asio::error_code ec; - socket_holder acceptor(socket_ops::socket( - AF_INET, SOCK_STREAM, IPPROTO_TCP, ec)); - if (acceptor.get() == invalid_socket) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - int opt = 1; - socket_ops::state_type acceptor_state = 0; - socket_ops::setsockopt(acceptor.get(), acceptor_state, - SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt), ec); - - using namespace std; // For memset. - sockaddr_in4_type addr; - std::size_t addr_len = sizeof(addr); - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = socket_ops::host_to_network_long(INADDR_LOOPBACK); - addr.sin_port = 0; - if (socket_ops::bind(acceptor.get(), (const socket_addr_type*)&addr, - addr_len, ec) == socket_error_retval) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - if (socket_ops::getsockname(acceptor.get(), (socket_addr_type*)&addr, - &addr_len, ec) == socket_error_retval) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - // Some broken firewalls on Windows will intermittently cause getsockname to - // return 0.0.0.0 when the socket is actually bound to 127.0.0.1. We - // explicitly specify the target address here to work around this problem. - if (addr.sin_addr.s_addr == socket_ops::host_to_network_long(INADDR_ANY)) - addr.sin_addr.s_addr = socket_ops::host_to_network_long(INADDR_LOOPBACK); - - if (socket_ops::listen(acceptor.get(), - SOMAXCONN, ec) == socket_error_retval) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - socket_holder client(socket_ops::socket( - AF_INET, SOCK_STREAM, IPPROTO_TCP, ec)); - if (client.get() == invalid_socket) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - if (socket_ops::connect(client.get(), (const socket_addr_type*)&addr, - addr_len, ec) == socket_error_retval) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - socket_holder server(socket_ops::accept(acceptor.get(), 0, 0, ec)); - if (server.get() == invalid_socket) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - ioctl_arg_type non_blocking = 1; - socket_ops::state_type client_state = 0; - if (socket_ops::ioctl(client.get(), client_state, - FIONBIO, &non_blocking, ec)) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - opt = 1; - socket_ops::setsockopt(client.get(), client_state, - IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt), ec); - - non_blocking = 1; - socket_ops::state_type server_state = 0; - if (socket_ops::ioctl(server.get(), server_state, - FIONBIO, &non_blocking, ec)) - asio::detail::throw_error(ec, "socket_select_interrupter"); - - opt = 1; - socket_ops::setsockopt(server.get(), server_state, - IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt), ec); - - read_descriptor_ = server.release(); - write_descriptor_ = client.release(); -} - -socket_select_interrupter::~socket_select_interrupter() -{ - close_descriptors(); -} - -void socket_select_interrupter::close_descriptors() -{ - asio::error_code ec; - socket_ops::state_type state = socket_ops::internal_non_blocking; - if (read_descriptor_ != invalid_socket) - socket_ops::close(read_descriptor_, state, true, ec); - if (write_descriptor_ != invalid_socket) - socket_ops::close(write_descriptor_, state, true, ec); -} - -void socket_select_interrupter::recreate() -{ - close_descriptors(); - - write_descriptor_ = invalid_socket; - read_descriptor_ = invalid_socket; - - open_descriptors(); -} - -void socket_select_interrupter::interrupt() -{ - char byte = 0; - socket_ops::buf b; - socket_ops::init_buf(b, &byte, 1); - asio::error_code ec; - socket_ops::send(write_descriptor_, &b, 1, 0, ec); -} - -bool socket_select_interrupter::reset() -{ - char data[1024]; - socket_ops::buf b; - socket_ops::init_buf(b, data, sizeof(data)); - asio::error_code ec; - int bytes_read = socket_ops::recv(read_descriptor_, &b, 1, 0, ec); - bool was_interrupted = (bytes_read > 0); - while (bytes_read == sizeof(data)) - bytes_read = socket_ops::recv(read_descriptor_, &b, 1, 0, ec); - return was_interrupted; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_SOCKET_SELECT_INTERRUPTER_IPP diff --git a/scout_sdk/asio/asio/detail/impl/strand_executor_service.hpp b/scout_sdk/asio/asio/detail/impl/strand_executor_service.hpp deleted file mode 100644 index 0e18ca0..0000000 --- a/scout_sdk/asio/asio/detail/impl/strand_executor_service.hpp +++ /dev/null @@ -1,179 +0,0 @@ -// -// detail/impl/strand_executor_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_HPP -#define ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/call_stack.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/recycling_allocator.hpp" -#include "asio/executor_work_guard.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class strand_executor_service::invoker -{ -public: - invoker(const implementation_type& impl, Executor& ex) - : impl_(impl), - work_(ex) - { - } - - invoker(const invoker& other) - : impl_(other.impl_), - work_(other.work_) - { - } - -#if defined(ASIO_HAS_MOVE) - invoker(invoker&& other) - : impl_(ASIO_MOVE_CAST(implementation_type)(other.impl_)), - work_(ASIO_MOVE_CAST(executor_work_guard)(other.work_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - struct on_invoker_exit - { - invoker* this_; - - ~on_invoker_exit() - { - this_->impl_->mutex_->lock(); - this_->impl_->ready_queue_.push(this_->impl_->waiting_queue_); - bool more_handlers = this_->impl_->locked_ = - !this_->impl_->ready_queue_.empty(); - this_->impl_->mutex_->unlock(); - - if (more_handlers) - { - Executor ex(this_->work_.get_executor()); - recycling_allocator allocator; - ex.post(ASIO_MOVE_CAST(invoker)(*this_), allocator); - } - } - }; - - void operator()() - { - // Indicate that this strand is executing on the current thread. - call_stack::context ctx(impl_.get()); - - // Ensure the next handler, if any, is scheduled on block exit. - on_invoker_exit on_exit = { this }; - (void)on_exit; - - // Run all ready handlers. No lock is required since the ready queue is - // accessed only within the strand. - asio::error_code ec; - while (scheduler_operation* o = impl_->ready_queue_.front()) - { - impl_->ready_queue_.pop(); - o->complete(impl_.get(), ec, 0); - } - } - -private: - implementation_type impl_; - executor_work_guard work_; -}; - -template -void strand_executor_service::dispatch(const implementation_type& impl, - Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a) -{ - typedef typename decay::type function_type; - - // If we are already in the strand then the function can run immediately. - if (call_stack::contains(impl.get())) - { - // Make a local, non-const copy of the function. - function_type tmp(ASIO_MOVE_CAST(Function)(function)); - - fenced_block b(fenced_block::full); - asio_handler_invoke_helpers::invoke(tmp, tmp); - return; - } - - // Allocate and construct an operation to wrap the function. - typedef executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(function), a); - - ASIO_HANDLER_CREATION((impl->service_->context(), *p.p, - "strand_executor", impl.get(), 0, "dispatch")); - - // Add the function to the strand and schedule the strand if required. - bool first = enqueue(impl, p.p); - p.v = p.p = 0; - if (first) - ex.dispatch(invoker(impl, ex), a); -} - -// Request invocation of the given function and return immediately. -template -void strand_executor_service::post(const implementation_type& impl, - Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a) -{ - typedef typename decay::type function_type; - - // Allocate and construct an operation to wrap the function. - typedef executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(function), a); - - ASIO_HANDLER_CREATION((impl->service_->context(), *p.p, - "strand_executor", impl.get(), 0, "post")); - - // Add the function to the strand and schedule the strand if required. - bool first = enqueue(impl, p.p); - p.v = p.p = 0; - if (first) - ex.post(invoker(impl, ex), a); -} - -// Request invocation of the given function and return immediately. -template -void strand_executor_service::defer(const implementation_type& impl, - Executor& ex, ASIO_MOVE_ARG(Function) function, const Allocator& a) -{ - typedef typename decay::type function_type; - - // Allocate and construct an operation to wrap the function. - typedef executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(function), a); - - ASIO_HANDLER_CREATION((impl->service_->context(), *p.p, - "strand_executor", impl.get(), 0, "defer")); - - // Add the function to the strand and schedule the strand if required. - bool first = enqueue(impl, p.p); - p.v = p.p = 0; - if (first) - ex.defer(invoker(impl, ex), a); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/impl/strand_executor_service.ipp b/scout_sdk/asio/asio/detail/impl/strand_executor_service.ipp deleted file mode 100644 index 365652e..0000000 --- a/scout_sdk/asio/asio/detail/impl/strand_executor_service.ipp +++ /dev/null @@ -1,134 +0,0 @@ -// -// detail/impl/strand_executor_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_IPP -#define ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/strand_executor_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -strand_executor_service::strand_executor_service(execution_context& ctx) - : execution_context_service_base(ctx), - mutex_(), - salt_(0), - impl_list_(0) -{ -} - -void strand_executor_service::shutdown() -{ - op_queue ops; - - asio::detail::mutex::scoped_lock lock(mutex_); - - strand_impl* impl = impl_list_; - while (impl) - { - impl->mutex_->lock(); - impl->shutdown_ = true; - ops.push(impl->waiting_queue_); - ops.push(impl->ready_queue_); - impl->mutex_->unlock(); - impl = impl->next_; - } -} - -strand_executor_service::implementation_type -strand_executor_service::create_implementation() -{ - implementation_type new_impl(new strand_impl); - new_impl->locked_ = false; - new_impl->shutdown_ = false; - - asio::detail::mutex::scoped_lock lock(mutex_); - - // Select a mutex from the pool of shared mutexes. - std::size_t salt = salt_++; - std::size_t mutex_index = reinterpret_cast(new_impl.get()); - mutex_index += (reinterpret_cast(new_impl.get()) >> 3); - mutex_index ^= salt + 0x9e3779b9 + (mutex_index << 6) + (mutex_index >> 2); - mutex_index = mutex_index % num_mutexes; - if (!mutexes_[mutex_index].get()) - mutexes_[mutex_index].reset(new mutex); - new_impl->mutex_ = mutexes_[mutex_index].get(); - - // Insert implementation into linked list of all implementations. - new_impl->next_ = impl_list_; - new_impl->prev_ = 0; - if (impl_list_) - impl_list_->prev_ = new_impl.get(); - impl_list_ = new_impl.get(); - new_impl->service_ = this; - - return new_impl; -} - -strand_executor_service::strand_impl::~strand_impl() -{ - asio::detail::mutex::scoped_lock lock(service_->mutex_); - - // Remove implementation from linked list of all implementations. - if (service_->impl_list_ == this) - service_->impl_list_ = next_; - if (prev_) - prev_->next_ = next_; - if (next_) - next_->prev_= prev_; -} - -bool strand_executor_service::enqueue(const implementation_type& impl, - scheduler_operation* op) -{ - impl->mutex_->lock(); - if (impl->shutdown_) - { - impl->mutex_->unlock(); - op->destroy(); - return false; - } - else if (impl->locked_) - { - // Some other function already holds the strand lock. Enqueue for later. - impl->waiting_queue_.push(op); - impl->mutex_->unlock(); - return false; - } - else - { - // The function is acquiring the strand lock and so is responsible for - // scheduling the strand. - impl->locked_ = true; - impl->mutex_->unlock(); - impl->ready_queue_.push(op); - return true; - } -} - -bool strand_executor_service::running_in_this_thread( - const implementation_type& impl) -{ - return !!call_stack::contains(impl.get()); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_STRAND_EXECUTOR_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/strand_service.hpp b/scout_sdk/asio/asio/detail/impl/strand_service.hpp deleted file mode 100644 index da5b716..0000000 --- a/scout_sdk/asio/asio/detail/impl/strand_service.hpp +++ /dev/null @@ -1,118 +0,0 @@ -// -// detail/impl/strand_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_STRAND_SERVICE_HPP -#define ASIO_DETAIL_IMPL_STRAND_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/call_stack.hpp" -#include "asio/detail/completion_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -inline strand_service::strand_impl::strand_impl() - : operation(&strand_service::do_complete), - locked_(false) -{ -} - -struct strand_service::on_dispatch_exit -{ - io_context_impl* io_context_; - strand_impl* impl_; - - ~on_dispatch_exit() - { - impl_->mutex_.lock(); - impl_->ready_queue_.push(impl_->waiting_queue_); - bool more_handlers = impl_->locked_ = !impl_->ready_queue_.empty(); - impl_->mutex_.unlock(); - - if (more_handlers) - io_context_->post_immediate_completion(impl_, false); - } -}; - -template -void strand_service::dispatch(strand_service::implementation_type& impl, - Handler& handler) -{ - // If we are already in the strand then the handler can run immediately. - if (call_stack::contains(impl)) - { - fenced_block b(fenced_block::full); - asio_handler_invoke_helpers::invoke(handler, handler); - return; - } - - // Allocate and construct an operation to wrap the handler. - typedef completion_handler op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((this->context(), - *p.p, "strand", impl, 0, "dispatch")); - - bool dispatch_immediately = do_dispatch(impl, p.p); - operation* o = p.p; - p.v = p.p = 0; - - if (dispatch_immediately) - { - // Indicate that this strand is executing on the current thread. - call_stack::context ctx(impl); - - // Ensure the next handler, if any, is scheduled on block exit. - on_dispatch_exit on_exit = { &io_context_, impl }; - (void)on_exit; - - completion_handler::do_complete( - &io_context_, o, asio::error_code(), 0); - } -} - -// Request the io_context to invoke the given handler and return immediately. -template -void strand_service::post(strand_service::implementation_type& impl, - Handler& handler) -{ - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef completion_handler op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((this->context(), - *p.p, "strand", impl, 0, "post")); - - do_post(impl, p.p, is_continuation); - p.v = p.p = 0; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_STRAND_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/impl/strand_service.ipp b/scout_sdk/asio/asio/detail/impl/strand_service.ipp deleted file mode 100644 index cbaf25b..0000000 --- a/scout_sdk/asio/asio/detail/impl/strand_service.ipp +++ /dev/null @@ -1,177 +0,0 @@ -// -// detail/impl/strand_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_STRAND_SERVICE_IPP -#define ASIO_DETAIL_IMPL_STRAND_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/call_stack.hpp" -#include "asio/detail/strand_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct strand_service::on_do_complete_exit -{ - io_context_impl* owner_; - strand_impl* impl_; - - ~on_do_complete_exit() - { - impl_->mutex_.lock(); - impl_->ready_queue_.push(impl_->waiting_queue_); - bool more_handlers = impl_->locked_ = !impl_->ready_queue_.empty(); - impl_->mutex_.unlock(); - - if (more_handlers) - owner_->post_immediate_completion(impl_, true); - } -}; - -strand_service::strand_service(asio::io_context& io_context) - : asio::detail::service_base(io_context), - io_context_(asio::use_service(io_context)), - mutex_(), - salt_(0) -{ -} - -void strand_service::shutdown() -{ - op_queue ops; - - asio::detail::mutex::scoped_lock lock(mutex_); - - for (std::size_t i = 0; i < num_implementations; ++i) - { - if (strand_impl* impl = implementations_[i].get()) - { - ops.push(impl->waiting_queue_); - ops.push(impl->ready_queue_); - } - } -} - -void strand_service::construct(strand_service::implementation_type& impl) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - std::size_t salt = salt_++; -#if defined(ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION) - std::size_t index = salt; -#else // defined(ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION) - std::size_t index = reinterpret_cast(&impl); - index += (reinterpret_cast(&impl) >> 3); - index ^= salt + 0x9e3779b9 + (index << 6) + (index >> 2); -#endif // defined(ASIO_ENABLE_SEQUENTIAL_STRAND_ALLOCATION) - index = index % num_implementations; - - if (!implementations_[index].get()) - implementations_[index].reset(new strand_impl); - impl = implementations_[index].get(); -} - -bool strand_service::running_in_this_thread( - const implementation_type& impl) const -{ - return call_stack::contains(impl) != 0; -} - -bool strand_service::do_dispatch(implementation_type& impl, operation* op) -{ - // If we are running inside the io_context, and no other handler already - // holds the strand lock, then the handler can run immediately. - bool can_dispatch = io_context_.can_dispatch(); - impl->mutex_.lock(); - if (can_dispatch && !impl->locked_) - { - // Immediate invocation is allowed. - impl->locked_ = true; - impl->mutex_.unlock(); - return true; - } - - if (impl->locked_) - { - // Some other handler already holds the strand lock. Enqueue for later. - impl->waiting_queue_.push(op); - impl->mutex_.unlock(); - } - else - { - // The handler is acquiring the strand lock and so is responsible for - // scheduling the strand. - impl->locked_ = true; - impl->mutex_.unlock(); - impl->ready_queue_.push(op); - io_context_.post_immediate_completion(impl, false); - } - - return false; -} - -void strand_service::do_post(implementation_type& impl, - operation* op, bool is_continuation) -{ - impl->mutex_.lock(); - if (impl->locked_) - { - // Some other handler already holds the strand lock. Enqueue for later. - impl->waiting_queue_.push(op); - impl->mutex_.unlock(); - } - else - { - // The handler is acquiring the strand lock and so is responsible for - // scheduling the strand. - impl->locked_ = true; - impl->mutex_.unlock(); - impl->ready_queue_.push(op); - io_context_.post_immediate_completion(impl, is_continuation); - } -} - -void strand_service::do_complete(void* owner, operation* base, - const asio::error_code& ec, std::size_t /*bytes_transferred*/) -{ - if (owner) - { - strand_impl* impl = static_cast(base); - - // Indicate that this strand is executing on the current thread. - call_stack::context ctx(impl); - - // Ensure the next handler, if any, is scheduled on block exit. - on_do_complete_exit on_exit; - on_exit.owner_ = static_cast(owner); - on_exit.impl_ = impl; - - // Run all ready handlers. No lock is required since the ready queue is - // accessed only within the strand. - while (operation* o = impl->ready_queue_.front()) - { - impl->ready_queue_.pop(); - o->complete(owner, ec, 0); - } - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_STRAND_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/throw_error.ipp b/scout_sdk/asio/asio/detail/impl/throw_error.ipp deleted file mode 100644 index a540cd2..0000000 --- a/scout_sdk/asio/asio/detail/impl/throw_error.ipp +++ /dev/null @@ -1,60 +0,0 @@ -// -// detail/impl/throw_error.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_THROW_ERROR_IPP -#define ASIO_DETAIL_IMPL_THROW_ERROR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/system_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -void do_throw_error(const asio::error_code& err) -{ - asio::system_error e(err); - asio::detail::throw_exception(e); -} - -void do_throw_error(const asio::error_code& err, const char* location) -{ - // boostify: non-boost code starts here -#if defined(ASIO_MSVC) && defined(ASIO_HAS_STD_SYSTEM_ERROR) - // Microsoft's implementation of std::system_error is non-conformant in that - // it ignores the error code's message when a "what" string is supplied. We'll - // work around this by explicitly formatting the "what" string. - std::string what_msg = location; - what_msg += ": "; - what_msg += err.message(); - asio::system_error e(err, what_msg); - asio::detail::throw_exception(e); -#else // defined(ASIO_MSVC) && defined(ASIO_HAS_STD_SYSTEM_ERROR) - // boostify: non-boost code ends here - asio::system_error e(err, location); - asio::detail::throw_exception(e); - // boostify: non-boost code starts here -#endif // defined(ASIO_MSVC) && defined(ASIO_HAS_STD_SYSTEM_ERROR) - // boostify: non-boost code ends here -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_THROW_ERROR_IPP diff --git a/scout_sdk/asio/asio/detail/impl/timer_queue_ptime.ipp b/scout_sdk/asio/asio/detail/impl/timer_queue_ptime.ipp deleted file mode 100644 index 742837f..0000000 --- a/scout_sdk/asio/asio/detail/impl/timer_queue_ptime.ipp +++ /dev/null @@ -1,91 +0,0 @@ -// -// detail/impl/timer_queue_ptime.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_TIMER_QUEUE_PTIME_IPP -#define ASIO_DETAIL_IMPL_TIMER_QUEUE_PTIME_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_DATE_TIME) - -#include "asio/detail/timer_queue_ptime.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -timer_queue >::timer_queue() -{ -} - -timer_queue >::~timer_queue() -{ -} - -bool timer_queue >::enqueue_timer( - const time_type& time, per_timer_data& timer, wait_op* op) -{ - return impl_.enqueue_timer(time, timer, op); -} - -bool timer_queue >::empty() const -{ - return impl_.empty(); -} - -long timer_queue >::wait_duration_msec( - long max_duration) const -{ - return impl_.wait_duration_msec(max_duration); -} - -long timer_queue >::wait_duration_usec( - long max_duration) const -{ - return impl_.wait_duration_usec(max_duration); -} - -void timer_queue >::get_ready_timers( - op_queue& ops) -{ - impl_.get_ready_timers(ops); -} - -void timer_queue >::get_all_timers( - op_queue& ops) -{ - impl_.get_all_timers(ops); -} - -std::size_t timer_queue >::cancel_timer( - per_timer_data& timer, op_queue& ops, std::size_t max_cancelled) -{ - return impl_.cancel_timer(timer, ops, max_cancelled); -} - -void timer_queue >::move_timer( - per_timer_data& target, per_timer_data& source) -{ - impl_.move_timer(target, source); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - -#endif // ASIO_DETAIL_IMPL_TIMER_QUEUE_PTIME_IPP diff --git a/scout_sdk/asio/asio/detail/impl/timer_queue_set.ipp b/scout_sdk/asio/asio/detail/impl/timer_queue_set.ipp deleted file mode 100644 index b516548..0000000 --- a/scout_sdk/asio/asio/detail/impl/timer_queue_set.ipp +++ /dev/null @@ -1,101 +0,0 @@ -// -// detail/impl/timer_queue_set.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_TIMER_QUEUE_SET_IPP -#define ASIO_DETAIL_IMPL_TIMER_QUEUE_SET_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/timer_queue_set.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -timer_queue_set::timer_queue_set() - : first_(0) -{ -} - -void timer_queue_set::insert(timer_queue_base* q) -{ - q->next_ = first_; - first_ = q; -} - -void timer_queue_set::erase(timer_queue_base* q) -{ - if (first_) - { - if (q == first_) - { - first_ = q->next_; - q->next_ = 0; - return; - } - - for (timer_queue_base* p = first_; p->next_; p = p->next_) - { - if (p->next_ == q) - { - p->next_ = q->next_; - q->next_ = 0; - return; - } - } - } -} - -bool timer_queue_set::all_empty() const -{ - for (timer_queue_base* p = first_; p; p = p->next_) - if (!p->empty()) - return false; - return true; -} - -long timer_queue_set::wait_duration_msec(long max_duration) const -{ - long min_duration = max_duration; - for (timer_queue_base* p = first_; p; p = p->next_) - min_duration = p->wait_duration_msec(min_duration); - return min_duration; -} - -long timer_queue_set::wait_duration_usec(long max_duration) const -{ - long min_duration = max_duration; - for (timer_queue_base* p = first_; p; p = p->next_) - min_duration = p->wait_duration_usec(min_duration); - return min_duration; -} - -void timer_queue_set::get_ready_timers(op_queue& ops) -{ - for (timer_queue_base* p = first_; p; p = p->next_) - p->get_ready_timers(ops); -} - -void timer_queue_set::get_all_timers(op_queue& ops) -{ - for (timer_queue_base* p = first_; p; p = p->next_) - p->get_all_timers(ops); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IMPL_TIMER_QUEUE_SET_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_event.ipp b/scout_sdk/asio/asio/detail/impl/win_event.ipp deleted file mode 100644 index 6f74649..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_event.ipp +++ /dev/null @@ -1,76 +0,0 @@ -// -// detail/win_event.ipp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_EVENT_IPP -#define ASIO_DETAIL_IMPL_WIN_EVENT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_event.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -win_event::win_event() - : state_(0) -{ -#if defined(ASIO_WINDOWS_APP) - events_[0] = ::CreateEventExW(0, 0, - CREATE_EVENT_MANUAL_RESET, EVENT_ALL_ACCESS); -#else // defined(ASIO_WINDOWS_APP) - events_[0] = ::CreateEventW(0, true, false, 0); -#endif // defined(ASIO_WINDOWS_APP) - if (!events_[0]) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "event"); - } - -#if defined(ASIO_WINDOWS_APP) - events_[1] = ::CreateEventExW(0, 0, 0, EVENT_ALL_ACCESS); -#else // defined(ASIO_WINDOWS_APP) - events_[1] = ::CreateEventW(0, false, false, 0); -#endif // defined(ASIO_WINDOWS_APP) - if (!events_[1]) - { - DWORD last_error = ::GetLastError(); - ::CloseHandle(events_[0]); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "event"); - } -} - -win_event::~win_event() -{ - ::CloseHandle(events_[0]); - ::CloseHandle(events_[1]); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_IMPL_WIN_EVENT_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_iocp_handle_service.ipp b/scout_sdk/asio/asio/detail/impl/win_iocp_handle_service.ipp deleted file mode 100644 index 9cba2b0..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_iocp_handle_service.ipp +++ /dev/null @@ -1,525 +0,0 @@ -// -// detail/impl/win_iocp_handle_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_IOCP_HANDLE_SERVICE_IPP -#define ASIO_DETAIL_IMPL_WIN_IOCP_HANDLE_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/win_iocp_handle_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_iocp_handle_service::overlapped_wrapper - : public OVERLAPPED -{ -public: - explicit overlapped_wrapper(asio::error_code& ec) - { - Internal = 0; - InternalHigh = 0; - Offset = 0; - OffsetHigh = 0; - - // Create a non-signalled manual-reset event, for GetOverlappedResult. - hEvent = ::CreateEventW(0, TRUE, FALSE, 0); - if (hEvent) - { - // As documented in GetQueuedCompletionStatus, setting the low order - // bit of this event prevents our synchronous writes from being treated - // as completion port events. - DWORD_PTR tmp = reinterpret_cast(hEvent); - hEvent = reinterpret_cast(tmp | 1); - } - else - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - } - - ~overlapped_wrapper() - { - if (hEvent) - { - ::CloseHandle(hEvent); - } - } -}; - -win_iocp_handle_service::win_iocp_handle_service( - asio::io_context& io_context) - : service_base(io_context), - iocp_service_(asio::use_service(io_context)), - mutex_(), - impl_list_(0) -{ -} - -void win_iocp_handle_service::shutdown() -{ - // Close all implementations, causing all operations to complete. - asio::detail::mutex::scoped_lock lock(mutex_); - implementation_type* impl = impl_list_; - while (impl) - { - close_for_destruction(*impl); - impl = impl->next_; - } -} - -void win_iocp_handle_service::construct( - win_iocp_handle_service::implementation_type& impl) -{ - impl.handle_ = INVALID_HANDLE_VALUE; - impl.safe_cancellation_thread_id_ = 0; - - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; -} - -void win_iocp_handle_service::move_construct( - win_iocp_handle_service::implementation_type& impl, - win_iocp_handle_service::implementation_type& other_impl) -{ - impl.handle_ = other_impl.handle_; - other_impl.handle_ = INVALID_HANDLE_VALUE; - - impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; - other_impl.safe_cancellation_thread_id_ = 0; - - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; -} - -void win_iocp_handle_service::move_assign( - win_iocp_handle_service::implementation_type& impl, - win_iocp_handle_service& other_service, - win_iocp_handle_service::implementation_type& other_impl) -{ - close_for_destruction(impl); - - if (this != &other_service) - { - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; - } - - impl.handle_ = other_impl.handle_; - other_impl.handle_ = INVALID_HANDLE_VALUE; - - impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; - other_impl.safe_cancellation_thread_id_ = 0; - - if (this != &other_service) - { - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(other_service.mutex_); - impl.next_ = other_service.impl_list_; - impl.prev_ = 0; - if (other_service.impl_list_) - other_service.impl_list_->prev_ = &impl; - other_service.impl_list_ = &impl; - } -} - -void win_iocp_handle_service::destroy( - win_iocp_handle_service::implementation_type& impl) -{ - close_for_destruction(impl); - - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; -} - -asio::error_code win_iocp_handle_service::assign( - win_iocp_handle_service::implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - if (iocp_service_.register_handle(handle, ec)) - return ec; - - impl.handle_ = handle; - ec = asio::error_code(); - return ec; -} - -asio::error_code win_iocp_handle_service::close( - win_iocp_handle_service::implementation_type& impl, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((iocp_service_.context(), "handle", - &impl, reinterpret_cast(impl.handle_), "close")); - - if (!::CloseHandle(impl.handle_)) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - else - { - ec = asio::error_code(); - } - - impl.handle_ = INVALID_HANDLE_VALUE; - impl.safe_cancellation_thread_id_ = 0; - } - else - { - ec = asio::error_code(); - } - - return ec; -} - -asio::error_code win_iocp_handle_service::cancel( - win_iocp_handle_service::implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return ec; - } - - ASIO_HANDLER_OPERATION((iocp_service_.context(), "handle", - &impl, reinterpret_cast(impl.handle_), "cancel")); - - if (FARPROC cancel_io_ex_ptr = ::GetProcAddress( - ::GetModuleHandleA("KERNEL32"), "CancelIoEx")) - { - // The version of Windows supports cancellation from any thread. - typedef BOOL (WINAPI* cancel_io_ex_t)(HANDLE, LPOVERLAPPED); - cancel_io_ex_t cancel_io_ex = (cancel_io_ex_t)cancel_io_ex_ptr; - if (!cancel_io_ex(impl.handle_, 0)) - { - DWORD last_error = ::GetLastError(); - if (last_error == ERROR_NOT_FOUND) - { - // ERROR_NOT_FOUND means that there were no operations to be - // cancelled. We swallow this error to match the behaviour on other - // platforms. - ec = asio::error_code(); - } - else - { - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - } - else - { - ec = asio::error_code(); - } - } - else if (impl.safe_cancellation_thread_id_ == 0) - { - // No operations have been started, so there's nothing to cancel. - ec = asio::error_code(); - } - else if (impl.safe_cancellation_thread_id_ == ::GetCurrentThreadId()) - { - // Asynchronous operations have been started from the current thread only, - // so it is safe to try to cancel them using CancelIo. - if (!::CancelIo(impl.handle_)) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - else - { - ec = asio::error_code(); - } - } - else - { - // Asynchronous operations have been started from more than one thread, - // so cancellation is not safe. - ec = asio::error::operation_not_supported; - } - - return ec; -} - -size_t win_iocp_handle_service::do_write( - win_iocp_handle_service::implementation_type& impl, uint64_t offset, - const asio::const_buffer& buffer, asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // A request to write 0 bytes on a handle is a no-op. - if (buffer.size() == 0) - { - ec = asio::error_code(); - return 0; - } - - overlapped_wrapper overlapped(ec); - if (ec) - { - return 0; - } - - // Write the data. - overlapped.Offset = offset & 0xFFFFFFFF; - overlapped.OffsetHigh = (offset >> 32) & 0xFFFFFFFF; - BOOL ok = ::WriteFile(impl.handle_, buffer.data(), - static_cast(buffer.size()), 0, &overlapped); - if (!ok) - { - DWORD last_error = ::GetLastError(); - if (last_error != ERROR_IO_PENDING) - { - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return 0; - } - } - - // Wait for the operation to complete. - DWORD bytes_transferred = 0; - ok = ::GetOverlappedResult(impl.handle_, - &overlapped, &bytes_transferred, TRUE); - if (!ok) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return 0; - } - - ec = asio::error_code(); - return bytes_transferred; -} - -void win_iocp_handle_service::start_write_op( - win_iocp_handle_service::implementation_type& impl, uint64_t offset, - const asio::const_buffer& buffer, operation* op) -{ - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - if (!is_open(impl)) - { - iocp_service_.on_completion(op, asio::error::bad_descriptor); - } - else if (buffer.size() == 0) - { - // A request to write 0 bytes on a handle is a no-op. - iocp_service_.on_completion(op); - } - else - { - DWORD bytes_transferred = 0; - op->Offset = offset & 0xFFFFFFFF; - op->OffsetHigh = (offset >> 32) & 0xFFFFFFFF; - BOOL ok = ::WriteFile(impl.handle_, buffer.data(), - static_cast(buffer.size()), - &bytes_transferred, op); - DWORD last_error = ::GetLastError(); - if (!ok && last_error != ERROR_IO_PENDING - && last_error != ERROR_MORE_DATA) - { - iocp_service_.on_completion(op, last_error, bytes_transferred); - } - else - { - iocp_service_.on_pending(op); - } - } -} - -size_t win_iocp_handle_service::do_read( - win_iocp_handle_service::implementation_type& impl, uint64_t offset, - const asio::mutable_buffer& buffer, asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return 0; - } - - // A request to read 0 bytes on a stream handle is a no-op. - if (buffer.size() == 0) - { - ec = asio::error_code(); - return 0; - } - - overlapped_wrapper overlapped(ec); - if (ec) - { - return 0; - } - - // Read some data. - overlapped.Offset = offset & 0xFFFFFFFF; - overlapped.OffsetHigh = (offset >> 32) & 0xFFFFFFFF; - BOOL ok = ::ReadFile(impl.handle_, buffer.data(), - static_cast(buffer.size()), 0, &overlapped); - if (!ok) - { - DWORD last_error = ::GetLastError(); - if (last_error != ERROR_IO_PENDING && last_error != ERROR_MORE_DATA) - { - if (last_error == ERROR_HANDLE_EOF) - { - ec = asio::error::eof; - } - else - { - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - return 0; - } - } - - // Wait for the operation to complete. - DWORD bytes_transferred = 0; - ok = ::GetOverlappedResult(impl.handle_, - &overlapped, &bytes_transferred, TRUE); - if (!ok) - { - DWORD last_error = ::GetLastError(); - if (last_error == ERROR_HANDLE_EOF) - { - ec = asio::error::eof; - } - else - { - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - return (last_error == ERROR_MORE_DATA) ? bytes_transferred : 0; - } - - ec = asio::error_code(); - return bytes_transferred; -} - -void win_iocp_handle_service::start_read_op( - win_iocp_handle_service::implementation_type& impl, uint64_t offset, - const asio::mutable_buffer& buffer, operation* op) -{ - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - if (!is_open(impl)) - { - iocp_service_.on_completion(op, asio::error::bad_descriptor); - } - else if (buffer.size() == 0) - { - // A request to read 0 bytes on a handle is a no-op. - iocp_service_.on_completion(op); - } - else - { - DWORD bytes_transferred = 0; - op->Offset = offset & 0xFFFFFFFF; - op->OffsetHigh = (offset >> 32) & 0xFFFFFFFF; - BOOL ok = ::ReadFile(impl.handle_, buffer.data(), - static_cast(buffer.size()), - &bytes_transferred, op); - DWORD last_error = ::GetLastError(); - if (!ok && last_error != ERROR_IO_PENDING - && last_error != ERROR_MORE_DATA) - { - iocp_service_.on_completion(op, last_error, bytes_transferred); - } - else - { - iocp_service_.on_pending(op); - } - } -} - -void win_iocp_handle_service::update_cancellation_thread_id( - win_iocp_handle_service::implementation_type& impl) -{ - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else if (impl.safe_cancellation_thread_id_ != ::GetCurrentThreadId()) - impl.safe_cancellation_thread_id_ = ~DWORD(0); -} - -void win_iocp_handle_service::close_for_destruction(implementation_type& impl) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((iocp_service_.context(), "handle", - &impl, reinterpret_cast(impl.handle_), "close")); - - ::CloseHandle(impl.handle_); - impl.handle_ = INVALID_HANDLE_VALUE; - impl.safe_cancellation_thread_id_ = 0; - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_IMPL_WIN_IOCP_HANDLE_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_iocp_io_context.hpp b/scout_sdk/asio/asio/detail/impl/win_iocp_io_context.hpp deleted file mode 100644 index 44887d7..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_iocp_io_context.hpp +++ /dev/null @@ -1,103 +0,0 @@ -// -// detail/impl/win_iocp_io_context.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_HPP -#define ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/completion_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -void win_iocp_io_context::add_timer_queue( - timer_queue& queue) -{ - do_add_timer_queue(queue); -} - -template -void win_iocp_io_context::remove_timer_queue( - timer_queue& queue) -{ - do_remove_timer_queue(queue); -} - -template -void win_iocp_io_context::schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op) -{ - // If the service has been shut down we silently discard the timer. - if (::InterlockedExchangeAdd(&shutdown_, 0) != 0) - { - post_immediate_completion(op, false); - return; - } - - mutex::scoped_lock lock(dispatch_mutex_); - - bool earliest = queue.enqueue_timer(time, timer, op); - work_started(); - if (earliest) - update_timeout(); -} - -template -std::size_t win_iocp_io_context::cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled) -{ - // If the service has been shut down we silently ignore the cancellation. - if (::InterlockedExchangeAdd(&shutdown_, 0) != 0) - return 0; - - mutex::scoped_lock lock(dispatch_mutex_); - op_queue ops; - std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); - post_deferred_completions(ops); - return n; -} - -template -void win_iocp_io_context::move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& to, - typename timer_queue::per_timer_data& from) -{ - asio::detail::mutex::scoped_lock lock(dispatch_mutex_); - op_queue ops; - queue.cancel_timer(to, ops); - queue.move_timer(to, from); - lock.unlock(); - post_deferred_completions(ops); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/detail/impl/win_iocp_io_context.ipp b/scout_sdk/asio/asio/detail/impl/win_iocp_io_context.ipp deleted file mode 100644 index c371b86..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_iocp_io_context.ipp +++ /dev/null @@ -1,554 +0,0 @@ -// -// detail/impl/win_iocp_io_context.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_IPP -#define ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/error.hpp" -#include "asio/detail/cstdint.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_iocp_io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct win_iocp_io_context::work_finished_on_block_exit -{ - ~work_finished_on_block_exit() - { - io_context_->work_finished(); - } - - win_iocp_io_context* io_context_; -}; - -struct win_iocp_io_context::timer_thread_function -{ - void operator()() - { - while (::InterlockedExchangeAdd(&io_context_->shutdown_, 0) == 0) - { - if (::WaitForSingleObject(io_context_->waitable_timer_.handle, - INFINITE) == WAIT_OBJECT_0) - { - ::InterlockedExchange(&io_context_->dispatch_required_, 1); - ::PostQueuedCompletionStatus(io_context_->iocp_.handle, - 0, wake_for_dispatch, 0); - } - } - } - - win_iocp_io_context* io_context_; -}; - -win_iocp_io_context::win_iocp_io_context( - asio::execution_context& ctx, int concurrency_hint) - : execution_context_service_base(ctx), - iocp_(), - outstanding_work_(0), - stopped_(0), - stop_event_posted_(0), - shutdown_(0), - gqcs_timeout_(get_gqcs_timeout()), - dispatch_required_(0), - concurrency_hint_(concurrency_hint) -{ - ASIO_HANDLER_TRACKING_INIT; - - iocp_.handle = ::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, - static_cast(concurrency_hint >= 0 ? concurrency_hint : DWORD(~0))); - if (!iocp_.handle) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "iocp"); - } -} - -void win_iocp_io_context::shutdown() -{ - ::InterlockedExchange(&shutdown_, 1); - - if (timer_thread_.get()) - { - LARGE_INTEGER timeout; - timeout.QuadPart = 1; - ::SetWaitableTimer(waitable_timer_.handle, &timeout, 1, 0, 0, FALSE); - } - - while (::InterlockedExchangeAdd(&outstanding_work_, 0) > 0) - { - op_queue ops; - timer_queues_.get_all_timers(ops); - ops.push(completed_ops_); - if (!ops.empty()) - { - while (win_iocp_operation* op = ops.front()) - { - ops.pop(); - ::InterlockedDecrement(&outstanding_work_); - op->destroy(); - } - } - else - { - DWORD bytes_transferred = 0; - dword_ptr_t completion_key = 0; - LPOVERLAPPED overlapped = 0; - ::GetQueuedCompletionStatus(iocp_.handle, &bytes_transferred, - &completion_key, &overlapped, gqcs_timeout_); - if (overlapped) - { - ::InterlockedDecrement(&outstanding_work_); - static_cast(overlapped)->destroy(); - } - } - } - - if (timer_thread_.get()) - timer_thread_->join(); -} - -asio::error_code win_iocp_io_context::register_handle( - HANDLE handle, asio::error_code& ec) -{ - if (::CreateIoCompletionPort(handle, iocp_.handle, 0, 0) == 0) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - else - { - ec = asio::error_code(); - } - return ec; -} - -size_t win_iocp_io_context::run(asio::error_code& ec) -{ - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - { - stop(); - ec = asio::error_code(); - return 0; - } - - win_iocp_thread_info this_thread; - thread_call_stack::context ctx(this, this_thread); - - size_t n = 0; - while (do_one(INFINITE, ec)) - if (n != (std::numeric_limits::max)()) - ++n; - return n; -} - -size_t win_iocp_io_context::run_one(asio::error_code& ec) -{ - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - { - stop(); - ec = asio::error_code(); - return 0; - } - - win_iocp_thread_info this_thread; - thread_call_stack::context ctx(this, this_thread); - - return do_one(INFINITE, ec); -} - -size_t win_iocp_io_context::wait_one(long usec, asio::error_code& ec) -{ - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - { - stop(); - ec = asio::error_code(); - return 0; - } - - win_iocp_thread_info this_thread; - thread_call_stack::context ctx(this, this_thread); - - return do_one(usec < 0 ? INFINITE : ((usec - 1) / 1000 + 1), ec); -} - -size_t win_iocp_io_context::poll(asio::error_code& ec) -{ - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - { - stop(); - ec = asio::error_code(); - return 0; - } - - win_iocp_thread_info this_thread; - thread_call_stack::context ctx(this, this_thread); - - size_t n = 0; - while (do_one(0, ec)) - if (n != (std::numeric_limits::max)()) - ++n; - return n; -} - -size_t win_iocp_io_context::poll_one(asio::error_code& ec) -{ - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - { - stop(); - ec = asio::error_code(); - return 0; - } - - win_iocp_thread_info this_thread; - thread_call_stack::context ctx(this, this_thread); - - return do_one(0, ec); -} - -void win_iocp_io_context::stop() -{ - if (::InterlockedExchange(&stopped_, 1) == 0) - { - if (::InterlockedExchange(&stop_event_posted_, 1) == 0) - { - if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, 0)) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "pqcs"); - } - } - } -} - -void win_iocp_io_context::post_deferred_completion(win_iocp_operation* op) -{ - // Flag the operation as ready. - op->ready_ = 1; - - // Enqueue the operation on the I/O completion port. - if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, op)) - { - // Out of resources. Put on completed queue instead. - mutex::scoped_lock lock(dispatch_mutex_); - completed_ops_.push(op); - ::InterlockedExchange(&dispatch_required_, 1); - } -} - -void win_iocp_io_context::post_deferred_completions( - op_queue& ops) -{ - while (win_iocp_operation* op = ops.front()) - { - ops.pop(); - - // Flag the operation as ready. - op->ready_ = 1; - - // Enqueue the operation on the I/O completion port. - if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, op)) - { - // Out of resources. Put on completed queue instead. - mutex::scoped_lock lock(dispatch_mutex_); - completed_ops_.push(op); - completed_ops_.push(ops); - ::InterlockedExchange(&dispatch_required_, 1); - } - } -} - -void win_iocp_io_context::abandon_operations( - op_queue& ops) -{ - while (win_iocp_operation* op = ops.front()) - { - ops.pop(); - ::InterlockedDecrement(&outstanding_work_); - op->destroy(); - } -} - -void win_iocp_io_context::on_pending(win_iocp_operation* op) -{ - if (::InterlockedCompareExchange(&op->ready_, 1, 0) == 1) - { - // Enqueue the operation on the I/O completion port. - if (!::PostQueuedCompletionStatus(iocp_.handle, - 0, overlapped_contains_result, op)) - { - // Out of resources. Put on completed queue instead. - mutex::scoped_lock lock(dispatch_mutex_); - completed_ops_.push(op); - ::InterlockedExchange(&dispatch_required_, 1); - } - } -} - -void win_iocp_io_context::on_completion(win_iocp_operation* op, - DWORD last_error, DWORD bytes_transferred) -{ - // Flag that the operation is ready for invocation. - op->ready_ = 1; - - // Store results in the OVERLAPPED structure. - op->Internal = reinterpret_cast( - &asio::error::get_system_category()); - op->Offset = last_error; - op->OffsetHigh = bytes_transferred; - - // Enqueue the operation on the I/O completion port. - if (!::PostQueuedCompletionStatus(iocp_.handle, - 0, overlapped_contains_result, op)) - { - // Out of resources. Put on completed queue instead. - mutex::scoped_lock lock(dispatch_mutex_); - completed_ops_.push(op); - ::InterlockedExchange(&dispatch_required_, 1); - } -} - -void win_iocp_io_context::on_completion(win_iocp_operation* op, - const asio::error_code& ec, DWORD bytes_transferred) -{ - // Flag that the operation is ready for invocation. - op->ready_ = 1; - - // Store results in the OVERLAPPED structure. - op->Internal = reinterpret_cast(&ec.category()); - op->Offset = ec.value(); - op->OffsetHigh = bytes_transferred; - - // Enqueue the operation on the I/O completion port. - if (!::PostQueuedCompletionStatus(iocp_.handle, - 0, overlapped_contains_result, op)) - { - // Out of resources. Put on completed queue instead. - mutex::scoped_lock lock(dispatch_mutex_); - completed_ops_.push(op); - ::InterlockedExchange(&dispatch_required_, 1); - } -} - -size_t win_iocp_io_context::do_one(DWORD msec, asio::error_code& ec) -{ - for (;;) - { - // Try to acquire responsibility for dispatching timers and completed ops. - if (::InterlockedCompareExchange(&dispatch_required_, 0, 1) == 1) - { - mutex::scoped_lock lock(dispatch_mutex_); - - // Dispatch pending timers and operations. - op_queue ops; - ops.push(completed_ops_); - timer_queues_.get_ready_timers(ops); - post_deferred_completions(ops); - update_timeout(); - } - - // Get the next operation from the queue. - DWORD bytes_transferred = 0; - dword_ptr_t completion_key = 0; - LPOVERLAPPED overlapped = 0; - ::SetLastError(0); - BOOL ok = ::GetQueuedCompletionStatus(iocp_.handle, - &bytes_transferred, &completion_key, &overlapped, - msec < gqcs_timeout_ ? msec : gqcs_timeout_); - DWORD last_error = ::GetLastError(); - - if (overlapped) - { - win_iocp_operation* op = static_cast(overlapped); - asio::error_code result_ec(last_error, - asio::error::get_system_category()); - - // We may have been passed the last_error and bytes_transferred in the - // OVERLAPPED structure itself. - if (completion_key == overlapped_contains_result) - { - result_ec = asio::error_code(static_cast(op->Offset), - *reinterpret_cast(op->Internal)); - bytes_transferred = op->OffsetHigh; - } - - // Otherwise ensure any result has been saved into the OVERLAPPED - // structure. - else - { - op->Internal = reinterpret_cast(&result_ec.category()); - op->Offset = result_ec.value(); - op->OffsetHigh = bytes_transferred; - } - - // Dispatch the operation only if ready. The operation may not be ready - // if the initiating function (e.g. a call to WSARecv) has not yet - // returned. This is because the initiating function still wants access - // to the operation's OVERLAPPED structure. - if (::InterlockedCompareExchange(&op->ready_, 1, 0) == 1) - { - // Ensure the count of outstanding work is decremented on block exit. - work_finished_on_block_exit on_exit = { this }; - (void)on_exit; - - op->complete(this, result_ec, bytes_transferred); - ec = asio::error_code(); - return 1; - } - } - else if (!ok) - { - if (last_error != WAIT_TIMEOUT) - { - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return 0; - } - - // If we're waiting indefinitely we need to keep going until we get a - // real handler. - if (msec == INFINITE) - continue; - - ec = asio::error_code(); - return 0; - } - else if (completion_key == wake_for_dispatch) - { - // We have been woken up to try to acquire responsibility for dispatching - // timers and completed operations. - } - else - { - // Indicate that there is no longer an in-flight stop event. - ::InterlockedExchange(&stop_event_posted_, 0); - - // The stopped_ flag is always checked to ensure that any leftover - // stop events from a previous run invocation are ignored. - if (::InterlockedExchangeAdd(&stopped_, 0) != 0) - { - // Wake up next thread that is blocked on GetQueuedCompletionStatus. - if (::InterlockedExchange(&stop_event_posted_, 1) == 0) - { - if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, 0)) - { - last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return 0; - } - } - - ec = asio::error_code(); - return 0; - } - } - } -} - -DWORD win_iocp_io_context::get_gqcs_timeout() -{ - OSVERSIONINFOEX osvi; - ZeroMemory(&osvi, sizeof(osvi)); - osvi.dwOSVersionInfoSize = sizeof(osvi); - osvi.dwMajorVersion = 6ul; - - const uint64_t condition_mask = ::VerSetConditionMask( - 0, VER_MAJORVERSION, VER_GREATER_EQUAL); - - if (!!::VerifyVersionInfo(&osvi, VER_MAJORVERSION, condition_mask)) - return INFINITE; - - return default_gqcs_timeout; -} - -void win_iocp_io_context::do_add_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(dispatch_mutex_); - - timer_queues_.insert(&queue); - - if (!waitable_timer_.handle) - { - waitable_timer_.handle = ::CreateWaitableTimer(0, FALSE, 0); - if (waitable_timer_.handle == 0) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "timer"); - } - - LARGE_INTEGER timeout; - timeout.QuadPart = -max_timeout_usec; - timeout.QuadPart *= 10; - ::SetWaitableTimer(waitable_timer_.handle, - &timeout, max_timeout_msec, 0, 0, FALSE); - } - - if (!timer_thread_.get()) - { - timer_thread_function thread_function = { this }; - timer_thread_.reset(new thread(thread_function, 65536)); - } -} - -void win_iocp_io_context::do_remove_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(dispatch_mutex_); - - timer_queues_.erase(&queue); -} - -void win_iocp_io_context::update_timeout() -{ - if (timer_thread_.get()) - { - // There's no point updating the waitable timer if the new timeout period - // exceeds the maximum timeout. In that case, we might as well wait for the - // existing period of the timer to expire. - long timeout_usec = timer_queues_.wait_duration_usec(max_timeout_usec); - if (timeout_usec < max_timeout_usec) - { - LARGE_INTEGER timeout; - timeout.QuadPart = -timeout_usec; - timeout.QuadPart *= 10; - ::SetWaitableTimer(waitable_timer_.handle, - &timeout, max_timeout_msec, 0, 0, FALSE); - } - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_IMPL_WIN_IOCP_IO_CONTEXT_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_iocp_serial_port_service.ipp b/scout_sdk/asio/asio/detail/impl/win_iocp_serial_port_service.ipp deleted file mode 100644 index 4a9b8cd..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_iocp_serial_port_service.ipp +++ /dev/null @@ -1,181 +0,0 @@ -// -// detail/impl/win_iocp_serial_port_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_IOCP_SERIAL_PORT_SERVICE_IPP -#define ASIO_DETAIL_IMPL_WIN_IOCP_SERIAL_PORT_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) - -#include -#include "asio/detail/win_iocp_serial_port_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -win_iocp_serial_port_service::win_iocp_serial_port_service( - asio::io_context& io_context) - : service_base(io_context), - handle_service_(io_context) -{ -} - -void win_iocp_serial_port_service::shutdown() -{ -} - -asio::error_code win_iocp_serial_port_service::open( - win_iocp_serial_port_service::implementation_type& impl, - const std::string& device, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - // For convenience, add a leading \\.\ sequence if not already present. - std::string name = (device[0] == '\\') ? device : "\\\\.\\" + device; - - // Open a handle to the serial port. - ::HANDLE handle = ::CreateFileA(name.c_str(), - GENERIC_READ | GENERIC_WRITE, 0, 0, - OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0); - if (handle == INVALID_HANDLE_VALUE) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return ec; - } - - // Determine the initial serial port parameters. - using namespace std; // For memset. - ::DCB dcb; - memset(&dcb, 0, sizeof(DCB)); - dcb.DCBlength = sizeof(DCB); - if (!::GetCommState(handle, &dcb)) - { - DWORD last_error = ::GetLastError(); - ::CloseHandle(handle); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return ec; - } - - // Set some default serial port parameters. This implementation does not - // support changing these, so they might as well be in a known state. - dcb.fBinary = TRUE; // Win32 only supports binary mode. - dcb.fDsrSensitivity = FALSE; - dcb.fNull = FALSE; // Do not ignore NULL characters. - dcb.fAbortOnError = FALSE; // Ignore serial framing errors. - if (!::SetCommState(handle, &dcb)) - { - DWORD last_error = ::GetLastError(); - ::CloseHandle(handle); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return ec; - } - - // Set up timeouts so that the serial port will behave similarly to a - // network socket. Reads wait for at least one byte, then return with - // whatever they have. Writes return once everything is out the door. - ::COMMTIMEOUTS timeouts; - timeouts.ReadIntervalTimeout = 1; - timeouts.ReadTotalTimeoutMultiplier = 0; - timeouts.ReadTotalTimeoutConstant = 0; - timeouts.WriteTotalTimeoutMultiplier = 0; - timeouts.WriteTotalTimeoutConstant = 0; - if (!::SetCommTimeouts(handle, &timeouts)) - { - DWORD last_error = ::GetLastError(); - ::CloseHandle(handle); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return ec; - } - - // We're done. Take ownership of the serial port handle. - if (handle_service_.assign(impl, handle, ec)) - ::CloseHandle(handle); - return ec; -} - -asio::error_code win_iocp_serial_port_service::do_set_option( - win_iocp_serial_port_service::implementation_type& impl, - win_iocp_serial_port_service::store_function_type store, - const void* option, asio::error_code& ec) -{ - using namespace std; // For memcpy. - - ::DCB dcb; - memset(&dcb, 0, sizeof(DCB)); - dcb.DCBlength = sizeof(DCB); - if (!::GetCommState(handle_service_.native_handle(impl), &dcb)) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return ec; - } - - if (store(option, dcb, ec)) - return ec; - - if (!::SetCommState(handle_service_.native_handle(impl), &dcb)) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return ec; - } - - ec = asio::error_code(); - return ec; -} - -asio::error_code win_iocp_serial_port_service::do_get_option( - const win_iocp_serial_port_service::implementation_type& impl, - win_iocp_serial_port_service::load_function_type load, - void* option, asio::error_code& ec) const -{ - using namespace std; // For memset. - - ::DCB dcb; - memset(&dcb, 0, sizeof(DCB)); - dcb.DCBlength = sizeof(DCB); - if (!::GetCommState(handle_service_.native_handle(impl), &dcb)) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - return ec; - } - - return load(option, dcb, ec); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) - -#endif // ASIO_DETAIL_IMPL_WIN_IOCP_SERIAL_PORT_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_iocp_socket_service_base.ipp b/scout_sdk/asio/asio/detail/impl/win_iocp_socket_service_base.ipp deleted file mode 100644 index 6c478cd..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_iocp_socket_service_base.ipp +++ /dev/null @@ -1,799 +0,0 @@ -// -// detail/impl/win_iocp_socket_service_base.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_IOCP_SOCKET_SERVICE_BASE_IPP -#define ASIO_DETAIL_IMPL_WIN_IOCP_SOCKET_SERVICE_BASE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/win_iocp_socket_service_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -win_iocp_socket_service_base::win_iocp_socket_service_base( - asio::io_context& io_context) - : io_context_(io_context), - iocp_service_(use_service(io_context)), - reactor_(0), - connect_ex_(0), - nt_set_info_(0), - mutex_(), - impl_list_(0) -{ -} - -void win_iocp_socket_service_base::base_shutdown() -{ - // Close all implementations, causing all operations to complete. - asio::detail::mutex::scoped_lock lock(mutex_); - base_implementation_type* impl = impl_list_; - while (impl) - { - close_for_destruction(*impl); - impl = impl->next_; - } -} - -void win_iocp_socket_service_base::construct( - win_iocp_socket_service_base::base_implementation_type& impl) -{ - impl.socket_ = invalid_socket; - impl.state_ = 0; - impl.cancel_token_.reset(); -#if defined(ASIO_ENABLE_CANCELIO) - impl.safe_cancellation_thread_id_ = 0; -#endif // defined(ASIO_ENABLE_CANCELIO) - - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; -} - -void win_iocp_socket_service_base::base_move_construct( - win_iocp_socket_service_base::base_implementation_type& impl, - win_iocp_socket_service_base::base_implementation_type& other_impl) -{ - impl.socket_ = other_impl.socket_; - other_impl.socket_ = invalid_socket; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - impl.cancel_token_ = other_impl.cancel_token_; - other_impl.cancel_token_.reset(); - -#if defined(ASIO_ENABLE_CANCELIO) - impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; - other_impl.safe_cancellation_thread_id_ = 0; -#endif // defined(ASIO_ENABLE_CANCELIO) - - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; -} - -void win_iocp_socket_service_base::base_move_assign( - win_iocp_socket_service_base::base_implementation_type& impl, - win_iocp_socket_service_base& other_service, - win_iocp_socket_service_base::base_implementation_type& other_impl) -{ - close_for_destruction(impl); - - if (this != &other_service) - { - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; - } - - impl.socket_ = other_impl.socket_; - other_impl.socket_ = invalid_socket; - - impl.state_ = other_impl.state_; - other_impl.state_ = 0; - - impl.cancel_token_ = other_impl.cancel_token_; - other_impl.cancel_token_.reset(); - -#if defined(ASIO_ENABLE_CANCELIO) - impl.safe_cancellation_thread_id_ = other_impl.safe_cancellation_thread_id_; - other_impl.safe_cancellation_thread_id_ = 0; -#endif // defined(ASIO_ENABLE_CANCELIO) - - if (this != &other_service) - { - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(other_service.mutex_); - impl.next_ = other_service.impl_list_; - impl.prev_ = 0; - if (other_service.impl_list_) - other_service.impl_list_->prev_ = &impl; - other_service.impl_list_ = &impl; - } -} - -void win_iocp_socket_service_base::destroy( - win_iocp_socket_service_base::base_implementation_type& impl) -{ - close_for_destruction(impl); - - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; -} - -asio::error_code win_iocp_socket_service_base::close( - win_iocp_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((iocp_service_.context(), - "socket", &impl, impl.socket_, "close")); - - // Check if the reactor was created, in which case we need to close the - // socket on the reactor as well to cancel any operations that might be - // running there. - select_reactor* r = static_cast( - interlocked_compare_exchange_pointer( - reinterpret_cast(&reactor_), 0, 0)); - if (r) - r->deregister_descriptor(impl.socket_, impl.reactor_data_, true); - - socket_ops::close(impl.socket_, impl.state_, false, ec); - - if (r) - r->cleanup_descriptor_data(impl.reactor_data_); - } - else - { - ec = asio::error_code(); - } - - impl.socket_ = invalid_socket; - impl.state_ = 0; - impl.cancel_token_.reset(); -#if defined(ASIO_ENABLE_CANCELIO) - impl.safe_cancellation_thread_id_ = 0; -#endif // defined(ASIO_ENABLE_CANCELIO) - - return ec; -} - -socket_type win_iocp_socket_service_base::release( - win_iocp_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - return invalid_socket; - - cancel(impl, ec); - if (ec) - return invalid_socket; - - nt_set_info_fn fn = get_nt_set_info(); - if (fn == 0) - { - ec = asio::error::operation_not_supported; - return invalid_socket; - } - - HANDLE sock_as_handle = reinterpret_cast(impl.socket_); - ULONG_PTR iosb[2] = { 0, 0 }; - void* info[2] = { 0, 0 }; - if (fn(sock_as_handle, iosb, &info, sizeof(info), - 61 /* FileReplaceCompletionInformation */)) - { - ec = asio::error::operation_not_supported; - return invalid_socket; - } - - socket_type tmp = impl.socket_; - impl.socket_ = invalid_socket; - return tmp; -} - -asio::error_code win_iocp_socket_service_base::cancel( - win_iocp_socket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return ec; - } - - ASIO_HANDLER_OPERATION((iocp_service_.context(), - "socket", &impl, impl.socket_, "cancel")); - - if (FARPROC cancel_io_ex_ptr = ::GetProcAddress( - ::GetModuleHandleA("KERNEL32"), "CancelIoEx")) - { - // The version of Windows supports cancellation from any thread. - typedef BOOL (WINAPI* cancel_io_ex_t)(HANDLE, LPOVERLAPPED); - cancel_io_ex_t cancel_io_ex = (cancel_io_ex_t)cancel_io_ex_ptr; - socket_type sock = impl.socket_; - HANDLE sock_as_handle = reinterpret_cast(sock); - if (!cancel_io_ex(sock_as_handle, 0)) - { - DWORD last_error = ::GetLastError(); - if (last_error == ERROR_NOT_FOUND) - { - // ERROR_NOT_FOUND means that there were no operations to be - // cancelled. We swallow this error to match the behaviour on other - // platforms. - ec = asio::error_code(); - } - else - { - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - } - else - { - ec = asio::error_code(); - } - } -#if defined(ASIO_ENABLE_CANCELIO) - else if (impl.safe_cancellation_thread_id_ == 0) - { - // No operations have been started, so there's nothing to cancel. - ec = asio::error_code(); - } - else if (impl.safe_cancellation_thread_id_ == ::GetCurrentThreadId()) - { - // Asynchronous operations have been started from the current thread only, - // so it is safe to try to cancel them using CancelIo. - socket_type sock = impl.socket_; - HANDLE sock_as_handle = reinterpret_cast(sock); - if (!::CancelIo(sock_as_handle)) - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - else - { - ec = asio::error_code(); - } - } - else - { - // Asynchronous operations have been started from more than one thread, - // so cancellation is not safe. - ec = asio::error::operation_not_supported; - } -#else // defined(ASIO_ENABLE_CANCELIO) - else - { - // Cancellation is not supported as CancelIo may not be used. - ec = asio::error::operation_not_supported; - } -#endif // defined(ASIO_ENABLE_CANCELIO) - - // Cancel any operations started via the reactor. - if (!ec) - { - select_reactor* r = static_cast( - interlocked_compare_exchange_pointer( - reinterpret_cast(&reactor_), 0, 0)); - if (r) - r->cancel_ops(impl.socket_, impl.reactor_data_); - } - - return ec; -} - -asio::error_code win_iocp_socket_service_base::do_open( - win_iocp_socket_service_base::base_implementation_type& impl, - int family, int type, int protocol, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - socket_holder sock(socket_ops::socket(family, type, protocol, ec)); - if (sock.get() == invalid_socket) - return ec; - - HANDLE sock_as_handle = reinterpret_cast(sock.get()); - if (iocp_service_.register_handle(sock_as_handle, ec)) - return ec; - - impl.socket_ = sock.release(); - switch (type) - { - case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; - case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; - default: impl.state_ = 0; break; - } - impl.cancel_token_.reset(static_cast(0), socket_ops::noop_deleter()); - ec = asio::error_code(); - return ec; -} - -asio::error_code win_iocp_socket_service_base::do_assign( - win_iocp_socket_service_base::base_implementation_type& impl, - int type, socket_type native_socket, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - HANDLE sock_as_handle = reinterpret_cast(native_socket); - if (iocp_service_.register_handle(sock_as_handle, ec)) - return ec; - - impl.socket_ = native_socket; - switch (type) - { - case SOCK_STREAM: impl.state_ = socket_ops::stream_oriented; break; - case SOCK_DGRAM: impl.state_ = socket_ops::datagram_oriented; break; - default: impl.state_ = 0; break; - } - impl.cancel_token_.reset(static_cast(0), socket_ops::noop_deleter()); - ec = asio::error_code(); - return ec; -} - -void win_iocp_socket_service_base::start_send_op( - win_iocp_socket_service_base::base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, - socket_base::message_flags flags, bool noop, operation* op) -{ - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - if (noop) - iocp_service_.on_completion(op); - else if (!is_open(impl)) - iocp_service_.on_completion(op, asio::error::bad_descriptor); - else - { - DWORD bytes_transferred = 0; - int result = ::WSASend(impl.socket_, buffers, - static_cast(buffer_count), &bytes_transferred, flags, op, 0); - DWORD last_error = ::WSAGetLastError(); - if (last_error == ERROR_PORT_UNREACHABLE) - last_error = WSAECONNREFUSED; - if (result != 0 && last_error != WSA_IO_PENDING) - iocp_service_.on_completion(op, last_error, bytes_transferred); - else - iocp_service_.on_pending(op); - } -} - -void win_iocp_socket_service_base::start_send_to_op( - win_iocp_socket_service_base::base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, - const socket_addr_type* addr, int addrlen, - socket_base::message_flags flags, operation* op) -{ - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - if (!is_open(impl)) - iocp_service_.on_completion(op, asio::error::bad_descriptor); - else - { - DWORD bytes_transferred = 0; - int result = ::WSASendTo(impl.socket_, buffers, - static_cast(buffer_count), - &bytes_transferred, flags, addr, addrlen, op, 0); - DWORD last_error = ::WSAGetLastError(); - if (last_error == ERROR_PORT_UNREACHABLE) - last_error = WSAECONNREFUSED; - if (result != 0 && last_error != WSA_IO_PENDING) - iocp_service_.on_completion(op, last_error, bytes_transferred); - else - iocp_service_.on_pending(op); - } -} - -void win_iocp_socket_service_base::start_receive_op( - win_iocp_socket_service_base::base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, - socket_base::message_flags flags, bool noop, operation* op) -{ - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - if (noop) - iocp_service_.on_completion(op); - else if (!is_open(impl)) - iocp_service_.on_completion(op, asio::error::bad_descriptor); - else - { - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = ::WSARecv(impl.socket_, buffers, - static_cast(buffer_count), - &bytes_transferred, &recv_flags, op, 0); - DWORD last_error = ::WSAGetLastError(); - if (last_error == ERROR_NETNAME_DELETED) - last_error = WSAECONNRESET; - else if (last_error == ERROR_PORT_UNREACHABLE) - last_error = WSAECONNREFUSED; - if (result != 0 && last_error != WSA_IO_PENDING) - iocp_service_.on_completion(op, last_error, bytes_transferred); - else - iocp_service_.on_pending(op); - } -} - -void win_iocp_socket_service_base::start_null_buffers_receive_op( - win_iocp_socket_service_base::base_implementation_type& impl, - socket_base::message_flags flags, reactor_op* op) -{ - if ((impl.state_ & socket_ops::stream_oriented) != 0) - { - // For stream sockets on Windows, we may issue a 0-byte overlapped - // WSARecv to wait until there is data available on the socket. - ::WSABUF buf = { 0, 0 }; - start_receive_op(impl, &buf, 1, flags, false, op); - } - else - { - start_reactor_op(impl, - (flags & socket_base::message_out_of_band) - ? select_reactor::except_op : select_reactor::read_op, - op); - } -} - -void win_iocp_socket_service_base::start_receive_from_op( - win_iocp_socket_service_base::base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, socket_addr_type* addr, - socket_base::message_flags flags, int* addrlen, operation* op) -{ - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - if (!is_open(impl)) - iocp_service_.on_completion(op, asio::error::bad_descriptor); - else - { - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = ::WSARecvFrom(impl.socket_, buffers, - static_cast(buffer_count), - &bytes_transferred, &recv_flags, addr, addrlen, op, 0); - DWORD last_error = ::WSAGetLastError(); - if (last_error == ERROR_PORT_UNREACHABLE) - last_error = WSAECONNREFUSED; - if (result != 0 && last_error != WSA_IO_PENDING) - iocp_service_.on_completion(op, last_error, bytes_transferred); - else - iocp_service_.on_pending(op); - } -} - -void win_iocp_socket_service_base::start_accept_op( - win_iocp_socket_service_base::base_implementation_type& impl, - bool peer_is_open, socket_holder& new_socket, int family, int type, - int protocol, void* output_buffer, DWORD address_length, operation* op) -{ - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - if (!is_open(impl)) - iocp_service_.on_completion(op, asio::error::bad_descriptor); - else if (peer_is_open) - iocp_service_.on_completion(op, asio::error::already_open); - else - { - asio::error_code ec; - new_socket.reset(socket_ops::socket(family, type, protocol, ec)); - if (new_socket.get() == invalid_socket) - iocp_service_.on_completion(op, ec); - else - { - DWORD bytes_read = 0; - BOOL result = ::AcceptEx(impl.socket_, new_socket.get(), output_buffer, - 0, address_length, address_length, &bytes_read, op); - DWORD last_error = ::WSAGetLastError(); - if (!result && last_error != WSA_IO_PENDING) - iocp_service_.on_completion(op, last_error); - else - iocp_service_.on_pending(op); - } - } -} - -void win_iocp_socket_service_base::restart_accept_op( - socket_type s, socket_holder& new_socket, int family, int type, - int protocol, void* output_buffer, DWORD address_length, operation* op) -{ - new_socket.reset(); - iocp_service_.work_started(); - - asio::error_code ec; - new_socket.reset(socket_ops::socket(family, type, protocol, ec)); - if (new_socket.get() == invalid_socket) - iocp_service_.on_completion(op, ec); - else - { - DWORD bytes_read = 0; - BOOL result = ::AcceptEx(s, new_socket.get(), output_buffer, - 0, address_length, address_length, &bytes_read, op); - DWORD last_error = ::WSAGetLastError(); - if (!result && last_error != WSA_IO_PENDING) - iocp_service_.on_completion(op, last_error); - else - iocp_service_.on_pending(op); - } -} - -void win_iocp_socket_service_base::start_reactor_op( - win_iocp_socket_service_base::base_implementation_type& impl, - int op_type, reactor_op* op) -{ - select_reactor& r = get_reactor(); - update_cancellation_thread_id(impl); - - if (is_open(impl)) - { - r.start_op(op_type, impl.socket_, impl.reactor_data_, op, false, false); - return; - } - else - op->ec_ = asio::error::bad_descriptor; - - iocp_service_.post_immediate_completion(op, false); -} - -void win_iocp_socket_service_base::start_connect_op( - win_iocp_socket_service_base::base_implementation_type& impl, - int family, int type, const socket_addr_type* addr, - std::size_t addrlen, win_iocp_socket_connect_op_base* op) -{ - // If ConnectEx is available, use that. - if (family == ASIO_OS_DEF(AF_INET) - || family == ASIO_OS_DEF(AF_INET6)) - { - if (connect_ex_fn connect_ex = get_connect_ex(impl, type)) - { - union address_union - { - socket_addr_type base; - sockaddr_in4_type v4; - sockaddr_in6_type v6; - } a; - - using namespace std; // For memset. - memset(&a, 0, sizeof(a)); - a.base.sa_family = family; - - socket_ops::bind(impl.socket_, &a.base, - family == ASIO_OS_DEF(AF_INET) - ? sizeof(a.v4) : sizeof(a.v6), op->ec_); - if (op->ec_ && op->ec_ != asio::error::invalid_argument) - { - iocp_service_.post_immediate_completion(op, false); - return; - } - - op->connect_ex_ = true; - update_cancellation_thread_id(impl); - iocp_service_.work_started(); - - BOOL result = connect_ex(impl.socket_, - addr, static_cast(addrlen), 0, 0, 0, op); - DWORD last_error = ::WSAGetLastError(); - if (!result && last_error != WSA_IO_PENDING) - iocp_service_.on_completion(op, last_error); - else - iocp_service_.on_pending(op); - return; - } - } - - // Otherwise, fall back to a reactor-based implementation. - select_reactor& r = get_reactor(); - update_cancellation_thread_id(impl); - - if ((impl.state_ & socket_ops::non_blocking) != 0 - || socket_ops::set_internal_non_blocking( - impl.socket_, impl.state_, true, op->ec_)) - { - if (socket_ops::connect(impl.socket_, addr, addrlen, op->ec_) != 0) - { - if (op->ec_ == asio::error::in_progress - || op->ec_ == asio::error::would_block) - { - op->ec_ = asio::error_code(); - r.start_op(select_reactor::connect_op, impl.socket_, - impl.reactor_data_, op, false, false); - return; - } - } - } - - r.post_immediate_completion(op, false); -} - -void win_iocp_socket_service_base::close_for_destruction( - win_iocp_socket_service_base::base_implementation_type& impl) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((iocp_service_.context(), - "socket", &impl, impl.socket_, "close")); - - // Check if the reactor was created, in which case we need to close the - // socket on the reactor as well to cancel any operations that might be - // running there. - select_reactor* r = static_cast( - interlocked_compare_exchange_pointer( - reinterpret_cast(&reactor_), 0, 0)); - if (r) - r->deregister_descriptor(impl.socket_, impl.reactor_data_, true); - - asio::error_code ignored_ec; - socket_ops::close(impl.socket_, impl.state_, true, ignored_ec); - - if (r) - r->cleanup_descriptor_data(impl.reactor_data_); - } - - impl.socket_ = invalid_socket; - impl.state_ = 0; - impl.cancel_token_.reset(); -#if defined(ASIO_ENABLE_CANCELIO) - impl.safe_cancellation_thread_id_ = 0; -#endif // defined(ASIO_ENABLE_CANCELIO) -} - -void win_iocp_socket_service_base::update_cancellation_thread_id( - win_iocp_socket_service_base::base_implementation_type& impl) -{ -#if defined(ASIO_ENABLE_CANCELIO) - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else if (impl.safe_cancellation_thread_id_ != ::GetCurrentThreadId()) - impl.safe_cancellation_thread_id_ = ~DWORD(0); -#else // defined(ASIO_ENABLE_CANCELIO) - (void)impl; -#endif // defined(ASIO_ENABLE_CANCELIO) -} - -select_reactor& win_iocp_socket_service_base::get_reactor() -{ - select_reactor* r = static_cast( - interlocked_compare_exchange_pointer( - reinterpret_cast(&reactor_), 0, 0)); - if (!r) - { - r = &(use_service(io_context_)); - interlocked_exchange_pointer(reinterpret_cast(&reactor_), r); - } - return *r; -} - -win_iocp_socket_service_base::connect_ex_fn -win_iocp_socket_service_base::get_connect_ex( - win_iocp_socket_service_base::base_implementation_type& impl, int type) -{ -#if defined(ASIO_DISABLE_CONNECTEX) - (void)impl; - (void)type; - return 0; -#else // defined(ASIO_DISABLE_CONNECTEX) - if (type != ASIO_OS_DEF(SOCK_STREAM) - && type != ASIO_OS_DEF(SOCK_SEQPACKET)) - return 0; - - void* ptr = interlocked_compare_exchange_pointer(&connect_ex_, 0, 0); - if (!ptr) - { - GUID guid = { 0x25a207b9, 0xddf3, 0x4660, - { 0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e } }; - - DWORD bytes = 0; - if (::WSAIoctl(impl.socket_, SIO_GET_EXTENSION_FUNCTION_POINTER, - &guid, sizeof(guid), &ptr, sizeof(ptr), &bytes, 0, 0) != 0) - { - // Set connect_ex_ to a special value to indicate that ConnectEx is - // unavailable. That way we won't bother trying to look it up again. - ptr = this; - } - - interlocked_exchange_pointer(&connect_ex_, ptr); - } - - return reinterpret_cast(ptr == this ? 0 : ptr); -#endif // defined(ASIO_DISABLE_CONNECTEX) -} - -win_iocp_socket_service_base::nt_set_info_fn -win_iocp_socket_service_base::get_nt_set_info() -{ - void* ptr = interlocked_compare_exchange_pointer(&nt_set_info_, 0, 0); - if (!ptr) - { - if (HMODULE h = ::GetModuleHandleA("NTDLL.DLL")) - ptr = reinterpret_cast(GetProcAddress(h, "NtSetInformationFile")); - - // On failure, set nt_set_info_ to a special value to indicate that the - // NtSetInformationFile function is unavailable. That way we won't bother - // trying to look it up again. - interlocked_exchange_pointer(&nt_set_info_, ptr ? ptr : this); - } - - return reinterpret_cast(ptr == this ? 0 : ptr); -} - -void* win_iocp_socket_service_base::interlocked_compare_exchange_pointer( - void** dest, void* exch, void* cmp) -{ -#if defined(_M_IX86) - return reinterpret_cast(InterlockedCompareExchange( - reinterpret_cast(dest), reinterpret_cast(exch), - reinterpret_cast(cmp))); -#else - return InterlockedCompareExchangePointer(dest, exch, cmp); -#endif -} - -void* win_iocp_socket_service_base::interlocked_exchange_pointer( - void** dest, void* val) -{ -#if defined(_M_IX86) - return reinterpret_cast(InterlockedExchange( - reinterpret_cast(dest), reinterpret_cast(val))); -#else - return InterlockedExchangePointer(dest, val); -#endif -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_IMPL_WIN_IOCP_SOCKET_SERVICE_BASE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_mutex.ipp b/scout_sdk/asio/asio/detail/impl/win_mutex.ipp deleted file mode 100644 index dc58a12..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_mutex.ipp +++ /dev/null @@ -1,84 +0,0 @@ -// -// detail/impl/win_mutex.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_MUTEX_IPP -#define ASIO_DETAIL_IMPL_WIN_MUTEX_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_mutex.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -win_mutex::win_mutex() -{ - int error = do_init(); - asio::error_code ec(error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "mutex"); -} - -int win_mutex::do_init() -{ -#if defined(__MINGW32__) - // Not sure if MinGW supports structured exception handling, so for now - // we'll just call the Windows API and hope. -# if defined(UNDER_CE) - ::InitializeCriticalSection(&crit_section_); -# elif defined(ASIO_WINDOWS_APP) - if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0)) - return ::GetLastError(); -# else - if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) - return ::GetLastError(); -# endif - return 0; -#else - __try - { -# if defined(UNDER_CE) - ::InitializeCriticalSection(&crit_section_); -# elif defined(ASIO_WINDOWS_APP) - if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0)) - return ::GetLastError(); -# else - if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) - return ::GetLastError(); -# endif - } - __except(GetExceptionCode() == STATUS_NO_MEMORY - ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) - { - return ERROR_OUTOFMEMORY; - } - - return 0; -#endif -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_IMPL_WIN_MUTEX_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_object_handle_service.ipp b/scout_sdk/asio/asio/detail/impl/win_object_handle_service.ipp deleted file mode 100644 index c5e59d1..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_object_handle_service.ipp +++ /dev/null @@ -1,449 +0,0 @@ -// -// detail/impl/win_object_handle_service.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2011 Boris Schaeling (boris@highscore.de) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_OBJECT_HANDLE_SERVICE_IPP -#define ASIO_DETAIL_IMPL_WIN_OBJECT_HANDLE_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - -#include "asio/detail/win_object_handle_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -win_object_handle_service::win_object_handle_service( - asio::io_context& io_context) - : service_base(io_context), - io_context_(asio::use_service(io_context)), - mutex_(), - impl_list_(0), - shutdown_(false) -{ -} - -void win_object_handle_service::shutdown() -{ - mutex::scoped_lock lock(mutex_); - - // Setting this flag to true prevents new objects from being registered, and - // new asynchronous wait operations from being started. We only need to worry - // about cleaning up the operations that are currently in progress. - shutdown_ = true; - - op_queue ops; - for (implementation_type* impl = impl_list_; impl; impl = impl->next_) - ops.push(impl->op_queue_); - - lock.unlock(); - - io_context_.abandon_operations(ops); -} - -void win_object_handle_service::construct( - win_object_handle_service::implementation_type& impl) -{ - impl.handle_ = INVALID_HANDLE_VALUE; - impl.wait_handle_ = INVALID_HANDLE_VALUE; - impl.owner_ = this; - - // Insert implementation into linked list of all implementations. - mutex::scoped_lock lock(mutex_); - if (!shutdown_) - { - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; - } -} - -void win_object_handle_service::move_construct( - win_object_handle_service::implementation_type& impl, - win_object_handle_service::implementation_type& other_impl) -{ - mutex::scoped_lock lock(mutex_); - - // Insert implementation into linked list of all implementations. - if (!shutdown_) - { - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; - } - - impl.handle_ = other_impl.handle_; - other_impl.handle_ = INVALID_HANDLE_VALUE; - impl.wait_handle_ = other_impl.wait_handle_; - other_impl.wait_handle_ = INVALID_HANDLE_VALUE; - impl.op_queue_.push(other_impl.op_queue_); - impl.owner_ = this; - - // We must not hold the lock while calling UnregisterWaitEx. This is because - // the registered callback function might be invoked while we are waiting for - // UnregisterWaitEx to complete. - lock.unlock(); - - if (impl.wait_handle_ != INVALID_HANDLE_VALUE) - ::UnregisterWaitEx(impl.wait_handle_, INVALID_HANDLE_VALUE); - - if (!impl.op_queue_.empty()) - register_wait_callback(impl, lock); -} - -void win_object_handle_service::move_assign( - win_object_handle_service::implementation_type& impl, - win_object_handle_service& other_service, - win_object_handle_service::implementation_type& other_impl) -{ - asio::error_code ignored_ec; - close(impl, ignored_ec); - - mutex::scoped_lock lock(mutex_); - - if (this != &other_service) - { - // Remove implementation from linked list of all implementations. - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; - } - - impl.handle_ = other_impl.handle_; - other_impl.handle_ = INVALID_HANDLE_VALUE; - impl.wait_handle_ = other_impl.wait_handle_; - other_impl.wait_handle_ = INVALID_HANDLE_VALUE; - impl.op_queue_.push(other_impl.op_queue_); - impl.owner_ = this; - - if (this != &other_service) - { - // Insert implementation into linked list of all implementations. - impl.next_ = other_service.impl_list_; - impl.prev_ = 0; - if (other_service.impl_list_) - other_service.impl_list_->prev_ = &impl; - other_service.impl_list_ = &impl; - } - - // We must not hold the lock while calling UnregisterWaitEx. This is because - // the registered callback function might be invoked while we are waiting for - // UnregisterWaitEx to complete. - lock.unlock(); - - if (impl.wait_handle_ != INVALID_HANDLE_VALUE) - ::UnregisterWaitEx(impl.wait_handle_, INVALID_HANDLE_VALUE); - - if (!impl.op_queue_.empty()) - register_wait_callback(impl, lock); -} - -void win_object_handle_service::destroy( - win_object_handle_service::implementation_type& impl) -{ - mutex::scoped_lock lock(mutex_); - - // Remove implementation from linked list of all implementations. - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; - - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((io_context_.context(), "object_handle", - &impl, reinterpret_cast(impl.wait_handle_), "close")); - - HANDLE wait_handle = impl.wait_handle_; - impl.wait_handle_ = INVALID_HANDLE_VALUE; - - op_queue ops; - while (wait_op* op = impl.op_queue_.front()) - { - op->ec_ = asio::error::operation_aborted; - impl.op_queue_.pop(); - ops.push(op); - } - - // We must not hold the lock while calling UnregisterWaitEx. This is - // because the registered callback function might be invoked while we are - // waiting for UnregisterWaitEx to complete. - lock.unlock(); - - if (wait_handle != INVALID_HANDLE_VALUE) - ::UnregisterWaitEx(wait_handle, INVALID_HANDLE_VALUE); - - ::CloseHandle(impl.handle_); - impl.handle_ = INVALID_HANDLE_VALUE; - - io_context_.post_deferred_completions(ops); - } -} - -asio::error_code win_object_handle_service::assign( - win_object_handle_service::implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec) -{ - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - impl.handle_ = handle; - ec = asio::error_code(); - return ec; -} - -asio::error_code win_object_handle_service::close( - win_object_handle_service::implementation_type& impl, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((io_context_.context(), "object_handle", - &impl, reinterpret_cast(impl.wait_handle_), "close")); - - mutex::scoped_lock lock(mutex_); - - HANDLE wait_handle = impl.wait_handle_; - impl.wait_handle_ = INVALID_HANDLE_VALUE; - - op_queue completed_ops; - while (wait_op* op = impl.op_queue_.front()) - { - impl.op_queue_.pop(); - op->ec_ = asio::error::operation_aborted; - completed_ops.push(op); - } - - // We must not hold the lock while calling UnregisterWaitEx. This is - // because the registered callback function might be invoked while we are - // waiting for UnregisterWaitEx to complete. - lock.unlock(); - - if (wait_handle != INVALID_HANDLE_VALUE) - ::UnregisterWaitEx(wait_handle, INVALID_HANDLE_VALUE); - - if (::CloseHandle(impl.handle_)) - { - impl.handle_ = INVALID_HANDLE_VALUE; - ec = asio::error_code(); - } - else - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - } - - io_context_.post_deferred_completions(completed_ops); - } - else - { - ec = asio::error_code(); - } - - return ec; -} - -asio::error_code win_object_handle_service::cancel( - win_object_handle_service::implementation_type& impl, - asio::error_code& ec) -{ - if (is_open(impl)) - { - ASIO_HANDLER_OPERATION((io_context_.context(), "object_handle", - &impl, reinterpret_cast(impl.wait_handle_), "cancel")); - - mutex::scoped_lock lock(mutex_); - - HANDLE wait_handle = impl.wait_handle_; - impl.wait_handle_ = INVALID_HANDLE_VALUE; - - op_queue completed_ops; - while (wait_op* op = impl.op_queue_.front()) - { - op->ec_ = asio::error::operation_aborted; - impl.op_queue_.pop(); - completed_ops.push(op); - } - - // We must not hold the lock while calling UnregisterWaitEx. This is - // because the registered callback function might be invoked while we are - // waiting for UnregisterWaitEx to complete. - lock.unlock(); - - if (wait_handle != INVALID_HANDLE_VALUE) - ::UnregisterWaitEx(wait_handle, INVALID_HANDLE_VALUE); - - ec = asio::error_code(); - - io_context_.post_deferred_completions(completed_ops); - } - else - { - ec = asio::error::bad_descriptor; - } - - return ec; -} - -void win_object_handle_service::wait( - win_object_handle_service::implementation_type& impl, - asio::error_code& ec) -{ - switch (::WaitForSingleObject(impl.handle_, INFINITE)) - { - case WAIT_FAILED: - { - DWORD last_error = ::GetLastError(); - ec = asio::error_code(last_error, - asio::error::get_system_category()); - break; - } - case WAIT_OBJECT_0: - case WAIT_ABANDONED: - default: - ec = asio::error_code(); - break; - } -} - -void win_object_handle_service::start_wait_op( - win_object_handle_service::implementation_type& impl, wait_op* op) -{ - io_context_.work_started(); - - if (is_open(impl)) - { - mutex::scoped_lock lock(mutex_); - - if (!shutdown_) - { - impl.op_queue_.push(op); - - // Only the first operation to be queued gets to register a wait callback. - // Subsequent operations have to wait for the first to finish. - if (impl.op_queue_.front() == op) - register_wait_callback(impl, lock); - } - else - { - lock.unlock(); - io_context_.post_deferred_completion(op); - } - } - else - { - op->ec_ = asio::error::bad_descriptor; - io_context_.post_deferred_completion(op); - } -} - -void win_object_handle_service::register_wait_callback( - win_object_handle_service::implementation_type& impl, - mutex::scoped_lock& lock) -{ - lock.lock(); - - if (!RegisterWaitForSingleObject(&impl.wait_handle_, - impl.handle_, &win_object_handle_service::wait_callback, - &impl, INFINITE, WT_EXECUTEONLYONCE)) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - - op_queue completed_ops; - while (wait_op* op = impl.op_queue_.front()) - { - op->ec_ = ec; - impl.op_queue_.pop(); - completed_ops.push(op); - } - - lock.unlock(); - io_context_.post_deferred_completions(completed_ops); - } -} - -void win_object_handle_service::wait_callback(PVOID param, BOOLEAN) -{ - implementation_type* impl = static_cast(param); - mutex::scoped_lock lock(impl->owner_->mutex_); - - if (impl->wait_handle_ != INVALID_HANDLE_VALUE) - { - ::UnregisterWaitEx(impl->wait_handle_, NULL); - impl->wait_handle_ = INVALID_HANDLE_VALUE; - } - - if (wait_op* op = impl->op_queue_.front()) - { - op_queue completed_ops; - - op->ec_ = asio::error_code(); - impl->op_queue_.pop(); - completed_ops.push(op); - - if (!impl->op_queue_.empty()) - { - if (!RegisterWaitForSingleObject(&impl->wait_handle_, - impl->handle_, &win_object_handle_service::wait_callback, - param, INFINITE, WT_EXECUTEONLYONCE)) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - - while ((op = impl->op_queue_.front()) != 0) - { - op->ec_ = ec; - impl->op_queue_.pop(); - completed_ops.push(op); - } - } - } - - io_context_impl& ioc = impl->owner_->io_context_; - lock.unlock(); - ioc.post_deferred_completions(completed_ops); - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - -#endif // ASIO_DETAIL_IMPL_WIN_OBJECT_HANDLE_SERVICE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_static_mutex.ipp b/scout_sdk/asio/asio/detail/impl/win_static_mutex.ipp deleted file mode 100644 index 42089bd..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_static_mutex.ipp +++ /dev/null @@ -1,136 +0,0 @@ -// -// detail/impl/win_static_mutex.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_STATIC_MUTEX_IPP -#define ASIO_DETAIL_IMPL_WIN_STATIC_MUTEX_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_static_mutex.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -void win_static_mutex::init() -{ - int error = do_init(); - asio::error_code ec(error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "static_mutex"); -} - -int win_static_mutex::do_init() -{ - using namespace std; // For sprintf. - wchar_t mutex_name[128]; -#if defined(ASIO_HAS_SECURE_RTL) - swprintf_s( -#else // defined(ASIO_HAS_SECURE_RTL) - _snwprintf( -#endif // defined(ASIO_HAS_SECURE_RTL) - mutex_name, 128, L"asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p", - static_cast(::GetCurrentProcessId()), this); - -#if defined(ASIO_WINDOWS_APP) - HANDLE mutex = ::CreateMutexExW(0, mutex_name, CREATE_MUTEX_INITIAL_OWNER, 0); -#else // defined(ASIO_WINDOWS_APP) - HANDLE mutex = ::CreateMutexW(0, TRUE, mutex_name); -#endif // defined(ASIO_WINDOWS_APP) - DWORD last_error = ::GetLastError(); - if (mutex == 0) - return ::GetLastError(); - - if (last_error == ERROR_ALREADY_EXISTS) - { -#if defined(ASIO_WINDOWS_APP) - ::WaitForSingleObjectEx(mutex, INFINITE, false); -#else // defined(ASIO_WINDOWS_APP) - ::WaitForSingleObject(mutex, INFINITE); -#endif // defined(ASIO_WINDOWS_APP) - } - - if (initialised_) - { - ::ReleaseMutex(mutex); - ::CloseHandle(mutex); - return 0; - } - -#if defined(__MINGW32__) - // Not sure if MinGW supports structured exception handling, so for now - // we'll just call the Windows API and hope. -# if defined(UNDER_CE) - ::InitializeCriticalSection(&crit_section_); -# else - if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) - { - last_error = ::GetLastError(); - ::ReleaseMutex(mutex); - ::CloseHandle(mutex); - return last_error; - } -# endif -#else - __try - { -# if defined(UNDER_CE) - ::InitializeCriticalSection(&crit_section_); -# elif defined(ASIO_WINDOWS_APP) - if (!::InitializeCriticalSectionEx(&crit_section_, 0, 0)) - { - last_error = ::GetLastError(); - ::ReleaseMutex(mutex); - ::CloseHandle(mutex); - return last_error; - } -# else - if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000)) - { - last_error = ::GetLastError(); - ::ReleaseMutex(mutex); - ::CloseHandle(mutex); - return last_error; - } -# endif - } - __except(GetExceptionCode() == STATUS_NO_MEMORY - ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) - { - ::ReleaseMutex(mutex); - ::CloseHandle(mutex); - return ERROR_OUTOFMEMORY; - } -#endif - - initialised_ = true; - ::ReleaseMutex(mutex); - ::CloseHandle(mutex); - return 0; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_IMPL_WIN_STATIC_MUTEX_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_thread.ipp b/scout_sdk/asio/asio/detail/impl/win_thread.ipp deleted file mode 100644 index ed6dbaf..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_thread.ipp +++ /dev/null @@ -1,150 +0,0 @@ -// -// detail/impl/win_thread.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_THREAD_IPP -#define ASIO_DETAIL_IMPL_WIN_THREAD_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_APP) \ - && !defined(UNDER_CE) - -#include -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_thread.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -win_thread::~win_thread() -{ - ::CloseHandle(thread_); - - // The exit_event_ handle is deliberately allowed to leak here since it - // is an error for the owner of an internal thread not to join() it. -} - -void win_thread::join() -{ - HANDLE handles[2] = { exit_event_, thread_ }; - ::WaitForMultipleObjects(2, handles, FALSE, INFINITE); - ::CloseHandle(exit_event_); - if (terminate_threads()) - { - ::TerminateThread(thread_, 0); - } - else - { - ::QueueUserAPC(apc_function, thread_, 0); - ::WaitForSingleObject(thread_, INFINITE); - } -} - -std::size_t win_thread::hardware_concurrency() -{ - SYSTEM_INFO system_info; - ::GetSystemInfo(&system_info); - return system_info.dwNumberOfProcessors; -} - -void win_thread::start_thread(func_base* arg, unsigned int stack_size) -{ - ::HANDLE entry_event = 0; - arg->entry_event_ = entry_event = ::CreateEventW(0, true, false, 0); - if (!entry_event) - { - DWORD last_error = ::GetLastError(); - delete arg; - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "thread.entry_event"); - } - - arg->exit_event_ = exit_event_ = ::CreateEventW(0, true, false, 0); - if (!exit_event_) - { - DWORD last_error = ::GetLastError(); - delete arg; - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "thread.exit_event"); - } - - unsigned int thread_id = 0; - thread_ = reinterpret_cast(::_beginthreadex(0, - stack_size, win_thread_function, arg, 0, &thread_id)); - if (!thread_) - { - DWORD last_error = ::GetLastError(); - delete arg; - if (entry_event) - ::CloseHandle(entry_event); - if (exit_event_) - ::CloseHandle(exit_event_); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "thread"); - } - - if (entry_event) - { - ::WaitForSingleObject(entry_event, INFINITE); - ::CloseHandle(entry_event); - } -} - -unsigned int __stdcall win_thread_function(void* arg) -{ - win_thread::auto_func_base_ptr func = { - static_cast(arg) }; - - ::SetEvent(func.ptr->entry_event_); - - func.ptr->run(); - - // Signal that the thread has finished its work, but rather than returning go - // to sleep to put the thread into a well known state. If the thread is being - // joined during global object destruction then it may be killed using - // TerminateThread (to avoid a deadlock in DllMain). Otherwise, the SleepEx - // call will be interrupted using QueueUserAPC and the thread will shut down - // cleanly. - HANDLE exit_event = func.ptr->exit_event_; - delete func.ptr; - func.ptr = 0; - ::SetEvent(exit_event); - ::SleepEx(INFINITE, TRUE); - - return 0; -} - -#if defined(WINVER) && (WINVER < 0x0500) -void __stdcall apc_function(ULONG) {} -#else -void __stdcall apc_function(ULONG_PTR) {} -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_APP) - // && !defined(UNDER_CE) - -#endif // ASIO_DETAIL_IMPL_WIN_THREAD_IPP diff --git a/scout_sdk/asio/asio/detail/impl/win_tss_ptr.ipp b/scout_sdk/asio/asio/detail/impl/win_tss_ptr.ipp deleted file mode 100644 index 61df0ce..0000000 --- a/scout_sdk/asio/asio/detail/impl/win_tss_ptr.ipp +++ /dev/null @@ -1,57 +0,0 @@ -// -// detail/impl/win_tss_ptr.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WIN_TSS_PTR_IPP -#define ASIO_DETAIL_IMPL_WIN_TSS_PTR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_tss_ptr.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -DWORD win_tss_ptr_create() -{ -#if defined(UNDER_CE) - const DWORD out_of_indexes = 0xFFFFFFFF; -#else - const DWORD out_of_indexes = TLS_OUT_OF_INDEXES; -#endif - - DWORD tss_key = ::TlsAlloc(); - if (tss_key == out_of_indexes) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "tss"); - } - return tss_key; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_IMPL_WIN_TSS_PTR_IPP diff --git a/scout_sdk/asio/asio/detail/impl/winrt_ssocket_service_base.ipp b/scout_sdk/asio/asio/detail/impl/winrt_ssocket_service_base.ipp deleted file mode 100644 index 288ca8b..0000000 --- a/scout_sdk/asio/asio/detail/impl/winrt_ssocket_service_base.ipp +++ /dev/null @@ -1,629 +0,0 @@ -// -// detail/impl/winrt_ssocket_service_base.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WINRT_SSOCKET_SERVICE_BASE_IPP -#define ASIO_DETAIL_IMPL_WINRT_SSOCKET_SERVICE_BASE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include -#include "asio/detail/winrt_ssocket_service_base.hpp" -#include "asio/detail/winrt_async_op.hpp" -#include "asio/detail/winrt_utils.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -winrt_ssocket_service_base::winrt_ssocket_service_base( - asio::io_context& io_context) - : io_context_(use_service(io_context)), - async_manager_(use_service(io_context)), - mutex_(), - impl_list_(0) -{ -} - -void winrt_ssocket_service_base::base_shutdown() -{ - // Close all implementations, causing all operations to complete. - asio::detail::mutex::scoped_lock lock(mutex_); - base_implementation_type* impl = impl_list_; - while (impl) - { - asio::error_code ignored_ec; - close(*impl, ignored_ec); - impl = impl->next_; - } -} - -void winrt_ssocket_service_base::construct( - winrt_ssocket_service_base::base_implementation_type& impl) -{ - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; -} - -void winrt_ssocket_service_base::base_move_construct( - winrt_ssocket_service_base::base_implementation_type& impl, - winrt_ssocket_service_base::base_implementation_type& other_impl) -{ - impl.socket_ = other_impl.socket_; - other_impl.socket_ = nullptr; - - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; -} - -void winrt_ssocket_service_base::base_move_assign( - winrt_ssocket_service_base::base_implementation_type& impl, - winrt_ssocket_service_base& other_service, - winrt_ssocket_service_base::base_implementation_type& other_impl) -{ - asio::error_code ignored_ec; - close(impl, ignored_ec); - - if (this != &other_service) - { - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; - } - - impl.socket_ = other_impl.socket_; - other_impl.socket_ = nullptr; - - if (this != &other_service) - { - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(other_service.mutex_); - impl.next_ = other_service.impl_list_; - impl.prev_ = 0; - if (other_service.impl_list_) - other_service.impl_list_->prev_ = &impl; - other_service.impl_list_ = &impl; - } -} - -void winrt_ssocket_service_base::destroy( - winrt_ssocket_service_base::base_implementation_type& impl) -{ - asio::error_code ignored_ec; - close(impl, ignored_ec); - - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; -} - -asio::error_code winrt_ssocket_service_base::close( - winrt_ssocket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (impl.socket_) - { - delete impl.socket_; - impl.socket_ = nullptr; - } - - ec = asio::error_code(); - return ec; -} - -winrt_ssocket_service_base::native_handle_type -winrt_ssocket_service_base::release( - winrt_ssocket_service_base::base_implementation_type& impl, - asio::error_code& ec) -{ - if (!is_open(impl)) - return nullptr; - - cancel(impl, ec); - if (ec) - return nullptr; - - native_handle_type tmp = impl.socket_; - impl.socket_ = nullptr; - return tmp; -} - -std::size_t winrt_ssocket_service_base::do_get_endpoint( - const base_implementation_type& impl, bool local, - void* addr, std::size_t addr_len, asio::error_code& ec) const -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return addr_len; - } - - try - { - std::string addr_string = winrt_utils::string(local - ? impl.socket_->Information->LocalAddress->CanonicalName - : impl.socket_->Information->RemoteAddress->CanonicalName); - unsigned short port = winrt_utils::integer(local - ? impl.socket_->Information->LocalPort - : impl.socket_->Information->RemotePort); - unsigned long scope = 0; - - switch (reinterpret_cast(addr)->sa_family) - { - case ASIO_OS_DEF(AF_INET): - if (addr_len < sizeof(sockaddr_in4_type)) - { - ec = asio::error::invalid_argument; - return addr_len; - } - else - { - socket_ops::inet_pton(ASIO_OS_DEF(AF_INET), addr_string.c_str(), - &reinterpret_cast(addr)->sin_addr, &scope, ec); - reinterpret_cast(addr)->sin_port - = socket_ops::host_to_network_short(port); - ec = asio::error_code(); - return sizeof(sockaddr_in4_type); - } - case ASIO_OS_DEF(AF_INET6): - if (addr_len < sizeof(sockaddr_in6_type)) - { - ec = asio::error::invalid_argument; - return addr_len; - } - else - { - socket_ops::inet_pton(ASIO_OS_DEF(AF_INET6), addr_string.c_str(), - &reinterpret_cast(addr)->sin6_addr, &scope, ec); - reinterpret_cast(addr)->sin6_port - = socket_ops::host_to_network_short(port); - ec = asio::error_code(); - return sizeof(sockaddr_in6_type); - } - default: - ec = asio::error::address_family_not_supported; - return addr_len; - } - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - return addr_len; - } -} - -asio::error_code winrt_ssocket_service_base::do_set_option( - winrt_ssocket_service_base::base_implementation_type& impl, - int level, int optname, const void* optval, - std::size_t optlen, asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return ec; - } - - try - { - if (level == ASIO_OS_DEF(SOL_SOCKET) - && optname == ASIO_OS_DEF(SO_KEEPALIVE)) - { - if (optlen == sizeof(int)) - { - int value = 0; - std::memcpy(&value, optval, optlen); - impl.socket_->Control->KeepAlive = !!value; - ec = asio::error_code(); - } - else - { - ec = asio::error::invalid_argument; - } - } - else if (level == ASIO_OS_DEF(IPPROTO_TCP) - && optname == ASIO_OS_DEF(TCP_NODELAY)) - { - if (optlen == sizeof(int)) - { - int value = 0; - std::memcpy(&value, optval, optlen); - impl.socket_->Control->NoDelay = !!value; - ec = asio::error_code(); - } - else - { - ec = asio::error::invalid_argument; - } - } - else - { - ec = asio::error::invalid_argument; - } - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - } - - return ec; -} - -void winrt_ssocket_service_base::do_get_option( - const winrt_ssocket_service_base::base_implementation_type& impl, - int level, int optname, void* optval, - std::size_t* optlen, asio::error_code& ec) const -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return; - } - - try - { - if (level == ASIO_OS_DEF(SOL_SOCKET) - && optname == ASIO_OS_DEF(SO_KEEPALIVE)) - { - if (*optlen >= sizeof(int)) - { - int value = impl.socket_->Control->KeepAlive ? 1 : 0; - std::memcpy(optval, &value, sizeof(int)); - *optlen = sizeof(int); - ec = asio::error_code(); - } - else - { - ec = asio::error::invalid_argument; - } - } - else if (level == ASIO_OS_DEF(IPPROTO_TCP) - && optname == ASIO_OS_DEF(TCP_NODELAY)) - { - if (*optlen >= sizeof(int)) - { - int value = impl.socket_->Control->NoDelay ? 1 : 0; - std::memcpy(optval, &value, sizeof(int)); - *optlen = sizeof(int); - ec = asio::error_code(); - } - else - { - ec = asio::error::invalid_argument; - } - } - else - { - ec = asio::error::invalid_argument; - } - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - } -} - -asio::error_code winrt_ssocket_service_base::do_connect( - winrt_ssocket_service_base::base_implementation_type& impl, - const void* addr, asio::error_code& ec) -{ - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return ec; - } - - char addr_string[max_addr_v6_str_len]; - unsigned short port; - switch (reinterpret_cast(addr)->sa_family) - { - case ASIO_OS_DEF(AF_INET): - socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET), - &reinterpret_cast(addr)->sin_addr, - addr_string, sizeof(addr_string), 0, ec); - port = socket_ops::network_to_host_short( - reinterpret_cast(addr)->sin_port); - break; - case ASIO_OS_DEF(AF_INET6): - socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6), - &reinterpret_cast(addr)->sin6_addr, - addr_string, sizeof(addr_string), 0, ec); - port = socket_ops::network_to_host_short( - reinterpret_cast(addr)->sin6_port); - break; - default: - ec = asio::error::address_family_not_supported; - return ec; - } - - if (!ec) try - { - async_manager_.sync(impl.socket_->ConnectAsync( - ref new Windows::Networking::HostName( - winrt_utils::string(addr_string)), - winrt_utils::string(port)), ec); - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - } - - return ec; -} - -void winrt_ssocket_service_base::start_connect_op( - winrt_ssocket_service_base::base_implementation_type& impl, - const void* addr, winrt_async_op* op, bool is_continuation) -{ - if (!is_open(impl)) - { - op->ec_ = asio::error::bad_descriptor; - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - char addr_string[max_addr_v6_str_len]; - unsigned short port = 0; - switch (reinterpret_cast(addr)->sa_family) - { - case ASIO_OS_DEF(AF_INET): - socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET), - &reinterpret_cast(addr)->sin_addr, - addr_string, sizeof(addr_string), 0, op->ec_); - port = socket_ops::network_to_host_short( - reinterpret_cast(addr)->sin_port); - break; - case ASIO_OS_DEF(AF_INET6): - socket_ops::inet_ntop(ASIO_OS_DEF(AF_INET6), - &reinterpret_cast(addr)->sin6_addr, - addr_string, sizeof(addr_string), 0, op->ec_); - port = socket_ops::network_to_host_short( - reinterpret_cast(addr)->sin6_port); - break; - default: - op->ec_ = asio::error::address_family_not_supported; - break; - } - - if (op->ec_) - { - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - try - { - async_manager_.async(impl.socket_->ConnectAsync( - ref new Windows::Networking::HostName( - winrt_utils::string(addr_string)), - winrt_utils::string(port)), op); - } - catch (Platform::Exception^ e) - { - op->ec_ = asio::error_code( - e->HResult, asio::system_category()); - io_context_.post_immediate_completion(op, is_continuation); - } -} - -std::size_t winrt_ssocket_service_base::do_send( - winrt_ssocket_service_base::base_implementation_type& impl, - const asio::const_buffer& data, - socket_base::message_flags flags, asio::error_code& ec) -{ - if (flags) - { - ec = asio::error::operation_not_supported; - return 0; - } - - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return 0; - } - - try - { - buffer_sequence_adapter bufs(asio::buffer(data)); - - if (bufs.all_empty()) - { - ec = asio::error_code(); - return 0; - } - - return async_manager_.sync( - impl.socket_->OutputStream->WriteAsync(bufs.buffers()[0]), ec); - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - return 0; - } -} - -void winrt_ssocket_service_base::start_send_op( - winrt_ssocket_service_base::base_implementation_type& impl, - const asio::const_buffer& data, socket_base::message_flags flags, - winrt_async_op* op, bool is_continuation) -{ - if (flags) - { - op->ec_ = asio::error::operation_not_supported; - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - if (!is_open(impl)) - { - op->ec_ = asio::error::bad_descriptor; - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - try - { - buffer_sequence_adapter bufs(asio::buffer(data)); - - if (bufs.all_empty()) - { - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - async_manager_.async( - impl.socket_->OutputStream->WriteAsync(bufs.buffers()[0]), op); - } - catch (Platform::Exception^ e) - { - op->ec_ = asio::error_code(e->HResult, - asio::system_category()); - io_context_.post_immediate_completion(op, is_continuation); - } -} - -std::size_t winrt_ssocket_service_base::do_receive( - winrt_ssocket_service_base::base_implementation_type& impl, - const asio::mutable_buffer& data, - socket_base::message_flags flags, asio::error_code& ec) -{ - if (flags) - { - ec = asio::error::operation_not_supported; - return 0; - } - - if (!is_open(impl)) - { - ec = asio::error::bad_descriptor; - return 0; - } - - try - { - buffer_sequence_adapter bufs(asio::buffer(data)); - - if (bufs.all_empty()) - { - ec = asio::error_code(); - return 0; - } - - async_manager_.sync( - impl.socket_->InputStream->ReadAsync( - bufs.buffers()[0], bufs.buffers()[0]->Capacity, - Windows::Storage::Streams::InputStreamOptions::Partial), ec); - - std::size_t bytes_transferred = bufs.buffers()[0]->Length; - if (bytes_transferred == 0 && !ec) - { - ec = asio::error::eof; - } - - return bytes_transferred; - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - return 0; - } -} - -void winrt_ssocket_service_base::start_receive_op( - winrt_ssocket_service_base::base_implementation_type& impl, - const asio::mutable_buffer& data, socket_base::message_flags flags, - winrt_async_op* op, - bool is_continuation) -{ - if (flags) - { - op->ec_ = asio::error::operation_not_supported; - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - if (!is_open(impl)) - { - op->ec_ = asio::error::bad_descriptor; - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - try - { - buffer_sequence_adapter bufs(asio::buffer(data)); - - if (bufs.all_empty()) - { - io_context_.post_immediate_completion(op, is_continuation); - return; - } - - async_manager_.async( - impl.socket_->InputStream->ReadAsync( - bufs.buffers()[0], bufs.buffers()[0]->Capacity, - Windows::Storage::Streams::InputStreamOptions::Partial), op); - } - catch (Platform::Exception^ e) - { - op->ec_ = asio::error_code(e->HResult, - asio::system_category()); - io_context_.post_immediate_completion(op, is_continuation); - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_WINRT_SSOCKET_SERVICE_BASE_IPP diff --git a/scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.hpp b/scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.hpp deleted file mode 100644 index 856378f..0000000 --- a/scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.hpp +++ /dev/null @@ -1,92 +0,0 @@ -// -// detail/impl/winrt_timer_scheduler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_HPP -#define ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -void winrt_timer_scheduler::add_timer_queue(timer_queue& queue) -{ - do_add_timer_queue(queue); -} - -// Remove a timer queue from the reactor. -template -void winrt_timer_scheduler::remove_timer_queue(timer_queue& queue) -{ - do_remove_timer_queue(queue); -} - -template -void winrt_timer_scheduler::schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - { - io_context_.post_immediate_completion(op, false); - return; - } - - bool earliest = queue.enqueue_timer(time, timer, op); - io_context_.work_started(); - if (earliest) - event_.signal(lock); -} - -template -std::size_t winrt_timer_scheduler::cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue ops; - std::size_t n = queue.cancel_timer(timer, ops, max_cancelled); - lock.unlock(); - io_context_.post_deferred_completions(ops); - return n; -} - -template -void winrt_timer_scheduler::move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& to, - typename timer_queue::per_timer_data& from) -{ - asio::detail::mutex::scoped_lock lock(mutex_); - op_queue ops; - queue.cancel_timer(to, ops); - queue.move_timer(to, from); - lock.unlock(); - scheduler_.post_deferred_completions(ops); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_HPP diff --git a/scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.ipp b/scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.ipp deleted file mode 100644 index ef21399..0000000 --- a/scout_sdk/asio/asio/detail/impl/winrt_timer_scheduler.ipp +++ /dev/null @@ -1,122 +0,0 @@ -// -// detail/impl/winrt_timer_scheduler.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP -#define ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/winrt_timer_scheduler.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -winrt_timer_scheduler::winrt_timer_scheduler( - asio::io_context& io_context) - : asio::detail::service_base(io_context), - io_context_(use_service(io_context)), - mutex_(), - event_(), - timer_queues_(), - thread_(0), - stop_thread_(false), - shutdown_(false) -{ - thread_ = new asio::detail::thread( - bind_handler(&winrt_timer_scheduler::call_run_thread, this)); -} - -winrt_timer_scheduler::~winrt_timer_scheduler() -{ - shutdown(); -} - -void winrt_timer_scheduler::shutdown() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; - stop_thread_ = true; - event_.signal(lock); - lock.unlock(); - - if (thread_) - { - thread_->join(); - delete thread_; - thread_ = 0; - } - - op_queue ops; - timer_queues_.get_all_timers(ops); - io_context_.abandon_operations(ops); -} - -void winrt_timer_scheduler::notify_fork(asio::io_context::fork_event) -{ -} - -void winrt_timer_scheduler::init_task() -{ -} - -void winrt_timer_scheduler::run_thread() -{ - asio::detail::mutex::scoped_lock lock(mutex_); - while (!stop_thread_) - { - const long max_wait_duration = 5 * 60 * 1000000; - long wait_duration = timer_queues_.wait_duration_usec(max_wait_duration); - event_.wait_for_usec(lock, wait_duration); - event_.clear(lock); - op_queue ops; - timer_queues_.get_ready_timers(ops); - if (!ops.empty()) - { - lock.unlock(); - io_context_.post_deferred_completions(ops); - lock.lock(); - } - } -} - -void winrt_timer_scheduler::call_run_thread(winrt_timer_scheduler* scheduler) -{ - scheduler->run_thread(); -} - -void winrt_timer_scheduler::do_add_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.insert(&queue); -} - -void winrt_timer_scheduler::do_remove_timer_queue(timer_queue_base& queue) -{ - mutex::scoped_lock lock(mutex_); - timer_queues_.erase(&queue); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_IMPL_WINRT_TIMER_SCHEDULER_IPP diff --git a/scout_sdk/asio/asio/detail/impl/winsock_init.ipp b/scout_sdk/asio/asio/detail/impl/winsock_init.ipp deleted file mode 100644 index da4b0c0..0000000 --- a/scout_sdk/asio/asio/detail/impl/winsock_init.ipp +++ /dev/null @@ -1,82 +0,0 @@ -// -// detail/impl/winsock_init.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IMPL_WINSOCK_INIT_IPP -#define ASIO_DETAIL_IMPL_WINSOCK_INIT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/socket_types.hpp" -#include "asio/detail/winsock_init.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -void winsock_init_base::startup(data& d, - unsigned char major, unsigned char minor) -{ - if (::InterlockedIncrement(&d.init_count_) == 1) - { - WSADATA wsa_data; - long result = ::WSAStartup(MAKEWORD(major, minor), &wsa_data); - ::InterlockedExchange(&d.result_, result); - } -} - -void winsock_init_base::manual_startup(data& d) -{ - if (::InterlockedIncrement(&d.init_count_) == 1) - { - ::InterlockedExchange(&d.result_, 0); - } -} - -void winsock_init_base::cleanup(data& d) -{ - if (::InterlockedDecrement(&d.init_count_) == 0) - { - ::WSACleanup(); - } -} - -void winsock_init_base::manual_cleanup(data& d) -{ - ::InterlockedDecrement(&d.init_count_); -} - -void winsock_init_base::throw_on_error(data& d) -{ - long result = ::InterlockedExchangeAdd(&d.result_, 0); - if (result != 0) - { - asio::error_code ec(result, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "winsock"); - } -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#endif // ASIO_DETAIL_IMPL_WINSOCK_INIT_IPP diff --git a/scout_sdk/asio/asio/detail/io_control.hpp b/scout_sdk/asio/asio/detail/io_control.hpp deleted file mode 100644 index 12f35e0..0000000 --- a/scout_sdk/asio/asio/detail/io_control.hpp +++ /dev/null @@ -1,84 +0,0 @@ -// -// detail/io_control.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IO_CONTROL_HPP -#define ASIO_DETAIL_IO_CONTROL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { -namespace io_control { - -// I/O control command for getting number of bytes available. -class bytes_readable -{ -public: - // Default constructor. - bytes_readable() - : value_(0) - { - } - - // Construct with a specific command value. - bytes_readable(std::size_t value) - : value_(static_cast(value)) - { - } - - // Get the name of the IO control command. - int name() const - { - return static_cast(ASIO_OS_DEF(FIONREAD)); - } - - // Set the value of the I/O control command. - void set(std::size_t value) - { - value_ = static_cast(value); - } - - // Get the current value of the I/O control command. - std::size_t get() const - { - return static_cast(value_); - } - - // Get the address of the command data. - detail::ioctl_arg_type* data() - { - return &value_; - } - - // Get the address of the command data. - const detail::ioctl_arg_type* data() const - { - return &value_; - } - -private: - detail::ioctl_arg_type value_; -}; - -} // namespace io_control -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IO_CONTROL_HPP diff --git a/scout_sdk/asio/asio/detail/is_buffer_sequence.hpp b/scout_sdk/asio/asio/detail/is_buffer_sequence.hpp deleted file mode 100644 index 42ad0eb..0000000 --- a/scout_sdk/asio/asio/detail/is_buffer_sequence.hpp +++ /dev/null @@ -1,239 +0,0 @@ -// -// detail/is_buffer_sequence.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP -#define ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -class mutable_buffer; -class const_buffer; - -namespace detail { - -struct buffer_sequence_memfns_base -{ - void begin(); - void end(); - void size(); - void max_size(); - void capacity(); - void data(); - void prepare(); - void commit(); - void consume(); -}; - -template -struct buffer_sequence_memfns_derived - : T, buffer_sequence_memfns_base -{ -}; - -template -struct buffer_sequence_memfns_check -{ -}; - -template -char (&begin_memfn_helper(...))[2]; - -template -char begin_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::begin>*); - -template -char (&end_memfn_helper(...))[2]; - -template -char end_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::end>*); - -template -char (&size_memfn_helper(...))[2]; - -template -char size_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::size>*); - -template -char (&max_size_memfn_helper(...))[2]; - -template -char max_size_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::max_size>*); - -template -char (&capacity_memfn_helper(...))[2]; - -template -char capacity_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::capacity>*); - -template -char (&data_memfn_helper(...))[2]; - -template -char data_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::data>*); - -template -char (&prepare_memfn_helper(...))[2]; - -template -char prepare_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::prepare>*); - -template -char (&commit_memfn_helper(...))[2]; - -template -char commit_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::commit>*); - -template -char (&consume_memfn_helper(...))[2]; - -template -char consume_memfn_helper( - buffer_sequence_memfns_check< - void (buffer_sequence_memfns_base::*)(), - &buffer_sequence_memfns_derived::consume>*); - -template -char (&buffer_element_type_helper(...))[2]; - -#if defined(ASIO_HAS_DECL_TYPE) - -template -char buffer_element_type_helper(T* t, - typename enable_if::value>::type*); - -#else // defined(ASIO_HAS_DECL_TYPE) - -template -char buffer_element_type_helper( - typename T::const_iterator*, - typename enable_if::value>::type*); - -#endif // defined(ASIO_HAS_DECL_TYPE) - -template -char (&const_buffers_type_typedef_helper(...))[2]; - -template -char const_buffers_type_typedef_helper( - typename T::const_buffers_type*); - -template -char (&mutable_buffers_type_typedef_helper(...))[2]; - -template -char mutable_buffers_type_typedef_helper( - typename T::mutable_buffers_type*); - -template -struct is_buffer_sequence_class - : integral_constant(0)) != 1 && - sizeof(end_memfn_helper(0)) != 1 && - sizeof(buffer_element_type_helper(0, 0)) == 1> -{ -}; - -template -struct is_buffer_sequence - : conditional::value, - is_buffer_sequence_class, - false_type>::type -{ -}; - -template <> -struct is_buffer_sequence - : true_type -{ -}; - -template <> -struct is_buffer_sequence - : true_type -{ -}; - -template <> -struct is_buffer_sequence - : true_type -{ -}; - -template <> -struct is_buffer_sequence - : false_type -{ -}; - -template -struct is_dynamic_buffer_class - : integral_constant(0)) != 1 && - sizeof(max_size_memfn_helper(0)) != 1 && - sizeof(capacity_memfn_helper(0)) != 1 && - sizeof(data_memfn_helper(0)) != 1 && - sizeof(consume_memfn_helper(0)) != 1 && - sizeof(prepare_memfn_helper(0)) != 1 && - sizeof(commit_memfn_helper(0)) != 1 && - sizeof(const_buffers_type_typedef_helper(0)) == 1 && - sizeof(mutable_buffers_type_typedef_helper(0)) == 1> -{ -}; - -template -struct is_dynamic_buffer - : conditional::value, - is_dynamic_buffer_class, - false_type>::type -{ -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IS_BUFFER_SEQUENCE_HPP diff --git a/scout_sdk/asio/asio/detail/is_executor.hpp b/scout_sdk/asio/asio/detail/is_executor.hpp deleted file mode 100644 index 4584dd0..0000000 --- a/scout_sdk/asio/asio/detail/is_executor.hpp +++ /dev/null @@ -1,126 +0,0 @@ -// -// detail/is_executor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IS_EXECUTOR_HPP -#define ASIO_DETAIL_IS_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct executor_memfns_base -{ - void context(); - void on_work_started(); - void on_work_finished(); - void dispatch(); - void post(); - void defer(); -}; - -template -struct executor_memfns_derived - : T, executor_memfns_base -{ -}; - -template -struct executor_memfns_check -{ -}; - -template -char (&context_memfn_helper(...))[2]; - -template -char context_memfn_helper( - executor_memfns_check< - void (executor_memfns_base::*)(), - &executor_memfns_derived::context>*); - -template -char (&on_work_started_memfn_helper(...))[2]; - -template -char on_work_started_memfn_helper( - executor_memfns_check< - void (executor_memfns_base::*)(), - &executor_memfns_derived::on_work_started>*); - -template -char (&on_work_finished_memfn_helper(...))[2]; - -template -char on_work_finished_memfn_helper( - executor_memfns_check< - void (executor_memfns_base::*)(), - &executor_memfns_derived::on_work_finished>*); - -template -char (&dispatch_memfn_helper(...))[2]; - -template -char dispatch_memfn_helper( - executor_memfns_check< - void (executor_memfns_base::*)(), - &executor_memfns_derived::dispatch>*); - -template -char (&post_memfn_helper(...))[2]; - -template -char post_memfn_helper( - executor_memfns_check< - void (executor_memfns_base::*)(), - &executor_memfns_derived::post>*); - -template -char (&defer_memfn_helper(...))[2]; - -template -char defer_memfn_helper( - executor_memfns_check< - void (executor_memfns_base::*)(), - &executor_memfns_derived::defer>*); - -template -struct is_executor_class - : integral_constant(0)) != 1 && - sizeof(on_work_started_memfn_helper(0)) != 1 && - sizeof(on_work_finished_memfn_helper(0)) != 1 && - sizeof(dispatch_memfn_helper(0)) != 1 && - sizeof(post_memfn_helper(0)) != 1 && - sizeof(defer_memfn_helper(0)) != 1> -{ -}; - -template -struct is_executor - : conditional::value, - is_executor_class, - false_type>::type -{ -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IS_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/detail/keyword_tss_ptr.hpp b/scout_sdk/asio/asio/detail/keyword_tss_ptr.hpp deleted file mode 100644 index 2ae651a..0000000 --- a/scout_sdk/asio/asio/detail/keyword_tss_ptr.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// detail/keyword_tss_ptr.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_KEYWORD_TSS_PTR_HPP -#define ASIO_DETAIL_KEYWORD_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class keyword_tss_ptr - : private noncopyable -{ -public: - // Constructor. - keyword_tss_ptr() - { - } - - // Destructor. - ~keyword_tss_ptr() - { - } - - // Get the value. - operator T*() const - { - return value_; - } - - // Set the value. - void operator=(T* value) - { - value_ = value; - } - -private: - static ASIO_THREAD_KEYWORD T* value_; -}; - -template -ASIO_THREAD_KEYWORD T* keyword_tss_ptr::value_; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) - -#endif // ASIO_DETAIL_KEYWORD_TSS_PTR_HPP diff --git a/scout_sdk/asio/asio/detail/kqueue_reactor.hpp b/scout_sdk/asio/asio/detail/kqueue_reactor.hpp deleted file mode 100644 index 43cb9f9..0000000 --- a/scout_sdk/asio/asio/detail/kqueue_reactor.hpp +++ /dev/null @@ -1,242 +0,0 @@ -// -// detail/kqueue_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_KQUEUE_REACTOR_HPP -#define ASIO_DETAIL_KQUEUE_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_KQUEUE) - -#include -#include -#include -#include -#include "asio/detail/limits.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/object_pool.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/select_interrupter.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue_base.hpp" -#include "asio/detail/timer_queue_set.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/error.hpp" -#include "asio/execution_context.hpp" - -// Older versions of Mac OS X may not define EV_OOBAND. -#if !defined(EV_OOBAND) -# define EV_OOBAND EV_FLAG1 -#endif // !defined(EV_OOBAND) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class scheduler; - -class kqueue_reactor - : public execution_context_service_base -{ -private: - // The mutex type used by this reactor. - typedef conditionally_enabled_mutex mutex; - -public: - enum op_types { read_op = 0, write_op = 1, - connect_op = 1, except_op = 2, max_ops = 3 }; - - // Per-descriptor queues. - struct descriptor_state - { - descriptor_state(bool locking) : mutex_(locking) {} - - friend class kqueue_reactor; - friend class object_pool_access; - - descriptor_state* next_; - descriptor_state* prev_; - - mutex mutex_; - int descriptor_; - int num_kevents_; // 1 == read only, 2 == read and write - op_queue op_queue_[max_ops]; - bool shutdown_; - }; - - // Per-descriptor data. - typedef descriptor_state* per_descriptor_data; - - // Constructor. - ASIO_DECL kqueue_reactor(asio::execution_context& ctx); - - // Destructor. - ASIO_DECL ~kqueue_reactor(); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Recreate internal descriptors following a fork. - ASIO_DECL void notify_fork( - asio::execution_context::fork_event fork_ev); - - // Initialise the task. - ASIO_DECL void init_task(); - - // Register a socket with the reactor. Returns 0 on success, system error - // code on failure. - ASIO_DECL int register_descriptor(socket_type descriptor, - per_descriptor_data& descriptor_data); - - // Register a descriptor with an associated single operation. Returns 0 on - // success, system error code on failure. - ASIO_DECL int register_internal_descriptor( - int op_type, socket_type descriptor, - per_descriptor_data& descriptor_data, reactor_op* op); - - // Move descriptor registration from one descriptor_data object to another. - ASIO_DECL void move_descriptor(socket_type descriptor, - per_descriptor_data& target_descriptor_data, - per_descriptor_data& source_descriptor_data); - - // Post a reactor operation for immediate completion. - void post_immediate_completion(reactor_op* op, bool is_continuation) - { - scheduler_.post_immediate_completion(op, is_continuation); - } - - // Start a new operation. The reactor operation will be performed when the - // given descriptor is flagged as ready, or an error has occurred. - ASIO_DECL void start_op(int op_type, socket_type descriptor, - per_descriptor_data& descriptor_data, reactor_op* op, - bool is_continuation, bool allow_speculative); - - // Cancel all operations associated with the given descriptor. The - // handlers associated with the descriptor will be invoked with the - // operation_aborted error. - ASIO_DECL void cancel_ops(socket_type descriptor, - per_descriptor_data& descriptor_data); - - // Cancel any operations that are running against the descriptor and remove - // its registration from the reactor. The reactor resources associated with - // the descriptor must be released by calling cleanup_descriptor_data. - ASIO_DECL void deregister_descriptor(socket_type descriptor, - per_descriptor_data& descriptor_data, bool closing); - - // Remove the descriptor's registration from the reactor. The reactor - // resources associated with the descriptor must be released by calling - // cleanup_descriptor_data. - ASIO_DECL void deregister_internal_descriptor( - socket_type descriptor, per_descriptor_data& descriptor_data); - - // Perform any post-deregistration cleanup tasks associated with the - // descriptor data. - ASIO_DECL void cleanup_descriptor_data( - per_descriptor_data& descriptor_data); - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& queue); - - // Remove a timer queue from the reactor. - template - void remove_timer_queue(timer_queue& queue); - - // Schedule a new operation in the given timer queue to expire at the - // specified absolute time. - template - void schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op); - - // Cancel the timer operations associated with the given token. Returns the - // number of operations that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled = (std::numeric_limits::max)()); - - // Move the timer operations associated with the given timer. - template - void move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source); - - // Run the kqueue loop. - ASIO_DECL void run(long usec, op_queue& ops); - - // Interrupt the kqueue loop. - ASIO_DECL void interrupt(); - -private: - // Create the kqueue file descriptor. Throws an exception if the descriptor - // cannot be created. - ASIO_DECL static int do_kqueue_create(); - - // Allocate a new descriptor state object. - ASIO_DECL descriptor_state* allocate_descriptor_state(); - - // Free an existing descriptor state object. - ASIO_DECL void free_descriptor_state(descriptor_state* s); - - // Helper function to add a new timer queue. - ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); - - // Helper function to remove a timer queue. - ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); - - // Get the timeout value for the kevent call. - ASIO_DECL timespec* get_timeout(long usec, timespec& ts); - - // The scheduler used to post completions. - scheduler& scheduler_; - - // Mutex to protect access to internal data. - mutex mutex_; - - // The kqueue file descriptor. - int kqueue_fd_; - - // The interrupter is used to break a blocking kevent call. - select_interrupter interrupter_; - - // The timer queues. - timer_queue_set timer_queues_; - - // Whether the service has been shut down. - bool shutdown_; - - // Mutex to protect access to the registered descriptors. - mutex registered_descriptors_mutex_; - - // Keep track of all registered descriptors. - object_pool registered_descriptors_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/kqueue_reactor.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/kqueue_reactor.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_KQUEUE) - -#endif // ASIO_DETAIL_KQUEUE_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/limits.hpp b/scout_sdk/asio/asio/detail/limits.hpp deleted file mode 100644 index d32470d..0000000 --- a/scout_sdk/asio/asio/detail/limits.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// detail/limits.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2011 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_LIMITS_HPP -#define ASIO_DETAIL_LIMITS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_LIMITS) -# include -#else // defined(ASIO_HAS_BOOST_LIMITS) -# include -#endif // defined(ASIO_HAS_BOOST_LIMITS) - -#endif // ASIO_DETAIL_LIMITS_HPP diff --git a/scout_sdk/asio/asio/detail/local_free_on_block_exit.hpp b/scout_sdk/asio/asio/detail/local_free_on_block_exit.hpp deleted file mode 100644 index eba6b77..0000000 --- a/scout_sdk/asio/asio/detail/local_free_on_block_exit.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// detail/local_free_on_block_exit.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP -#define ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -#if !defined(ASIO_WINDOWS_APP) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class local_free_on_block_exit - : private noncopyable -{ -public: - // Constructor blocks all signals for the calling thread. - explicit local_free_on_block_exit(void* p) - : p_(p) - { - } - - // Destructor restores the previous signal mask. - ~local_free_on_block_exit() - { - ::LocalFree(p_); - } - -private: - void* p_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS_APP) -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#endif // ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP diff --git a/scout_sdk/asio/asio/detail/macos_fenced_block.hpp b/scout_sdk/asio/asio/detail/macos_fenced_block.hpp deleted file mode 100644 index bbac270..0000000 --- a/scout_sdk/asio/asio/detail/macos_fenced_block.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// detail/macos_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_MACOS_FENCED_BLOCK_HPP -#define ASIO_DETAIL_MACOS_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(__MACH__) && defined(__APPLE__) - -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class macos_fenced_block - : private noncopyable -{ -public: - enum half_t { half }; - enum full_t { full }; - - // Constructor for a half fenced block. - explicit macos_fenced_block(half_t) - { - } - - // Constructor for a full fenced block. - explicit macos_fenced_block(full_t) - { - OSMemoryBarrier(); - } - - // Destructor. - ~macos_fenced_block() - { - OSMemoryBarrier(); - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(__MACH__) && defined(__APPLE__) - -#endif // ASIO_DETAIL_MACOS_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/memory.hpp b/scout_sdk/asio/asio/detail/memory.hpp deleted file mode 100644 index b1ec497..0000000 --- a/scout_sdk/asio/asio/detail/memory.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// detail/memory.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_MEMORY_HPP -#define ASIO_DETAIL_MEMORY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include - -#if !defined(ASIO_HAS_STD_SHARED_PTR) -# include -# include -#endif // !defined(ASIO_HAS_STD_SHARED_PTR) - -#if !defined(ASIO_HAS_STD_ADDRESSOF) -# include -#endif // !defined(ASIO_HAS_STD_ADDRESSOF) - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_STD_SHARED_PTR) -using std::shared_ptr; -using std::weak_ptr; -#else // defined(ASIO_HAS_STD_SHARED_PTR) -using boost::shared_ptr; -using boost::weak_ptr; -#endif // defined(ASIO_HAS_STD_SHARED_PTR) - -#if defined(ASIO_HAS_STD_ADDRESSOF) -using std::addressof; -#else // defined(ASIO_HAS_STD_ADDRESSOF) -using boost::addressof; -#endif // defined(ASIO_HAS_STD_ADDRESSOF) - -} // namespace detail - -#if defined(ASIO_HAS_CXX11_ALLOCATORS) -using std::allocator_arg_t; -# define ASIO_USES_ALLOCATOR(t) \ - namespace std { \ - template \ - struct uses_allocator : true_type {}; \ - } \ - /**/ -# define ASIO_REBIND_ALLOC(alloc, t) \ - typename std::allocator_traits::template rebind_alloc - /**/ -#else // defined(ASIO_HAS_CXX11_ALLOCATORS) -struct allocator_arg_t {}; -# define ASIO_USES_ALLOCATOR(t) -# define ASIO_REBIND_ALLOC(alloc, t) \ - typename alloc::template rebind::other - /**/ -#endif // defined(ASIO_HAS_CXX11_ALLOCATORS) - -} // namespace asio - -#endif // ASIO_DETAIL_MEMORY_HPP diff --git a/scout_sdk/asio/asio/detail/mutex.hpp b/scout_sdk/asio/asio/detail/mutex.hpp deleted file mode 100644 index 2f8f0b1..0000000 --- a/scout_sdk/asio/asio/detail/mutex.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// -// detail/mutex.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_MUTEX_HPP -#define ASIO_DETAIL_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) -# include "asio/detail/null_mutex.hpp" -#elif defined(ASIO_WINDOWS) -# include "asio/detail/win_mutex.hpp" -#elif defined(ASIO_HAS_PTHREADS) -# include "asio/detail/posix_mutex.hpp" -#elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) -# include "asio/detail/std_mutex.hpp" -#else -# error Only Windows, POSIX and std::mutex are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(ASIO_HAS_THREADS) -typedef null_mutex mutex; -#elif defined(ASIO_WINDOWS) -typedef win_mutex mutex; -#elif defined(ASIO_HAS_PTHREADS) -typedef posix_mutex mutex; -#elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) -typedef std_mutex mutex; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/noncopyable.hpp b/scout_sdk/asio/asio/detail/noncopyable.hpp deleted file mode 100644 index 0c038e1..0000000 --- a/scout_sdk/asio/asio/detail/noncopyable.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// detail/noncopyable.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NONCOPYABLE_HPP -#define ASIO_DETAIL_NONCOPYABLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class noncopyable -{ -protected: - noncopyable() {} - ~noncopyable() {} -private: - noncopyable(const noncopyable&); - const noncopyable& operator=(const noncopyable&); -}; - -} // namespace detail - -using asio::detail::noncopyable; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NONCOPYABLE_HPP diff --git a/scout_sdk/asio/asio/detail/null_event.hpp b/scout_sdk/asio/asio/detail/null_event.hpp deleted file mode 100644 index 5686a41..0000000 --- a/scout_sdk/asio/asio/detail/null_event.hpp +++ /dev/null @@ -1,100 +0,0 @@ -// -// detail/null_event.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_EVENT_HPP -#define ASIO_DETAIL_NULL_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class null_event - : private noncopyable -{ -public: - // Constructor. - null_event() - { - } - - // Destructor. - ~null_event() - { - } - - // Signal the event. (Retained for backward compatibility.) - template - void signal(Lock&) - { - } - - // Signal all waiters. - template - void signal_all(Lock&) - { - } - - // Unlock the mutex and signal one waiter. - template - void unlock_and_signal_one(Lock&) - { - } - - // If there's a waiter, unlock the mutex and signal it. - template - bool maybe_unlock_and_signal_one(Lock&) - { - return false; - } - - // Reset the event. - template - void clear(Lock&) - { - } - - // Wait for the event to become signalled. - template - void wait(Lock&) - { - do_wait(); - } - - // Timed wait for the event to become signalled. - template - bool wait_for_usec(Lock&, long usec) - { - do_wait_for_usec(usec); - return true; - } - -private: - ASIO_DECL static void do_wait(); - ASIO_DECL static void do_wait_for_usec(long usec); -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/null_event.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_NULL_EVENT_HPP diff --git a/scout_sdk/asio/asio/detail/null_fenced_block.hpp b/scout_sdk/asio/asio/detail/null_fenced_block.hpp deleted file mode 100644 index 0275326..0000000 --- a/scout_sdk/asio/asio/detail/null_fenced_block.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// detail/null_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_FENCED_BLOCK_HPP -#define ASIO_DETAIL_NULL_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class null_fenced_block - : private noncopyable -{ -public: - enum half_or_full_t { half, full }; - - // Constructor. - explicit null_fenced_block(half_or_full_t) - { - } - - // Destructor. - ~null_fenced_block() - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NULL_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/null_global.hpp b/scout_sdk/asio/asio/detail/null_global.hpp deleted file mode 100644 index 727dd3f..0000000 --- a/scout_sdk/asio/asio/detail/null_global.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// detail/null_global.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_GLOBAL_HPP -#define ASIO_DETAIL_NULL_GLOBAL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct null_global_impl -{ - null_global_impl() - : ptr_(0) - { - } - - // Destructor automatically cleans up the global. - ~null_global_impl() - { - delete ptr_; - } - - static null_global_impl instance_; - T* ptr_; -}; - -template -null_global_impl null_global_impl::instance_; - -template -T& null_global() -{ - if (null_global_impl::instance_.ptr_ == 0) - null_global_impl::instance_.ptr_ = new T; - return *null_global_impl::instance_.ptr_; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NULL_GLOBAL_HPP diff --git a/scout_sdk/asio/asio/detail/null_mutex.hpp b/scout_sdk/asio/asio/detail/null_mutex.hpp deleted file mode 100644 index afe3fc0..0000000 --- a/scout_sdk/asio/asio/detail/null_mutex.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// detail/null_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_MUTEX_HPP -#define ASIO_DETAIL_NULL_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class null_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - null_mutex() - { - } - - // Destructor. - ~null_mutex() - { - } - - // Lock the mutex. - void lock() - { - } - - // Unlock the mutex. - void unlock() - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_THREADS) - -#endif // ASIO_DETAIL_NULL_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/null_reactor.hpp b/scout_sdk/asio/asio/detail/null_reactor.hpp deleted file mode 100644 index ca3c5fd..0000000 --- a/scout_sdk/asio/asio/detail/null_reactor.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// detail/null_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_REACTOR_HPP -#define ASIO_DETAIL_NULL_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/scheduler_operation.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class null_reactor - : public execution_context_service_base -{ -public: - // Constructor. - null_reactor(asio::execution_context& ctx) - : execution_context_service_base(ctx) - { - } - - // Destructor. - ~null_reactor() - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - } - - // No-op because should never be called. - void run(long /*usec*/, op_queue& /*ops*/) - { - } - - // No-op. - void interrupt() - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_NULL_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/null_signal_blocker.hpp b/scout_sdk/asio/asio/detail/null_signal_blocker.hpp deleted file mode 100644 index edfe820..0000000 --- a/scout_sdk/asio/asio/detail/null_signal_blocker.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// -// detail/null_signal_blocker.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP -#define ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) \ - || defined(ASIO_WINDOWS) \ - || defined(ASIO_WINDOWS_RUNTIME) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class null_signal_blocker - : private noncopyable -{ -public: - // Constructor blocks all signals for the calling thread. - null_signal_blocker() - { - } - - // Destructor restores the previous signal mask. - ~null_signal_blocker() - { - } - - // Block all signals for the calling thread. - void block() - { - } - - // Restore the previous signal mask. - void unblock() - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_THREADS) - // || defined(ASIO_WINDOWS) - // || defined(ASIO_WINDOWS_RUNTIME) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - -#endif // ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP diff --git a/scout_sdk/asio/asio/detail/null_socket_service.hpp b/scout_sdk/asio/asio/detail/null_socket_service.hpp deleted file mode 100644 index 109c6c7..0000000 --- a/scout_sdk/asio/asio/detail/null_socket_service.hpp +++ /dev/null @@ -1,508 +0,0 @@ -// -// detail/null_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_SOCKET_SERVICE_HPP -#define ASIO_DETAIL_NULL_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/buffer.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/bind_handler.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class null_socket_service : - public service_base > -{ -public: - // The protocol type. - typedef Protocol protocol_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The native type of a socket. - typedef int native_handle_type; - - // The implementation type of the socket. - struct implementation_type - { - }; - - // Constructor. - null_socket_service(asio::io_context& io_context) - : service_base >(io_context), - io_context_(io_context) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - } - - // Construct a new socket implementation. - void construct(implementation_type&) - { - } - - // Move-construct a new socket implementation. - void move_construct(implementation_type&, implementation_type&) - { - } - - // Move-assign from another socket implementation. - void move_assign(implementation_type&, - null_socket_service&, implementation_type&) - { - } - - // Move-construct a new socket implementation from another protocol type. - template - void converting_move_construct(implementation_type&, - null_socket_service&, - typename null_socket_service::implementation_type&) - { - } - - // Destroy a socket implementation. - void destroy(implementation_type&) - { - } - - // Open a new socket implementation. - asio::error_code open(implementation_type&, - const protocol_type&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Assign a native socket to a socket implementation. - asio::error_code assign(implementation_type&, const protocol_type&, - const native_handle_type&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Determine whether the socket is open. - bool is_open(const implementation_type&) const - { - return false; - } - - // Destroy a socket implementation. - asio::error_code close(implementation_type&, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Release ownership of the socket. - native_handle_type release(implementation_type&, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Get the native socket representation. - native_handle_type native_handle(implementation_type&) - { - return 0; - } - - // Cancel all operations associated with the socket. - asio::error_code cancel(implementation_type&, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Determine whether the socket is at the out-of-band data mark. - bool at_mark(const implementation_type&, - asio::error_code& ec) const - { - ec = asio::error::operation_not_supported; - return false; - } - - // Determine the number of bytes available for reading. - std::size_t available(const implementation_type&, - asio::error_code& ec) const - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Place the socket into the state where it will listen for new connections. - asio::error_code listen(implementation_type&, - int, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Perform an IO control command on the socket. - template - asio::error_code io_control(implementation_type&, - IO_Control_Command&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Gets the non-blocking mode of the socket. - bool non_blocking(const implementation_type&) const - { - return false; - } - - // Sets the non-blocking mode of the socket. - asio::error_code non_blocking(implementation_type&, - bool, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const implementation_type&) const - { - return false; - } - - // Sets the non-blocking mode of the native socket implementation. - asio::error_code native_non_blocking(implementation_type&, - bool, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Disable sends or receives on the socket. - asio::error_code shutdown(implementation_type&, - socket_base::shutdown_type, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Bind the socket to the specified local endpoint. - asio::error_code bind(implementation_type&, - const endpoint_type&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Set a socket option. - template - asio::error_code set_option(implementation_type&, - const Option&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Set a socket option. - template - asio::error_code get_option(const implementation_type&, - Option&, asio::error_code& ec) const - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Get the local endpoint. - endpoint_type local_endpoint(const implementation_type&, - asio::error_code& ec) const - { - ec = asio::error::operation_not_supported; - return endpoint_type(); - } - - // Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type&, - asio::error_code& ec) const - { - ec = asio::error::operation_not_supported; - return endpoint_type(); - } - - // Send the given data to the peer. - template - std::size_t send(implementation_type&, const ConstBufferSequence&, - socket_base::message_flags, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Wait until data can be sent without blocking. - std::size_t send(implementation_type&, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send(implementation_type&, const ConstBufferSequence&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Start an asynchronous wait until data can be sent without blocking. - template - void async_send(implementation_type&, const null_buffers&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Receive some data from the peer. Returns the number of bytes received. - template - std::size_t receive(implementation_type&, const MutableBufferSequence&, - socket_base::message_flags, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Wait until data can be received without blocking. - std::size_t receive(implementation_type&, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive(implementation_type&, const MutableBufferSequence&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Wait until data can be received without blocking. - template - void async_receive(implementation_type&, const null_buffers&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Receive some data with associated flags. Returns the number of bytes - // received. - template - std::size_t receive_with_flags(implementation_type&, - const MutableBufferSequence&, socket_base::message_flags, - socket_base::message_flags&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Wait until data can be received without blocking. - std::size_t receive_with_flags(implementation_type&, - const null_buffers&, socket_base::message_flags, - socket_base::message_flags&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive_with_flags(implementation_type&, - const MutableBufferSequence&, socket_base::message_flags, - socket_base::message_flags&, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Wait until data can be received without blocking. - template - void async_receive_with_flags(implementation_type&, - const null_buffers&, socket_base::message_flags, - socket_base::message_flags&, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Send a datagram to the specified endpoint. Returns the number of bytes - // sent. - template - std::size_t send_to(implementation_type&, const ConstBufferSequence&, - const endpoint_type&, socket_base::message_flags, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Wait until data can be sent without blocking. - std::size_t send_to(implementation_type&, const null_buffers&, - const endpoint_type&, socket_base::message_flags, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send_to(implementation_type&, const ConstBufferSequence&, - const endpoint_type&, socket_base::message_flags, - Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Start an asynchronous wait until data can be sent without blocking. - template - void async_send_to(implementation_type&, const null_buffers&, - const endpoint_type&, socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Receive a datagram with the endpoint of the sender. Returns the number of - // bytes received. - template - std::size_t receive_from(implementation_type&, const MutableBufferSequence&, - endpoint_type&, socket_base::message_flags, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Wait until data can be received without blocking. - std::size_t receive_from(implementation_type&, const null_buffers&, - endpoint_type&, socket_base::message_flags, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received and - // the sender_endpoint object must both be valid for the lifetime of the - // asynchronous operation. - template - void async_receive_from(implementation_type&, - const MutableBufferSequence&, endpoint_type&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Wait until data can be received without blocking. - template - void async_receive_from(implementation_type&, - const null_buffers&, endpoint_type&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.post(detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Accept a new connection. - template - asio::error_code accept(implementation_type&, - Socket&, endpoint_type*, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Start an asynchronous accept. The peer and peer_endpoint objects - // must be valid until the accept's handler is invoked. - template - void async_accept(implementation_type&, Socket&, - endpoint_type*, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - io_context_.post(detail::bind_handler(handler, ec)); - } - - // Connect the socket to the specified endpoint. - asio::error_code connect(implementation_type&, - const endpoint_type&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Start an asynchronous connect. - template - void async_connect(implementation_type&, - const endpoint_type&, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - io_context_.post(detail::bind_handler(handler, ec)); - } - -private: - asio::io_context& io_context_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_NULL_SOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/null_static_mutex.hpp b/scout_sdk/asio/asio/detail/null_static_mutex.hpp deleted file mode 100644 index 36ec04f..0000000 --- a/scout_sdk/asio/asio/detail/null_static_mutex.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// detail/null_static_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_STATIC_MUTEX_HPP -#define ASIO_DETAIL_NULL_STATIC_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) - -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct null_static_mutex -{ - typedef asio::detail::scoped_lock scoped_lock; - - // Initialise the mutex. - void init() - { - } - - // Lock the mutex. - void lock() - { - } - - // Unlock the mutex. - void unlock() - { - } - - int unused_; -}; - -#define ASIO_NULL_STATIC_MUTEX_INIT { 0 } - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_THREADS) - -#endif // ASIO_DETAIL_NULL_STATIC_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/null_thread.hpp b/scout_sdk/asio/asio/detail/null_thread.hpp deleted file mode 100644 index 7291ba3..0000000 --- a/scout_sdk/asio/asio/detail/null_thread.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// detail/null_thread.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_THREAD_HPP -#define ASIO_DETAIL_NULL_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class null_thread - : private noncopyable -{ -public: - // Constructor. - template - null_thread(Function, unsigned int = 0) - { - asio::detail::throw_error( - asio::error::operation_not_supported, "thread"); - } - - // Destructor. - ~null_thread() - { - } - - // Wait for the thread to exit. - void join() - { - } - - // Get number of CPUs. - static std::size_t hardware_concurrency() - { - return 1; - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_THREADS) - -#endif // ASIO_DETAIL_NULL_THREAD_HPP diff --git a/scout_sdk/asio/asio/detail/null_tss_ptr.hpp b/scout_sdk/asio/asio/detail/null_tss_ptr.hpp deleted file mode 100644 index 323967d..0000000 --- a/scout_sdk/asio/asio/detail/null_tss_ptr.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// detail/null_tss_ptr.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_TSS_PTR_HPP -#define ASIO_DETAIL_NULL_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class null_tss_ptr - : private noncopyable -{ -public: - // Constructor. - null_tss_ptr() - : value_(0) - { - } - - // Destructor. - ~null_tss_ptr() - { - } - - // Get the value. - operator T*() const - { - return value_; - } - - // Set the value. - void operator=(T* value) - { - value_ = value; - } - -private: - T* value_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_THREADS) - -#endif // ASIO_DETAIL_NULL_TSS_PTR_HPP diff --git a/scout_sdk/asio/asio/detail/object_pool.hpp b/scout_sdk/asio/asio/detail/object_pool.hpp deleted file mode 100644 index e1a3c54..0000000 --- a/scout_sdk/asio/asio/detail/object_pool.hpp +++ /dev/null @@ -1,171 +0,0 @@ -// -// detail/object_pool.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_OBJECT_POOL_HPP -#define ASIO_DETAIL_OBJECT_POOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class object_pool; - -class object_pool_access -{ -public: - template - static Object* create() - { - return new Object; - } - - template - static Object* create(Arg arg) - { - return new Object(arg); - } - - template - static void destroy(Object* o) - { - delete o; - } - - template - static Object*& next(Object* o) - { - return o->next_; - } - - template - static Object*& prev(Object* o) - { - return o->prev_; - } -}; - -template -class object_pool - : private noncopyable -{ -public: - // Constructor. - object_pool() - : live_list_(0), - free_list_(0) - { - } - - // Destructor destroys all objects. - ~object_pool() - { - destroy_list(live_list_); - destroy_list(free_list_); - } - - // Get the object at the start of the live list. - Object* first() - { - return live_list_; - } - - // Allocate a new object. - Object* alloc() - { - Object* o = free_list_; - if (o) - free_list_ = object_pool_access::next(free_list_); - else - o = object_pool_access::create(); - - object_pool_access::next(o) = live_list_; - object_pool_access::prev(o) = 0; - if (live_list_) - object_pool_access::prev(live_list_) = o; - live_list_ = o; - - return o; - } - - // Allocate a new object with an argument. - template - Object* alloc(Arg arg) - { - Object* o = free_list_; - if (o) - free_list_ = object_pool_access::next(free_list_); - else - o = object_pool_access::create(arg); - - object_pool_access::next(o) = live_list_; - object_pool_access::prev(o) = 0; - if (live_list_) - object_pool_access::prev(live_list_) = o; - live_list_ = o; - - return o; - } - - // Free an object. Moves it to the free list. No destructors are run. - void free(Object* o) - { - if (live_list_ == o) - live_list_ = object_pool_access::next(o); - - if (object_pool_access::prev(o)) - { - object_pool_access::next(object_pool_access::prev(o)) - = object_pool_access::next(o); - } - - if (object_pool_access::next(o)) - { - object_pool_access::prev(object_pool_access::next(o)) - = object_pool_access::prev(o); - } - - object_pool_access::next(o) = free_list_; - object_pool_access::prev(o) = 0; - free_list_ = o; - } - -private: - // Helper function to destroy all elements in a list. - void destroy_list(Object* list) - { - while (list) - { - Object* o = list; - list = object_pool_access::next(o); - object_pool_access::destroy(o); - } - } - - // The list of live objects. - Object* live_list_; - - // The free list. - Object* free_list_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_OBJECT_POOL_HPP diff --git a/scout_sdk/asio/asio/detail/old_win_sdk_compat.hpp b/scout_sdk/asio/asio/detail/old_win_sdk_compat.hpp deleted file mode 100644 index bfb109e..0000000 --- a/scout_sdk/asio/asio/detail/old_win_sdk_compat.hpp +++ /dev/null @@ -1,214 +0,0 @@ -// -// detail/old_win_sdk_compat.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP -#define ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -// Guess whether we are building against on old Platform SDK. -#if !defined(IN6ADDR_ANY_INIT) -#define ASIO_HAS_OLD_WIN_SDK 1 -#endif // !defined(IN6ADDR_ANY_INIT) - -#if defined(ASIO_HAS_OLD_WIN_SDK) - -// Emulation of types that are missing from old Platform SDKs. -// -// N.B. this emulation is also used if building for a Windows 2000 target with -// a recent (i.e. Vista or later) SDK, as the SDK does not provide IPv6 support -// in that case. - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -enum -{ - sockaddr_storage_maxsize = 128, // Maximum size. - sockaddr_storage_alignsize = (sizeof(__int64)), // Desired alignment. - sockaddr_storage_pad1size = (sockaddr_storage_alignsize - sizeof(short)), - sockaddr_storage_pad2size = (sockaddr_storage_maxsize - - (sizeof(short) + sockaddr_storage_pad1size + sockaddr_storage_alignsize)) -}; - -struct sockaddr_storage_emulation -{ - short ss_family; - char __ss_pad1[sockaddr_storage_pad1size]; - __int64 __ss_align; - char __ss_pad2[sockaddr_storage_pad2size]; -}; - -struct in6_addr_emulation -{ - union - { - u_char Byte[16]; - u_short Word[8]; - } u; -}; - -#if !defined(s6_addr) -# define _S6_un u -# define _S6_u8 Byte -# define s6_addr _S6_un._S6_u8 -#endif // !defined(s6_addr) - -struct sockaddr_in6_emulation -{ - short sin6_family; - u_short sin6_port; - u_long sin6_flowinfo; - in6_addr_emulation sin6_addr; - u_long sin6_scope_id; -}; - -struct ipv6_mreq_emulation -{ - in6_addr_emulation ipv6mr_multiaddr; - unsigned int ipv6mr_interface; -}; - -struct addrinfo_emulation -{ - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - size_t ai_addrlen; - char* ai_canonname; - sockaddr* ai_addr; - addrinfo_emulation* ai_next; -}; - -#if !defined(AI_PASSIVE) -# define AI_PASSIVE 0x1 -#endif - -#if !defined(AI_CANONNAME) -# define AI_CANONNAME 0x2 -#endif - -#if !defined(AI_NUMERICHOST) -# define AI_NUMERICHOST 0x4 -#endif - -#if !defined(EAI_AGAIN) -# define EAI_AGAIN WSATRY_AGAIN -#endif - -#if !defined(EAI_BADFLAGS) -# define EAI_BADFLAGS WSAEINVAL -#endif - -#if !defined(EAI_FAIL) -# define EAI_FAIL WSANO_RECOVERY -#endif - -#if !defined(EAI_FAMILY) -# define EAI_FAMILY WSAEAFNOSUPPORT -#endif - -#if !defined(EAI_MEMORY) -# define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY -#endif - -#if !defined(EAI_NODATA) -# define EAI_NODATA WSANO_DATA -#endif - -#if !defined(EAI_NONAME) -# define EAI_NONAME WSAHOST_NOT_FOUND -#endif - -#if !defined(EAI_SERVICE) -# define EAI_SERVICE WSATYPE_NOT_FOUND -#endif - -#if !defined(EAI_SOCKTYPE) -# define EAI_SOCKTYPE WSAESOCKTNOSUPPORT -#endif - -#if !defined(NI_NOFQDN) -# define NI_NOFQDN 0x01 -#endif - -#if !defined(NI_NUMERICHOST) -# define NI_NUMERICHOST 0x02 -#endif - -#if !defined(NI_NAMEREQD) -# define NI_NAMEREQD 0x04 -#endif - -#if !defined(NI_NUMERICSERV) -# define NI_NUMERICSERV 0x08 -#endif - -#if !defined(NI_DGRAM) -# define NI_DGRAM 0x10 -#endif - -#if !defined(IPPROTO_IPV6) -# define IPPROTO_IPV6 41 -#endif - -#if !defined(IPV6_UNICAST_HOPS) -# define IPV6_UNICAST_HOPS 4 -#endif - -#if !defined(IPV6_MULTICAST_IF) -# define IPV6_MULTICAST_IF 9 -#endif - -#if !defined(IPV6_MULTICAST_HOPS) -# define IPV6_MULTICAST_HOPS 10 -#endif - -#if !defined(IPV6_MULTICAST_LOOP) -# define IPV6_MULTICAST_LOOP 11 -#endif - -#if !defined(IPV6_JOIN_GROUP) -# define IPV6_JOIN_GROUP 12 -#endif - -#if !defined(IPV6_LEAVE_GROUP) -# define IPV6_LEAVE_GROUP 13 -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_OLD_WIN_SDK) - -// Even newer Platform SDKs that support IPv6 may not define IPV6_V6ONLY. -#if !defined(IPV6_V6ONLY) -# define IPV6_V6ONLY 27 -#endif - -// Some SDKs (e.g. Windows CE) don't define IPPROTO_ICMPV6. -#if !defined(IPPROTO_ICMPV6) -# define IPPROTO_ICMPV6 58 -#endif - -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#endif // ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP diff --git a/scout_sdk/asio/asio/detail/op_queue.hpp b/scout_sdk/asio/asio/detail/op_queue.hpp deleted file mode 100644 index 6219f79..0000000 --- a/scout_sdk/asio/asio/detail/op_queue.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// -// detail/op_queue.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_OP_QUEUE_HPP -#define ASIO_DETAIL_OP_QUEUE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class op_queue; - -class op_queue_access -{ -public: - template - static Operation* next(Operation* o) - { - return static_cast(o->next_); - } - - template - static void next(Operation1*& o1, Operation2* o2) - { - o1->next_ = o2; - } - - template - static void destroy(Operation* o) - { - o->destroy(); - } - - template - static Operation*& front(op_queue& q) - { - return q.front_; - } - - template - static Operation*& back(op_queue& q) - { - return q.back_; - } -}; - -template -class op_queue - : private noncopyable -{ -public: - // Constructor. - op_queue() - : front_(0), - back_(0) - { - } - - // Destructor destroys all operations. - ~op_queue() - { - while (Operation* op = front_) - { - pop(); - op_queue_access::destroy(op); - } - } - - // Get the operation at the front of the queue. - Operation* front() - { - return front_; - } - - // Pop an operation from the front of the queue. - void pop() - { - if (front_) - { - Operation* tmp = front_; - front_ = op_queue_access::next(front_); - if (front_ == 0) - back_ = 0; - op_queue_access::next(tmp, static_cast(0)); - } - } - - // Push an operation on to the back of the queue. - void push(Operation* h) - { - op_queue_access::next(h, static_cast(0)); - if (back_) - { - op_queue_access::next(back_, h); - back_ = h; - } - else - { - front_ = back_ = h; - } - } - - // Push all operations from another queue on to the back of the queue. The - // source queue may contain operations of a derived type. - template - void push(op_queue& q) - { - if (Operation* other_front = op_queue_access::front(q)) - { - if (back_) - op_queue_access::next(back_, other_front); - else - front_ = other_front; - back_ = op_queue_access::back(q); - op_queue_access::front(q) = 0; - op_queue_access::back(q) = 0; - } - } - - // Whether the queue is empty. - bool empty() const - { - return front_ == 0; - } - - // Test whether an operation is already enqueued. - bool is_enqueued(Operation* o) const - { - return op_queue_access::next(o) != 0 || back_ == o; - } - -private: - friend class op_queue_access; - - // The front of the queue. - Operation* front_; - - // The back of the queue. - Operation* back_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_OP_QUEUE_HPP diff --git a/scout_sdk/asio/asio/detail/operation.hpp b/scout_sdk/asio/asio/detail/operation.hpp deleted file mode 100644 index 811e54d..0000000 --- a/scout_sdk/asio/asio/detail/operation.hpp +++ /dev/null @@ -1,38 +0,0 @@ -// -// detail/operation.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_OPERATION_HPP -#define ASIO_DETAIL_OPERATION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_operation.hpp" -#else -# include "asio/detail/scheduler_operation.hpp" -#endif - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_IOCP) -typedef win_iocp_operation operation; -#else -typedef scheduler_operation operation; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_OPERATION_HPP diff --git a/scout_sdk/asio/asio/detail/pipe_select_interrupter.hpp b/scout_sdk/asio/asio/detail/pipe_select_interrupter.hpp deleted file mode 100644 index 55d7db4..0000000 --- a/scout_sdk/asio/asio/detail/pipe_select_interrupter.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// detail/pipe_select_interrupter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP -#define ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) -#if !defined(ASIO_WINDOWS_RUNTIME) -#if !defined(__CYGWIN__) -#if !defined(__SYMBIAN32__) -#if !defined(ASIO_HAS_EVENTFD) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class pipe_select_interrupter -{ -public: - // Constructor. - ASIO_DECL pipe_select_interrupter(); - - // Destructor. - ASIO_DECL ~pipe_select_interrupter(); - - // Recreate the interrupter's descriptors. Used after a fork. - ASIO_DECL void recreate(); - - // Interrupt the select call. - ASIO_DECL void interrupt(); - - // Reset the select interrupt. Returns true if the call was interrupted. - ASIO_DECL bool reset(); - - // Get the read descriptor to be passed to select. - int read_descriptor() const - { - return read_descriptor_; - } - -private: - // Open the descriptors. Throws on error. - ASIO_DECL void open_descriptors(); - - // Close the descriptors. - ASIO_DECL void close_descriptors(); - - // The read end of a connection used to interrupt the select call. This file - // descriptor is passed to select such that when it is time to stop, a single - // byte will be written on the other end of the connection and this - // descriptor will become readable. - int read_descriptor_; - - // The write end of a connection used to interrupt the select call. A single - // byte may be written to this to wake up the select which is waiting for the - // other end to become readable. - int write_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/pipe_select_interrupter.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // !defined(ASIO_HAS_EVENTFD) -#endif // !defined(__SYMBIAN32__) -#endif // !defined(__CYGWIN__) -#endif // !defined(ASIO_WINDOWS_RUNTIME) -#endif // !defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP diff --git a/scout_sdk/asio/asio/detail/pop_options.hpp b/scout_sdk/asio/asio/detail/pop_options.hpp deleted file mode 100644 index 1045612..0000000 --- a/scout_sdk/asio/asio/detail/pop_options.hpp +++ /dev/null @@ -1,135 +0,0 @@ -// -// detail/pop_options.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -// No header guard - -#if defined(__COMO__) - -// Comeau C++ - -#elif defined(__DMC__) - -// Digital Mars C++ - -#elif defined(__INTEL_COMPILER) || defined(__ICL) \ - || defined(__ICC) || defined(__ECC) - -// Intel C++ - -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility pop -# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) - -#elif defined(__clang__) - -// Clang - -# if defined(__OBJC__) -# if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) -# if defined(ASIO_OBJC_WORKAROUND) -# undef Protocol -# undef id -# undef ASIO_OBJC_WORKAROUND -# endif -# endif -# endif - -# if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) -# pragma GCC visibility pop -# endif // !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) - -#elif defined(__GNUC__) - -// GNU C++ - -# if defined(__MINGW32__) || defined(__CYGWIN__) -# pragma pack (pop) -# endif - -# if defined(__OBJC__) -# if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) -# if defined(ASIO_OBJC_WORKAROUND) -# undef Protocol -# undef id -# undef ASIO_OBJC_WORKAROUND -# endif -# endif -# endif - -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility pop -# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) - -# if (__GNUC__ >= 7) -# pragma GCC diagnostic pop -# endif // (__GNUC__ >= 7) - -#elif defined(__KCC) - -// Kai C++ - -#elif defined(__sgi) - -// SGI MIPSpro C++ - -#elif defined(__DECCXX) - -// Compaq Tru64 Unix cxx - -#elif defined(__ghs) - -// Greenhills C++ - -#elif defined(__BORLANDC__) - -// Borland C++ - -# pragma option pop -# pragma nopushoptwarn -# pragma nopackwarning - -#elif defined(__MWERKS__) - -// Metrowerks CodeWarrior - -#elif defined(__SUNPRO_CC) - -// Sun Workshop Compiler C++ - -#elif defined(__HP_aCC) - -// HP aCC - -#elif defined(__MRC__) || defined(__SC__) - -// MPW MrCpp or SCpp - -#elif defined(__IBMCPP__) - -// IBM Visual Age - -#elif defined(_MSC_VER) - -// Microsoft Visual C++ -// -// Must remain the last #elif since some other vendors (Metrowerks, for example) -// also #define _MSC_VER - -# pragma warning (pop) -# pragma pack (pop) - -# if defined(__cplusplus_cli) || defined(__cplusplus_winrt) -# if defined(ASIO_CLR_WORKAROUND) -# undef generic -# undef ASIO_CLR_WORKAROUND -# endif -# endif - -#endif diff --git a/scout_sdk/asio/asio/detail/posix_event.hpp b/scout_sdk/asio/asio/detail/posix_event.hpp deleted file mode 100644 index 121065e..0000000 --- a/scout_sdk/asio/asio/detail/posix_event.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// -// detail/posix_event.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_EVENT_HPP -#define ASIO_DETAIL_POSIX_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include -#include "asio/detail/assert.hpp" -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class posix_event - : private noncopyable -{ -public: - // Constructor. - ASIO_DECL posix_event(); - - // Destructor. - ~posix_event() - { - ::pthread_cond_destroy(&cond_); - } - - // Signal the event. (Retained for backward compatibility.) - template - void signal(Lock& lock) - { - this->signal_all(lock); - } - - // Signal all waiters. - template - void signal_all(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - (void)lock; - state_ |= 1; - ::pthread_cond_broadcast(&cond_); // Ignore EINVAL. - } - - // Unlock the mutex and signal one waiter. - template - void unlock_and_signal_one(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - state_ |= 1; - bool have_waiters = (state_ > 1); - lock.unlock(); - if (have_waiters) - ::pthread_cond_signal(&cond_); // Ignore EINVAL. - } - - // If there's a waiter, unlock the mutex and signal it. - template - bool maybe_unlock_and_signal_one(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - state_ |= 1; - if (state_ > 1) - { - lock.unlock(); - ::pthread_cond_signal(&cond_); // Ignore EINVAL. - return true; - } - return false; - } - - // Reset the event. - template - void clear(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - (void)lock; - state_ &= ~std::size_t(1); - } - - // Wait for the event to become signalled. - template - void wait(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - while ((state_ & 1) == 0) - { - state_ += 2; - ::pthread_cond_wait(&cond_, &lock.mutex().mutex_); // Ignore EINVAL. - state_ -= 2; - } - } - - // Timed wait for the event to become signalled. - template - bool wait_for_usec(Lock& lock, long usec) - { - ASIO_ASSERT(lock.locked()); - if ((state_ & 1) == 0) - { - state_ += 2; - timespec ts; -#if (defined(__MACH__) && defined(__APPLE__)) \ - || (defined(__ANDROID__) && (__ANDROID_API__ < 21) \ - && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)) - ts.tv_sec = usec / 1000000; - ts.tv_nsec = (usec % 1000000) * 1000; - ::pthread_cond_timedwait_relative_np( - &cond_, &lock.mutex().mutex_, &ts); // Ignore EINVAL. -#else // (defined(__MACH__) && defined(__APPLE__)) - // || (defined(__ANDROID__) && (__ANDROID_API__ < 21) - // && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)) - if (::clock_gettime(CLOCK_MONOTONIC, &ts) == 0) - { - ts.tv_sec += usec / 1000000; - ts.tv_nsec = (usec % 1000000) * 1000; - ts.tv_sec += ts.tv_nsec / 1000000000; - ts.tv_nsec = ts.tv_nsec % 1000000000; - ::pthread_cond_timedwait(&cond_, - &lock.mutex().mutex_, &ts); // Ignore EINVAL. - } -#endif // (defined(__MACH__) && defined(__APPLE__)) - // || (defined(__ANDROID__) && (__ANDROID_API__ < 21) - // && defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)) - state_ -= 2; - } - return (state_ & 1) != 0; - } - -private: - ::pthread_cond_t cond_; - std::size_t state_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/posix_event.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_POSIX_EVENT_HPP diff --git a/scout_sdk/asio/asio/detail/posix_fd_set_adapter.hpp b/scout_sdk/asio/asio/detail/posix_fd_set_adapter.hpp deleted file mode 100644 index 95042d6..0000000 --- a/scout_sdk/asio/asio/detail/posix_fd_set_adapter.hpp +++ /dev/null @@ -1,118 +0,0 @@ -// -// detail/posix_fd_set_adapter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP -#define ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) \ - && !defined(__CYGWIN__) \ - && !defined(ASIO_WINDOWS_RUNTIME) - -#include -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/reactor_op_queue.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Adapts the FD_SET type to meet the Descriptor_Set concept's requirements. -class posix_fd_set_adapter : noncopyable -{ -public: - posix_fd_set_adapter() - : max_descriptor_(invalid_socket) - { - using namespace std; // Needed for memset on Solaris. - FD_ZERO(&fd_set_); - } - - void reset() - { - using namespace std; // Needed for memset on Solaris. - FD_ZERO(&fd_set_); - } - - bool set(socket_type descriptor) - { - if (descriptor < (socket_type)FD_SETSIZE) - { - if (max_descriptor_ == invalid_socket || descriptor > max_descriptor_) - max_descriptor_ = descriptor; - FD_SET(descriptor, &fd_set_); - return true; - } - return false; - } - - void set(reactor_op_queue& operations, op_queue& ops) - { - reactor_op_queue::iterator i = operations.begin(); - while (i != operations.end()) - { - reactor_op_queue::iterator op_iter = i++; - if (!set(op_iter->first)) - { - asio::error_code ec(error::fd_set_failure); - operations.cancel_operations(op_iter, ops, ec); - } - } - } - - bool is_set(socket_type descriptor) const - { - return FD_ISSET(descriptor, &fd_set_) != 0; - } - - operator fd_set*() - { - return &fd_set_; - } - - socket_type max_descriptor() const - { - return max_descriptor_; - } - - void perform(reactor_op_queue& operations, - op_queue& ops) const - { - reactor_op_queue::iterator i = operations.begin(); - while (i != operations.end()) - { - reactor_op_queue::iterator op_iter = i++; - if (is_set(op_iter->first)) - operations.perform_operations(op_iter, ops); - } - } - -private: - mutable fd_set fd_set_; - socket_type max_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) - // && !defined(__CYGWIN__) - // && !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP diff --git a/scout_sdk/asio/asio/detail/posix_global.hpp b/scout_sdk/asio/asio/detail/posix_global.hpp deleted file mode 100644 index 7ee0a71..0000000 --- a/scout_sdk/asio/asio/detail/posix_global.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// -// detail/posix_global.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_GLOBAL_HPP -#define ASIO_DETAIL_POSIX_GLOBAL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct posix_global_impl -{ - // Helper function to perform initialisation. - static void do_init() - { - instance_.static_ptr_ = instance_.ptr_ = new T; - } - - // Destructor automatically cleans up the global. - ~posix_global_impl() - { - delete static_ptr_; - } - - static ::pthread_once_t init_once_; - static T* static_ptr_; - static posix_global_impl instance_; - T* ptr_; -}; - -template -::pthread_once_t posix_global_impl::init_once_ = PTHREAD_ONCE_INIT; - -template -T* posix_global_impl::static_ptr_ = 0; - -template -posix_global_impl posix_global_impl::instance_; - -template -T& posix_global() -{ - int result = ::pthread_once( - &posix_global_impl::init_once_, - &posix_global_impl::do_init); - - if (result != 0) - std::terminate(); - - return *posix_global_impl::instance_.ptr_; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_POSIX_GLOBAL_HPP diff --git a/scout_sdk/asio/asio/detail/posix_mutex.hpp b/scout_sdk/asio/asio/detail/posix_mutex.hpp deleted file mode 100644 index c0d9fc9..0000000 --- a/scout_sdk/asio/asio/detail/posix_mutex.hpp +++ /dev/null @@ -1,76 +0,0 @@ -// -// detail/posix_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_MUTEX_HPP -#define ASIO_DETAIL_POSIX_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class posix_event; - -class posix_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - ASIO_DECL posix_mutex(); - - // Destructor. - ~posix_mutex() - { - ::pthread_mutex_destroy(&mutex_); // Ignore EBUSY. - } - - // Lock the mutex. - void lock() - { - (void)::pthread_mutex_lock(&mutex_); // Ignore EINVAL. - } - - // Unlock the mutex. - void unlock() - { - (void)::pthread_mutex_unlock(&mutex_); // Ignore EINVAL. - } - -private: - friend class posix_event; - ::pthread_mutex_t mutex_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/posix_mutex.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_POSIX_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/posix_signal_blocker.hpp b/scout_sdk/asio/asio/detail/posix_signal_blocker.hpp deleted file mode 100644 index fab5eb1..0000000 --- a/scout_sdk/asio/asio/detail/posix_signal_blocker.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// detail/posix_signal_blocker.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP -#define ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include -#include -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class posix_signal_blocker - : private noncopyable -{ -public: - // Constructor blocks all signals for the calling thread. - posix_signal_blocker() - : blocked_(false) - { - sigset_t new_mask; - sigfillset(&new_mask); - blocked_ = (pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_) == 0); - } - - // Destructor restores the previous signal mask. - ~posix_signal_blocker() - { - if (blocked_) - pthread_sigmask(SIG_SETMASK, &old_mask_, 0); - } - - // Block all signals for the calling thread. - void block() - { - if (!blocked_) - { - sigset_t new_mask; - sigfillset(&new_mask); - blocked_ = (pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_) == 0); - } - } - - // Restore the previous signal mask. - void unblock() - { - if (blocked_) - blocked_ = (pthread_sigmask(SIG_SETMASK, &old_mask_, 0) != 0); - } - -private: - // Have signals been blocked. - bool blocked_; - - // The previous signal mask. - sigset_t old_mask_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP diff --git a/scout_sdk/asio/asio/detail/posix_static_mutex.hpp b/scout_sdk/asio/asio/detail/posix_static_mutex.hpp deleted file mode 100644 index 59b86c1..0000000 --- a/scout_sdk/asio/asio/detail/posix_static_mutex.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// -// detail/posix_static_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_STATIC_MUTEX_HPP -#define ASIO_DETAIL_POSIX_STATIC_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct posix_static_mutex -{ - typedef asio::detail::scoped_lock scoped_lock; - - // Initialise the mutex. - void init() - { - // Nothing to do. - } - - // Lock the mutex. - void lock() - { - (void)::pthread_mutex_lock(&mutex_); // Ignore EINVAL. - } - - // Unlock the mutex. - void unlock() - { - (void)::pthread_mutex_unlock(&mutex_); // Ignore EINVAL. - } - - ::pthread_mutex_t mutex_; -}; - -#define ASIO_POSIX_STATIC_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER } - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_POSIX_STATIC_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/posix_thread.hpp b/scout_sdk/asio/asio/detail/posix_thread.hpp deleted file mode 100644 index 1817af2..0000000 --- a/scout_sdk/asio/asio/detail/posix_thread.hpp +++ /dev/null @@ -1,109 +0,0 @@ -// -// detail/posix_thread.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_THREAD_HPP -#define ASIO_DETAIL_POSIX_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -extern "C" -{ - ASIO_DECL void* asio_detail_posix_thread_function(void* arg); -} - -class posix_thread - : private noncopyable -{ -public: - // Constructor. - template - posix_thread(Function f, unsigned int = 0) - : joined_(false) - { - start_thread(new func(f)); - } - - // Destructor. - ASIO_DECL ~posix_thread(); - - // Wait for the thread to exit. - ASIO_DECL void join(); - - // Get number of CPUs. - ASIO_DECL static std::size_t hardware_concurrency(); - -private: - friend void* asio_detail_posix_thread_function(void* arg); - - class func_base - { - public: - virtual ~func_base() {} - virtual void run() = 0; - }; - - struct auto_func_base_ptr - { - func_base* ptr; - ~auto_func_base_ptr() { delete ptr; } - }; - - template - class func - : public func_base - { - public: - func(Function f) - : f_(f) - { - } - - virtual void run() - { - f_(); - } - - private: - Function f_; - }; - - ASIO_DECL void start_thread(func_base* arg); - - ::pthread_t thread_; - bool joined_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/posix_thread.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_POSIX_THREAD_HPP diff --git a/scout_sdk/asio/asio/detail/posix_tss_ptr.hpp b/scout_sdk/asio/asio/detail/posix_tss_ptr.hpp deleted file mode 100644 index a3096b4..0000000 --- a/scout_sdk/asio/asio/detail/posix_tss_ptr.hpp +++ /dev/null @@ -1,79 +0,0 @@ -// -// detail/posix_tss_ptr.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_TSS_PTR_HPP -#define ASIO_DETAIL_POSIX_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_PTHREADS) - -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Helper function to create thread-specific storage. -ASIO_DECL void posix_tss_ptr_create(pthread_key_t& key); - -template -class posix_tss_ptr - : private noncopyable -{ -public: - // Constructor. - posix_tss_ptr() - { - posix_tss_ptr_create(tss_key_); - } - - // Destructor. - ~posix_tss_ptr() - { - ::pthread_key_delete(tss_key_); - } - - // Get the value. - operator T*() const - { - return static_cast(::pthread_getspecific(tss_key_)); - } - - // Set the value. - void operator=(T* value) - { - ::pthread_setspecific(tss_key_, value); - } - -private: - // Thread-specific storage to allow unlocked access to determine whether a - // thread is a member of the pool. - pthread_key_t tss_key_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/posix_tss_ptr.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_PTHREADS) - -#endif // ASIO_DETAIL_POSIX_TSS_PTR_HPP diff --git a/scout_sdk/asio/asio/detail/push_options.hpp b/scout_sdk/asio/asio/detail/push_options.hpp deleted file mode 100644 index 0a3e979..0000000 --- a/scout_sdk/asio/asio/detail/push_options.hpp +++ /dev/null @@ -1,175 +0,0 @@ -// -// detail/push_options.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -// No header guard - -#if defined(__COMO__) - -// Comeau C++ - -#elif defined(__DMC__) - -// Digital Mars C++ - -#elif defined(__INTEL_COMPILER) || defined(__ICL) \ - || defined(__ICC) || defined(__ECC) - -// Intel C++ - -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility push (default) -# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) - -#elif defined(__clang__) - -// Clang - -# if defined(__OBJC__) -# if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) -# if !defined(ASIO_DISABLE_OBJC_WORKAROUND) -# if !defined(Protocol) && !defined(id) -# define Protocol cpp_Protocol -# define id cpp_id -# define ASIO_OBJC_WORKAROUND -# endif -# endif -# endif -# endif - -# if !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) -# pragma GCC visibility push (default) -# endif // !defined(_WIN32) && !defined(__WIN32__) && !defined(WIN32) - -#elif defined(__GNUC__) - -// GNU C++ - -# if defined(__MINGW32__) || defined(__CYGWIN__) -# pragma pack (push, 8) -# endif - -# if defined(__OBJC__) -# if !defined(__APPLE_CC__) || (__APPLE_CC__ <= 1) -# if !defined(ASIO_DISABLE_OBJC_WORKAROUND) -# if !defined(Protocol) && !defined(id) -# define Protocol cpp_Protocol -# define id cpp_id -# define ASIO_OBJC_WORKAROUND -# endif -# endif -# endif -# endif - -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility push (default) -# endif // (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) - -# if (__GNUC__ >= 7) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wimplicit-fallthrough" -# endif // (__GNUC__ >= 7) - -#elif defined(__KCC) - -// Kai C++ - -#elif defined(__sgi) - -// SGI MIPSpro C++ - -#elif defined(__DECCXX) - -// Compaq Tru64 Unix cxx - -#elif defined(__ghs) - -// Greenhills C++ - -#elif defined(__BORLANDC__) - -// Borland C++ - -# pragma option push -a8 -b -Ve- -Vx- -w-inl -vi- -# pragma nopushoptwarn -# pragma nopackwarning -# if !defined(__MT__) -# error Multithreaded RTL must be selected. -# endif // !defined(__MT__) - -#elif defined(__MWERKS__) - -// Metrowerks CodeWarrior - -#elif defined(__SUNPRO_CC) - -// Sun Workshop Compiler C++ - -#elif defined(__HP_aCC) - -// HP aCC - -#elif defined(__MRC__) || defined(__SC__) - -// MPW MrCpp or SCpp - -#elif defined(__IBMCPP__) - -// IBM Visual Age - -#elif defined(_MSC_VER) - -// Microsoft Visual C++ -// -// Must remain the last #elif since some other vendors (Metrowerks, for example) -// also #define _MSC_VER - -# pragma warning (disable:4103) -# pragma warning (push) -# pragma warning (disable:4127) -# pragma warning (disable:4180) -# pragma warning (disable:4244) -# pragma warning (disable:4355) -# pragma warning (disable:4510) -# pragma warning (disable:4512) -# pragma warning (disable:4610) -# pragma warning (disable:4675) -# if (_MSC_VER < 1600) -// Visual Studio 2008 generates spurious warnings about unused parameters. -# pragma warning (disable:4100) -# endif // (_MSC_VER < 1600) -# if defined(_M_IX86) && defined(_Wp64) -// The /Wp64 option is broken. If you want to check 64 bit portability, use a -// 64 bit compiler! -# pragma warning (disable:4311) -# pragma warning (disable:4312) -# endif // defined(_M_IX86) && defined(_Wp64) -# pragma pack (push, 8) -// Note that if the /Og optimisation flag is enabled with MSVC6, the compiler -// has a tendency to incorrectly optimise away some calls to member template -// functions, even though those functions contain code that should not be -// optimised away! Therefore we will always disable this optimisation option -// for the MSVC6 compiler. -# if (_MSC_VER < 1300) -# pragma optimize ("g", off) -# endif -# if !defined(_MT) -# error Multithreaded RTL must be selected. -# endif // !defined(_MT) - -# if defined(__cplusplus_cli) || defined(__cplusplus_winrt) -# if !defined(ASIO_DISABLE_CLR_WORKAROUND) -# if !defined(generic) -# define generic cpp_generic -# define ASIO_CLR_WORKAROUND -# endif -# endif -# endif - -#endif diff --git a/scout_sdk/asio/asio/detail/reactive_descriptor_service.hpp b/scout_sdk/asio/asio/detail/reactive_descriptor_service.hpp deleted file mode 100644 index e866863..0000000 --- a/scout_sdk/asio/asio/detail/reactive_descriptor_service.hpp +++ /dev/null @@ -1,388 +0,0 @@ -// -// detail/reactive_descriptor_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_DESCRIPTOR_SERVICE_HPP -#define ASIO_DETAIL_REACTIVE_DESCRIPTOR_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - -#include "asio/buffer.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/descriptor_ops.hpp" -#include "asio/detail/descriptor_read_op.hpp" -#include "asio/detail/descriptor_write_op.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/reactive_null_buffers_op.hpp" -#include "asio/detail/reactive_wait_op.hpp" -#include "asio/detail/reactor.hpp" -#include "asio/posix/descriptor_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class reactive_descriptor_service : - public service_base -{ -public: - // The native type of a descriptor. - typedef int native_handle_type; - - // The implementation type of the descriptor. - class implementation_type - : private asio::detail::noncopyable - { - public: - // Default constructor. - implementation_type() - : descriptor_(-1), - state_(0) - { - } - - private: - // Only this service will have access to the internal values. - friend class reactive_descriptor_service; - - // The native descriptor representation. - int descriptor_; - - // The current state of the descriptor. - descriptor_ops::state_type state_; - - // Per-descriptor data used by the reactor. - reactor::per_descriptor_data reactor_data_; - }; - - // Constructor. - ASIO_DECL reactive_descriptor_service( - asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Construct a new descriptor implementation. - ASIO_DECL void construct(implementation_type& impl); - - // Move-construct a new descriptor implementation. - ASIO_DECL void move_construct(implementation_type& impl, - implementation_type& other_impl); - - // Move-assign from another descriptor implementation. - ASIO_DECL void move_assign(implementation_type& impl, - reactive_descriptor_service& other_service, - implementation_type& other_impl); - - // Destroy a descriptor implementation. - ASIO_DECL void destroy(implementation_type& impl); - - // Assign a native descriptor to a descriptor implementation. - ASIO_DECL asio::error_code assign(implementation_type& impl, - const native_handle_type& native_descriptor, - asio::error_code& ec); - - // Determine whether the descriptor is open. - bool is_open(const implementation_type& impl) const - { - return impl.descriptor_ != -1; - } - - // Destroy a descriptor implementation. - ASIO_DECL asio::error_code close(implementation_type& impl, - asio::error_code& ec); - - // Get the native descriptor representation. - native_handle_type native_handle(const implementation_type& impl) const - { - return impl.descriptor_; - } - - // Release ownership of the native descriptor representation. - ASIO_DECL native_handle_type release(implementation_type& impl); - - // Cancel all operations associated with the descriptor. - ASIO_DECL asio::error_code cancel(implementation_type& impl, - asio::error_code& ec); - - // Perform an IO control command on the descriptor. - template - asio::error_code io_control(implementation_type& impl, - IO_Control_Command& command, asio::error_code& ec) - { - descriptor_ops::ioctl(impl.descriptor_, impl.state_, - command.name(), static_cast(command.data()), ec); - return ec; - } - - // Gets the non-blocking mode of the descriptor. - bool non_blocking(const implementation_type& impl) const - { - return (impl.state_ & descriptor_ops::user_set_non_blocking) != 0; - } - - // Sets the non-blocking mode of the descriptor. - asio::error_code non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - descriptor_ops::set_user_non_blocking( - impl.descriptor_, impl.state_, mode, ec); - return ec; - } - - // Gets the non-blocking mode of the native descriptor implementation. - bool native_non_blocking(const implementation_type& impl) const - { - return (impl.state_ & descriptor_ops::internal_non_blocking) != 0; - } - - // Sets the non-blocking mode of the native descriptor implementation. - asio::error_code native_non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - descriptor_ops::set_internal_non_blocking( - impl.descriptor_, impl.state_, mode, ec); - return ec; - } - - // Wait for the descriptor to become ready to read, ready to write, or to have - // pending error conditions. - asio::error_code wait(implementation_type& impl, - posix::descriptor_base::wait_type w, asio::error_code& ec) - { - switch (w) - { - case posix::descriptor_base::wait_read: - descriptor_ops::poll_read(impl.descriptor_, impl.state_, ec); - break; - case posix::descriptor_base::wait_write: - descriptor_ops::poll_write(impl.descriptor_, impl.state_, ec); - break; - case posix::descriptor_base::wait_error: - descriptor_ops::poll_error(impl.descriptor_, impl.state_, ec); - break; - default: - ec = asio::error::invalid_argument; - break; - } - - return ec; - } - - // Asynchronously wait for the descriptor to become ready to read, ready to - // write, or to have pending error conditions. - template - void async_wait(implementation_type& impl, - posix::descriptor_base::wait_type w, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_wait_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", - &impl, impl.descriptor_, "async_wait")); - - int op_type; - switch (w) - { - case posix::descriptor_base::wait_read: - op_type = reactor::read_op; - break; - case posix::descriptor_base::wait_write: - op_type = reactor::write_op; - break; - case posix::descriptor_base::wait_error: - op_type = reactor::except_op; - break; - default: - p.p->ec_ = asio::error::invalid_argument; - reactor_.post_immediate_completion(p.p, is_continuation); - p.v = p.p = 0; - return; - } - - start_op(impl, op_type, p.p, is_continuation, false, false); - p.v = p.p = 0; - } - - // Write some data to the descriptor. - template - size_t write_some(implementation_type& impl, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return descriptor_ops::sync_write(impl.descriptor_, impl.state_, - bufs.buffers(), bufs.count(), bufs.all_empty(), ec); - } - - // Wait until data can be written without blocking. - size_t write_some(implementation_type& impl, - const null_buffers&, asio::error_code& ec) - { - // Wait for descriptor to become ready. - descriptor_ops::poll_write(impl.descriptor_, impl.state_, ec); - - return 0; - } - - // Start an asynchronous write. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_write_some(implementation_type& impl, - const ConstBufferSequence& buffers, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef descriptor_write_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.descriptor_, buffers, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", - &impl, impl.descriptor_, "async_write_some")); - - start_op(impl, reactor::write_op, p.p, is_continuation, true, - buffer_sequence_adapter::all_empty(buffers)); - p.v = p.p = 0; - } - - // Start an asynchronous wait until data can be written without blocking. - template - void async_write_some(implementation_type& impl, - const null_buffers&, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", - &impl, impl.descriptor_, "async_write_some(null_buffers)")); - - start_op(impl, reactor::write_op, p.p, is_continuation, false, false); - p.v = p.p = 0; - } - - // Read some data from the stream. Returns the number of bytes read. - template - size_t read_some(implementation_type& impl, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return descriptor_ops::sync_read(impl.descriptor_, impl.state_, - bufs.buffers(), bufs.count(), bufs.all_empty(), ec); - } - - // Wait until data can be read without blocking. - size_t read_some(implementation_type& impl, - const null_buffers&, asio::error_code& ec) - { - // Wait for descriptor to become ready. - descriptor_ops::poll_read(impl.descriptor_, impl.state_, ec); - - return 0; - } - - // Start an asynchronous read. The buffer for the data being read must be - // valid for the lifetime of the asynchronous operation. - template - void async_read_some(implementation_type& impl, - const MutableBufferSequence& buffers, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef descriptor_read_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.descriptor_, buffers, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", - &impl, impl.descriptor_, "async_read_some")); - - start_op(impl, reactor::read_op, p.p, is_continuation, true, - buffer_sequence_adapter::all_empty(buffers)); - p.v = p.p = 0; - } - - // Wait until data can be read without blocking. - template - void async_read_some(implementation_type& impl, - const null_buffers&, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "descriptor", - &impl, impl.descriptor_, "async_read_some(null_buffers)")); - - start_op(impl, reactor::read_op, p.p, is_continuation, false, false); - p.v = p.p = 0; - } - -private: - // Start the asynchronous operation. - ASIO_DECL void start_op(implementation_type& impl, int op_type, - reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop); - - // The selector that performs event demultiplexing for the service. - reactor& reactor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/reactive_descriptor_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - -#endif // ASIO_DETAIL_REACTIVE_DESCRIPTOR_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_null_buffers_op.hpp b/scout_sdk/asio/asio/detail/reactive_null_buffers_op.hpp deleted file mode 100644 index 7408269..0000000 --- a/scout_sdk/asio/asio/detail/reactive_null_buffers_op.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// detail/reactive_null_buffers_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_NULL_BUFFERS_OP_HPP -#define ASIO_DETAIL_REACTIVE_NULL_BUFFERS_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_null_buffers_op : public reactor_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_null_buffers_op); - - reactive_null_buffers_op(Handler& handler) - : reactor_op(&reactive_null_buffers_op::do_perform, - &reactive_null_buffers_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static status do_perform(reactor_op*) - { - return done; - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_null_buffers_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_NULL_BUFFERS_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_serial_port_service.hpp b/scout_sdk/asio/asio/detail/reactive_serial_port_service.hpp deleted file mode 100644 index 6fddd9f..0000000 --- a/scout_sdk/asio/asio/detail/reactive_serial_port_service.hpp +++ /dev/null @@ -1,236 +0,0 @@ -// -// detail/reactive_serial_port_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SERIAL_PORT_SERVICE_HPP -#define ASIO_DETAIL_REACTIVE_SERIAL_PORT_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_SERIAL_PORT) -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/serial_port_base.hpp" -#include "asio/detail/descriptor_ops.hpp" -#include "asio/detail/reactive_descriptor_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Extend reactive_descriptor_service to provide serial port support. -class reactive_serial_port_service : - public service_base -{ -public: - // The native type of a serial port. - typedef reactive_descriptor_service::native_handle_type native_handle_type; - - // The implementation type of the serial port. - typedef reactive_descriptor_service::implementation_type implementation_type; - - ASIO_DECL reactive_serial_port_service( - asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Construct a new serial port implementation. - void construct(implementation_type& impl) - { - descriptor_service_.construct(impl); - } - - // Move-construct a new serial port implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - descriptor_service_.move_construct(impl, other_impl); - } - - // Move-assign from another serial port implementation. - void move_assign(implementation_type& impl, - reactive_serial_port_service& other_service, - implementation_type& other_impl) - { - descriptor_service_.move_assign(impl, - other_service.descriptor_service_, other_impl); - } - - // Destroy a serial port implementation. - void destroy(implementation_type& impl) - { - descriptor_service_.destroy(impl); - } - - // Open the serial port using the specified device name. - ASIO_DECL asio::error_code open(implementation_type& impl, - const std::string& device, asio::error_code& ec); - - // Assign a native descriptor to a serial port implementation. - asio::error_code assign(implementation_type& impl, - const native_handle_type& native_descriptor, - asio::error_code& ec) - { - return descriptor_service_.assign(impl, native_descriptor, ec); - } - - // Determine whether the serial port is open. - bool is_open(const implementation_type& impl) const - { - return descriptor_service_.is_open(impl); - } - - // Destroy a serial port implementation. - asio::error_code close(implementation_type& impl, - asio::error_code& ec) - { - return descriptor_service_.close(impl, ec); - } - - // Get the native serial port representation. - native_handle_type native_handle(implementation_type& impl) - { - return descriptor_service_.native_handle(impl); - } - - // Cancel all operations associated with the serial port. - asio::error_code cancel(implementation_type& impl, - asio::error_code& ec) - { - return descriptor_service_.cancel(impl, ec); - } - - // Set an option on the serial port. - template - asio::error_code set_option(implementation_type& impl, - const SettableSerialPortOption& option, asio::error_code& ec) - { - return do_set_option(impl, - &reactive_serial_port_service::store_option, - &option, ec); - } - - // Get an option from the serial port. - template - asio::error_code get_option(const implementation_type& impl, - GettableSerialPortOption& option, asio::error_code& ec) const - { - return do_get_option(impl, - &reactive_serial_port_service::load_option, - &option, ec); - } - - // Send a break sequence to the serial port. - asio::error_code send_break(implementation_type& impl, - asio::error_code& ec) - { - errno = 0; - descriptor_ops::error_wrapper(::tcsendbreak( - descriptor_service_.native_handle(impl), 0), ec); - return ec; - } - - // Write the given data. Returns the number of bytes sent. - template - size_t write_some(implementation_type& impl, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return descriptor_service_.write_some(impl, buffers, ec); - } - - // Start an asynchronous write. The data being written must be valid for the - // lifetime of the asynchronous operation. - template - void async_write_some(implementation_type& impl, - const ConstBufferSequence& buffers, Handler& handler) - { - descriptor_service_.async_write_some(impl, buffers, handler); - } - - // Read some data. Returns the number of bytes received. - template - size_t read_some(implementation_type& impl, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return descriptor_service_.read_some(impl, buffers, ec); - } - - // Start an asynchronous read. The buffer for the data being received must be - // valid for the lifetime of the asynchronous operation. - template - void async_read_some(implementation_type& impl, - const MutableBufferSequence& buffers, Handler& handler) - { - descriptor_service_.async_read_some(impl, buffers, handler); - } - -private: - // Function pointer type for storing a serial port option. - typedef asio::error_code (*store_function_type)( - const void*, termios&, asio::error_code&); - - // Helper function template to store a serial port option. - template - static asio::error_code store_option(const void* option, - termios& storage, asio::error_code& ec) - { - static_cast(option)->store(storage, ec); - return ec; - } - - // Helper function to set a serial port option. - ASIO_DECL asio::error_code do_set_option( - implementation_type& impl, store_function_type store, - const void* option, asio::error_code& ec); - - // Function pointer type for loading a serial port option. - typedef asio::error_code (*load_function_type)( - void*, const termios&, asio::error_code&); - - // Helper function template to load a serial port option. - template - static asio::error_code load_option(void* option, - const termios& storage, asio::error_code& ec) - { - static_cast(option)->load(storage, ec); - return ec; - } - - // Helper function to get a serial port option. - ASIO_DECL asio::error_code do_get_option( - const implementation_type& impl, load_function_type load, - void* option, asio::error_code& ec) const; - - // The implementation used for initiating asynchronous operations. - reactive_descriptor_service descriptor_service_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/reactive_serial_port_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) -#endif // defined(ASIO_HAS_SERIAL_PORT) - -#endif // ASIO_DETAIL_REACTIVE_SERIAL_PORT_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_accept_op.hpp b/scout_sdk/asio/asio/detail/reactive_socket_accept_op.hpp deleted file mode 100644 index 4a98f04..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_accept_op.hpp +++ /dev/null @@ -1,217 +0,0 @@ -// -// detail/reactive_socket_accept_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_ACCEPT_OP_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_ACCEPT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_accept_op_base : public reactor_op -{ -public: - reactive_socket_accept_op_base(socket_type socket, - socket_ops::state_type state, Socket& peer, const Protocol& protocol, - typename Protocol::endpoint* peer_endpoint, func_type complete_func) - : reactor_op(&reactive_socket_accept_op_base::do_perform, complete_func), - socket_(socket), - state_(state), - peer_(peer), - protocol_(protocol), - peer_endpoint_(peer_endpoint), - addrlen_(peer_endpoint ? peer_endpoint->capacity() : 0) - { - } - - static status do_perform(reactor_op* base) - { - reactive_socket_accept_op_base* o( - static_cast(base)); - - socket_type new_socket = invalid_socket; - status result = socket_ops::non_blocking_accept(o->socket_, - o->state_, o->peer_endpoint_ ? o->peer_endpoint_->data() : 0, - o->peer_endpoint_ ? &o->addrlen_ : 0, o->ec_, new_socket) - ? done : not_done; - o->new_socket_.reset(new_socket); - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_accept", o->ec_)); - - return result; - } - - void do_assign() - { - if (new_socket_.get() != invalid_socket) - { - if (peer_endpoint_) - peer_endpoint_->resize(addrlen_); - peer_.assign(protocol_, new_socket_.get(), ec_); - if (!ec_) - new_socket_.release(); - } - } - -private: - socket_type socket_; - socket_ops::state_type state_; - socket_holder new_socket_; - Socket& peer_; - Protocol protocol_; - typename Protocol::endpoint* peer_endpoint_; - std::size_t addrlen_; -}; - -template -class reactive_socket_accept_op : - public reactive_socket_accept_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_accept_op); - - reactive_socket_accept_op(socket_type socket, - socket_ops::state_type state, Socket& peer, const Protocol& protocol, - typename Protocol::endpoint* peer_endpoint, Handler& handler) - : reactive_socket_accept_op_base(socket, state, peer, - protocol, peer_endpoint, &reactive_socket_accept_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_accept_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - // On success, assign new connection to peer socket object. - if (owner) - o->do_assign(); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(o->handler_, o->ec_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -#if defined(ASIO_HAS_MOVE) - -template -class reactive_socket_move_accept_op : - private Protocol::socket, - public reactive_socket_accept_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_move_accept_op); - - reactive_socket_move_accept_op(io_context& ioc, socket_type socket, - socket_ops::state_type state, const Protocol& protocol, - typename Protocol::endpoint* peer_endpoint, Handler& handler) - : Protocol::socket(ioc), - reactive_socket_accept_op_base( - socket, state, *this, protocol, peer_endpoint, - &reactive_socket_move_accept_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_move_accept_op* o( - static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - // On success, assign new connection to peer socket object. - if (owner) - o->do_assign(); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::move_binder2 - handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), o->ec_, - ASIO_MOVE_CAST(typename Protocol::socket)(*o)); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -#endif // defined(ASIO_HAS_MOVE) - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_ACCEPT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_connect_op.hpp b/scout_sdk/asio/asio/detail/reactive_socket_connect_op.hpp deleted file mode 100644 index 76164b2..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_connect_op.hpp +++ /dev/null @@ -1,113 +0,0 @@ -// -// detail/reactive_socket_connect_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_CONNECT_OP_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_CONNECT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class reactive_socket_connect_op_base : public reactor_op -{ -public: - reactive_socket_connect_op_base(socket_type socket, func_type complete_func) - : reactor_op(&reactive_socket_connect_op_base::do_perform, complete_func), - socket_(socket) - { - } - - static status do_perform(reactor_op* base) - { - reactive_socket_connect_op_base* o( - static_cast(base)); - - status result = socket_ops::non_blocking_connect( - o->socket_, o->ec_) ? done : not_done; - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_connect", o->ec_)); - - return result; - } - -private: - socket_type socket_; -}; - -template -class reactive_socket_connect_op : public reactive_socket_connect_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_connect_op); - - reactive_socket_connect_op(socket_type socket, Handler& handler) - : reactive_socket_connect_op_base(socket, - &reactive_socket_connect_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_connect_op* o - (static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(o->handler_, o->ec_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_CONNECT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_recv_op.hpp b/scout_sdk/asio/asio/detail/reactive_socket_recv_op.hpp deleted file mode 100644 index 04bd266..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_recv_op.hpp +++ /dev/null @@ -1,135 +0,0 @@ -// -// detail/reactive_socket_recv_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_RECV_OP_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_RECV_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_recv_op_base : public reactor_op -{ -public: - reactive_socket_recv_op_base(socket_type socket, - socket_ops::state_type state, const MutableBufferSequence& buffers, - socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_recv_op_base::do_perform, complete_func), - socket_(socket), - state_(state), - buffers_(buffers), - flags_(flags) - { - } - - static status do_perform(reactor_op* base) - { - reactive_socket_recv_op_base* o( - static_cast(base)); - - buffer_sequence_adapter bufs(o->buffers_); - - status result = socket_ops::non_blocking_recv(o->socket_, - bufs.buffers(), bufs.count(), o->flags_, - (o->state_ & socket_ops::stream_oriented) != 0, - o->ec_, o->bytes_transferred_) ? done : not_done; - - if (result == done) - if ((o->state_ & socket_ops::stream_oriented) != 0) - if (o->bytes_transferred_ == 0) - result = done_and_exhausted; - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_recv", - o->ec_, o->bytes_transferred_)); - - return result; - } - -private: - socket_type socket_; - socket_ops::state_type state_; - MutableBufferSequence buffers_; - socket_base::message_flags flags_; -}; - -template -class reactive_socket_recv_op : - public reactive_socket_recv_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_recv_op); - - reactive_socket_recv_op(socket_type socket, - socket_ops::state_type state, const MutableBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - : reactive_socket_recv_op_base(socket, state, - buffers, flags, &reactive_socket_recv_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_recv_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_RECV_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_recvfrom_op.hpp b/scout_sdk/asio/asio/detail/reactive_socket_recvfrom_op.hpp deleted file mode 100644 index 3d4fa4c..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_recvfrom_op.hpp +++ /dev/null @@ -1,138 +0,0 @@ -// -// detail/reactive_socket_recvfrom_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_RECVFROM_OP_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_RECVFROM_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_recvfrom_op_base : public reactor_op -{ -public: - reactive_socket_recvfrom_op_base(socket_type socket, int protocol_type, - const MutableBufferSequence& buffers, Endpoint& endpoint, - socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_recvfrom_op_base::do_perform, complete_func), - socket_(socket), - protocol_type_(protocol_type), - buffers_(buffers), - sender_endpoint_(endpoint), - flags_(flags) - { - } - - static status do_perform(reactor_op* base) - { - reactive_socket_recvfrom_op_base* o( - static_cast(base)); - - buffer_sequence_adapter bufs(o->buffers_); - - std::size_t addr_len = o->sender_endpoint_.capacity(); - status result = socket_ops::non_blocking_recvfrom(o->socket_, - bufs.buffers(), bufs.count(), o->flags_, - o->sender_endpoint_.data(), &addr_len, - o->ec_, o->bytes_transferred_) ? done : not_done; - - if (result && !o->ec_) - o->sender_endpoint_.resize(addr_len); - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_recvfrom", - o->ec_, o->bytes_transferred_)); - - return result; - } - -private: - socket_type socket_; - int protocol_type_; - MutableBufferSequence buffers_; - Endpoint& sender_endpoint_; - socket_base::message_flags flags_; -}; - -template -class reactive_socket_recvfrom_op : - public reactive_socket_recvfrom_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvfrom_op); - - reactive_socket_recvfrom_op(socket_type socket, int protocol_type, - const MutableBufferSequence& buffers, Endpoint& endpoint, - socket_base::message_flags flags, Handler& handler) - : reactive_socket_recvfrom_op_base( - socket, protocol_type, buffers, endpoint, flags, - &reactive_socket_recvfrom_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_recvfrom_op* o( - static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_RECVFROM_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_recvmsg_op.hpp b/scout_sdk/asio/asio/detail/reactive_socket_recvmsg_op.hpp deleted file mode 100644 index f473274..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_recvmsg_op.hpp +++ /dev/null @@ -1,132 +0,0 @@ -// -// detail/reactive_socket_recvmsg_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_RECVMSG_OP_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_RECVMSG_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/socket_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_recvmsg_op_base : public reactor_op -{ -public: - reactive_socket_recvmsg_op_base(socket_type socket, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, func_type complete_func) - : reactor_op(&reactive_socket_recvmsg_op_base::do_perform, complete_func), - socket_(socket), - buffers_(buffers), - in_flags_(in_flags), - out_flags_(out_flags) - { - } - - static status do_perform(reactor_op* base) - { - reactive_socket_recvmsg_op_base* o( - static_cast(base)); - - buffer_sequence_adapter bufs(o->buffers_); - - status result = socket_ops::non_blocking_recvmsg(o->socket_, - bufs.buffers(), bufs.count(), - o->in_flags_, o->out_flags_, - o->ec_, o->bytes_transferred_) ? done : not_done; - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_recvmsg", - o->ec_, o->bytes_transferred_)); - - return result; - } - -private: - socket_type socket_; - MutableBufferSequence buffers_; - socket_base::message_flags in_flags_; - socket_base::message_flags& out_flags_; -}; - -template -class reactive_socket_recvmsg_op : - public reactive_socket_recvmsg_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_recvmsg_op); - - reactive_socket_recvmsg_op(socket_type socket, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, Handler& handler) - : reactive_socket_recvmsg_op_base(socket, buffers, - in_flags, out_flags, &reactive_socket_recvmsg_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_recvmsg_op* o( - static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_RECVMSG_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_send_op.hpp b/scout_sdk/asio/asio/detail/reactive_socket_send_op.hpp deleted file mode 100644 index bd550d9..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_send_op.hpp +++ /dev/null @@ -1,134 +0,0 @@ -// -// detail/reactive_socket_send_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_SEND_OP_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_SEND_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_send_op_base : public reactor_op -{ -public: - reactive_socket_send_op_base(socket_type socket, - socket_ops::state_type state, const ConstBufferSequence& buffers, - socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_send_op_base::do_perform, complete_func), - socket_(socket), - state_(state), - buffers_(buffers), - flags_(flags) - { - } - - static status do_perform(reactor_op* base) - { - reactive_socket_send_op_base* o( - static_cast(base)); - - buffer_sequence_adapter bufs(o->buffers_); - - status result = socket_ops::non_blocking_send(o->socket_, - bufs.buffers(), bufs.count(), o->flags_, - o->ec_, o->bytes_transferred_) ? done : not_done; - - if (result == done) - if ((o->state_ & socket_ops::stream_oriented) != 0) - if (o->bytes_transferred_ < bufs.total_size()) - result = done_and_exhausted; - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_send", - o->ec_, o->bytes_transferred_)); - - return result; - } - -private: - socket_type socket_; - socket_ops::state_type state_; - ConstBufferSequence buffers_; - socket_base::message_flags flags_; -}; - -template -class reactive_socket_send_op : - public reactive_socket_send_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_send_op); - - reactive_socket_send_op(socket_type socket, - socket_ops::state_type state, const ConstBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - : reactive_socket_send_op_base(socket, - state, buffers, flags, &reactive_socket_send_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_send_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_SEND_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_sendto_op.hpp b/scout_sdk/asio/asio/detail/reactive_socket_sendto_op.hpp deleted file mode 100644 index c97554d..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_sendto_op.hpp +++ /dev/null @@ -1,130 +0,0 @@ -// -// detail/reactive_socket_sendto_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_SENDTO_OP_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_SENDTO_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_sendto_op_base : public reactor_op -{ -public: - reactive_socket_sendto_op_base(socket_type socket, - const ConstBufferSequence& buffers, const Endpoint& endpoint, - socket_base::message_flags flags, func_type complete_func) - : reactor_op(&reactive_socket_sendto_op_base::do_perform, complete_func), - socket_(socket), - buffers_(buffers), - destination_(endpoint), - flags_(flags) - { - } - - static status do_perform(reactor_op* base) - { - reactive_socket_sendto_op_base* o( - static_cast(base)); - - buffer_sequence_adapter bufs(o->buffers_); - - status result = socket_ops::non_blocking_sendto(o->socket_, - bufs.buffers(), bufs.count(), o->flags_, - o->destination_.data(), o->destination_.size(), - o->ec_, o->bytes_transferred_) ? done : not_done; - - ASIO_HANDLER_REACTOR_OPERATION((*o, "non_blocking_sendto", - o->ec_, o->bytes_transferred_)); - - return result; - } - -private: - socket_type socket_; - ConstBufferSequence buffers_; - Endpoint destination_; - socket_base::message_flags flags_; -}; - -template -class reactive_socket_sendto_op : - public reactive_socket_sendto_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_socket_sendto_op); - - reactive_socket_sendto_op(socket_type socket, - const ConstBufferSequence& buffers, const Endpoint& endpoint, - socket_base::message_flags flags, Handler& handler) - : reactive_socket_sendto_op_base(socket, - buffers, endpoint, flags, &reactive_socket_sendto_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_socket_sendto_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->bytes_transferred_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_SENDTO_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_service.hpp b/scout_sdk/asio/asio/detail/reactive_socket_service.hpp deleted file mode 100644 index 15a4fdb..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_service.hpp +++ /dev/null @@ -1,526 +0,0 @@ -// -// detail/reactive_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_IOCP) - -#include "asio/buffer.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/reactive_null_buffers_op.hpp" -#include "asio/detail/reactive_socket_accept_op.hpp" -#include "asio/detail/reactive_socket_connect_op.hpp" -#include "asio/detail/reactive_socket_recvfrom_op.hpp" -#include "asio/detail/reactive_socket_sendto_op.hpp" -#include "asio/detail/reactive_socket_service_base.hpp" -#include "asio/detail/reactor.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_service : - public service_base >, - public reactive_socket_service_base -{ -public: - // The protocol type. - typedef Protocol protocol_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The native type of a socket. - typedef socket_type native_handle_type; - - // The implementation type of the socket. - struct implementation_type : - reactive_socket_service_base::base_implementation_type - { - // Default constructor. - implementation_type() - : protocol_(endpoint_type().protocol()) - { - } - - // The protocol associated with the socket. - protocol_type protocol_; - }; - - // Constructor. - reactive_socket_service(asio::io_context& io_context) - : service_base >(io_context), - reactive_socket_service_base(io_context) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - this->base_shutdown(); - } - - // Move-construct a new socket implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - this->base_move_construct(impl, other_impl); - - impl.protocol_ = other_impl.protocol_; - other_impl.protocol_ = endpoint_type().protocol(); - } - - // Move-assign from another socket implementation. - void move_assign(implementation_type& impl, - reactive_socket_service_base& other_service, - implementation_type& other_impl) - { - this->base_move_assign(impl, other_service, other_impl); - - impl.protocol_ = other_impl.protocol_; - other_impl.protocol_ = endpoint_type().protocol(); - } - - // Move-construct a new socket implementation from another protocol type. - template - void converting_move_construct(implementation_type& impl, - reactive_socket_service&, - typename reactive_socket_service< - Protocol1>::implementation_type& other_impl) - { - this->base_move_construct(impl, other_impl); - - impl.protocol_ = protocol_type(other_impl.protocol_); - other_impl.protocol_ = typename Protocol1::endpoint().protocol(); - } - - // Open a new socket implementation. - asio::error_code open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - if (!do_open(impl, protocol.family(), - protocol.type(), protocol.protocol(), ec)) - impl.protocol_ = protocol; - return ec; - } - - // Assign a native socket to a socket implementation. - asio::error_code assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_socket, - asio::error_code& ec) - { - if (!do_assign(impl, protocol.type(), native_socket, ec)) - impl.protocol_ = protocol; - return ec; - } - - // Get the native socket representation. - native_handle_type native_handle(implementation_type& impl) - { - return impl.socket_; - } - - // Bind the socket to the specified local endpoint. - asio::error_code bind(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - socket_ops::bind(impl.socket_, endpoint.data(), endpoint.size(), ec); - return ec; - } - - // Set a socket option. - template - asio::error_code set_option(implementation_type& impl, - const Option& option, asio::error_code& ec) - { - socket_ops::setsockopt(impl.socket_, impl.state_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), option.size(impl.protocol_), ec); - return ec; - } - - // Set a socket option. - template - asio::error_code get_option(const implementation_type& impl, - Option& option, asio::error_code& ec) const - { - std::size_t size = option.size(impl.protocol_); - socket_ops::getsockopt(impl.socket_, impl.state_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), &size, ec); - if (!ec) - option.resize(impl.protocol_, size); - return ec; - } - - // Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - endpoint_type endpoint; - std::size_t addr_len = endpoint.capacity(); - if (socket_ops::getsockname(impl.socket_, endpoint.data(), &addr_len, ec)) - return endpoint_type(); - endpoint.resize(addr_len); - return endpoint; - } - - // Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - endpoint_type endpoint; - std::size_t addr_len = endpoint.capacity(); - if (socket_ops::getpeername(impl.socket_, - endpoint.data(), &addr_len, false, ec)) - return endpoint_type(); - endpoint.resize(addr_len); - return endpoint; - } - - // Disable sends or receives on the socket. - asio::error_code shutdown(base_implementation_type& impl, - socket_base::shutdown_type what, asio::error_code& ec) - { - socket_ops::shutdown(impl.socket_, what, ec); - return ec; - } - - // Send a datagram to the specified endpoint. Returns the number of bytes - // sent. - template - size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_sendto(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), flags, - destination.data(), destination.size(), ec); - } - - // Wait until data can be sent without blocking. - size_t send_to(implementation_type& impl, const null_buffers&, - const endpoint_type&, socket_base::message_flags, - asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); - - return 0; - } - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send_to(implementation_type& impl, - const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_sendto_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, buffers, destination, flags, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_send_to")); - - start_op(impl, reactor::write_op, p.p, is_continuation, true, false); - p.v = p.p = 0; - } - - // Start an asynchronous wait until data can be sent without blocking. - template - void async_send_to(implementation_type& impl, const null_buffers&, - const endpoint_type&, socket_base::message_flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_send_to(null_buffers)")); - - start_op(impl, reactor::write_op, p.p, is_continuation, false, false); - p.v = p.p = 0; - } - - // Receive a datagram with the endpoint of the sender. Returns the number of - // bytes received. - template - size_t receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - std::size_t addr_len = sender_endpoint.capacity(); - std::size_t bytes_recvd = socket_ops::sync_recvfrom( - impl.socket_, impl.state_, bufs.buffers(), bufs.count(), - flags, sender_endpoint.data(), &addr_len, ec); - - if (!ec) - sender_endpoint.resize(addr_len); - - return bytes_recvd; - } - - // Wait until data can be received without blocking. - size_t receive_from(implementation_type& impl, const null_buffers&, - endpoint_type& sender_endpoint, socket_base::message_flags, - asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - - // Reset endpoint since it can be given no sensible value at this time. - sender_endpoint = endpoint_type(); - - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received and - // the sender_endpoint object must both be valid for the lifetime of the - // asynchronous operation. - template - void async_receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_recvfrom_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - int protocol = impl.protocol_.type(); - p.p = new (p.v) op(impl.socket_, protocol, - buffers, sender_endpoint, flags, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_receive_from")); - - start_op(impl, - (flags & socket_base::message_out_of_band) - ? reactor::except_op : reactor::read_op, - p.p, is_continuation, true, false); - p.v = p.p = 0; - } - - // Wait until data can be received without blocking. - template - void async_receive_from(implementation_type& impl, - const null_buffers&, endpoint_type& sender_endpoint, - socket_base::message_flags flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_receive_from(null_buffers)")); - - // Reset endpoint since it can be given no sensible value at this time. - sender_endpoint = endpoint_type(); - - start_op(impl, - (flags & socket_base::message_out_of_band) - ? reactor::except_op : reactor::read_op, - p.p, is_continuation, false, false); - p.v = p.p = 0; - } - - // Accept a new connection. - template - asio::error_code accept(implementation_type& impl, - Socket& peer, endpoint_type* peer_endpoint, asio::error_code& ec) - { - // We cannot accept a socket that is already open. - if (peer.is_open()) - { - ec = asio::error::already_open; - return ec; - } - - std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; - socket_holder new_socket(socket_ops::sync_accept(impl.socket_, - impl.state_, peer_endpoint ? peer_endpoint->data() : 0, - peer_endpoint ? &addr_len : 0, ec)); - - // On success, assign new connection to peer socket object. - if (new_socket.get() != invalid_socket) - { - if (peer_endpoint) - peer_endpoint->resize(addr_len); - peer.assign(impl.protocol_, new_socket.get(), ec); - if (!ec) - new_socket.release(); - } - - return ec; - } - -#if defined(ASIO_HAS_MOVE) - // Accept a new connection. - typename Protocol::socket accept(implementation_type& impl, - io_context* peer_io_context, endpoint_type* peer_endpoint, - asio::error_code& ec) - { - typename Protocol::socket peer( - peer_io_context ? *peer_io_context : io_context_); - - std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; - socket_holder new_socket(socket_ops::sync_accept(impl.socket_, - impl.state_, peer_endpoint ? peer_endpoint->data() : 0, - peer_endpoint ? &addr_len : 0, ec)); - - // On success, assign new connection to peer socket object. - if (new_socket.get() != invalid_socket) - { - if (peer_endpoint) - peer_endpoint->resize(addr_len); - peer.assign(impl.protocol_, new_socket.get(), ec); - if (!ec) - new_socket.release(); - } - - return peer; - } -#endif // defined(ASIO_HAS_MOVE) - - // Start an asynchronous accept. The peer and peer_endpoint objects must be - // valid until the accept's handler is invoked. - template - void async_accept(implementation_type& impl, Socket& peer, - endpoint_type* peer_endpoint, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_accept_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, impl.state_, peer, - impl.protocol_, peer_endpoint, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_accept")); - - start_accept_op(impl, p.p, is_continuation, peer.is_open()); - p.v = p.p = 0; - } - -#if defined(ASIO_HAS_MOVE) - // Start an asynchronous accept. The peer_endpoint object must be valid until - // the accept's handler is invoked. - template - void async_accept(implementation_type& impl, - asio::io_context* peer_io_context, - endpoint_type* peer_endpoint, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_move_accept_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(peer_io_context ? *peer_io_context : io_context_, - impl.socket_, impl.state_, impl.protocol_, peer_endpoint, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_accept")); - - start_accept_op(impl, p.p, is_continuation, false); - p.v = p.p = 0; - } -#endif // defined(ASIO_HAS_MOVE) - - // Connect the socket to the specified endpoint. - asio::error_code connect(implementation_type& impl, - const endpoint_type& peer_endpoint, asio::error_code& ec) - { - socket_ops::sync_connect(impl.socket_, - peer_endpoint.data(), peer_endpoint.size(), ec); - return ec; - } - - // Start an asynchronous connect. - template - void async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_connect_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_connect")); - - start_connect_op(impl, p.p, is_continuation, - peer_endpoint.data(), peer_endpoint.size()); - p.v = p.p = 0; - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_socket_service_base.hpp b/scout_sdk/asio/asio/detail/reactive_socket_service_base.hpp deleted file mode 100644 index ccd497e..0000000 --- a/scout_sdk/asio/asio/detail/reactive_socket_service_base.hpp +++ /dev/null @@ -1,511 +0,0 @@ -// -// detail/reactive_socket_service_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_BASE_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_IOCP) \ - && !defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/buffer.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactive_null_buffers_op.hpp" -#include "asio/detail/reactive_socket_recv_op.hpp" -#include "asio/detail/reactive_socket_recvmsg_op.hpp" -#include "asio/detail/reactive_socket_send_op.hpp" -#include "asio/detail/reactive_wait_op.hpp" -#include "asio/detail/reactor.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class reactive_socket_service_base -{ -public: - // The native type of a socket. - typedef socket_type native_handle_type; - - // The implementation type of the socket. - struct base_implementation_type - { - // The native socket representation. - socket_type socket_; - - // The current state of the socket. - socket_ops::state_type state_; - - // Per-descriptor data used by the reactor. - reactor::per_descriptor_data reactor_data_; - }; - - // Constructor. - ASIO_DECL reactive_socket_service_base( - asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void base_shutdown(); - - // Construct a new socket implementation. - ASIO_DECL void construct(base_implementation_type& impl); - - // Move-construct a new socket implementation. - ASIO_DECL void base_move_construct(base_implementation_type& impl, - base_implementation_type& other_impl); - - // Move-assign from another socket implementation. - ASIO_DECL void base_move_assign(base_implementation_type& impl, - reactive_socket_service_base& other_service, - base_implementation_type& other_impl); - - // Destroy a socket implementation. - ASIO_DECL void destroy(base_implementation_type& impl); - - // Determine whether the socket is open. - bool is_open(const base_implementation_type& impl) const - { - return impl.socket_ != invalid_socket; - } - - // Destroy a socket implementation. - ASIO_DECL asio::error_code close( - base_implementation_type& impl, asio::error_code& ec); - - // Release ownership of the socket. - ASIO_DECL socket_type release( - base_implementation_type& impl, asio::error_code& ec); - - // Get the native socket representation. - native_handle_type native_handle(base_implementation_type& impl) - { - return impl.socket_; - } - - // Cancel all operations associated with the socket. - ASIO_DECL asio::error_code cancel( - base_implementation_type& impl, asio::error_code& ec); - - // Determine whether the socket is at the out-of-band data mark. - bool at_mark(const base_implementation_type& impl, - asio::error_code& ec) const - { - return socket_ops::sockatmark(impl.socket_, ec); - } - - // Determine the number of bytes available for reading. - std::size_t available(const base_implementation_type& impl, - asio::error_code& ec) const - { - return socket_ops::available(impl.socket_, ec); - } - - // Place the socket into the state where it will listen for new connections. - asio::error_code listen(base_implementation_type& impl, - int backlog, asio::error_code& ec) - { - socket_ops::listen(impl.socket_, backlog, ec); - return ec; - } - - // Perform an IO control command on the socket. - template - asio::error_code io_control(base_implementation_type& impl, - IO_Control_Command& command, asio::error_code& ec) - { - socket_ops::ioctl(impl.socket_, impl.state_, command.name(), - static_cast(command.data()), ec); - return ec; - } - - // Gets the non-blocking mode of the socket. - bool non_blocking(const base_implementation_type& impl) const - { - return (impl.state_ & socket_ops::user_set_non_blocking) != 0; - } - - // Sets the non-blocking mode of the socket. - asio::error_code non_blocking(base_implementation_type& impl, - bool mode, asio::error_code& ec) - { - socket_ops::set_user_non_blocking(impl.socket_, impl.state_, mode, ec); - return ec; - } - - // Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const base_implementation_type& impl) const - { - return (impl.state_ & socket_ops::internal_non_blocking) != 0; - } - - // Sets the non-blocking mode of the native socket implementation. - asio::error_code native_non_blocking(base_implementation_type& impl, - bool mode, asio::error_code& ec) - { - socket_ops::set_internal_non_blocking(impl.socket_, impl.state_, mode, ec); - return ec; - } - - // Wait for the socket to become ready to read, ready to write, or to have - // pending error conditions. - asio::error_code wait(base_implementation_type& impl, - socket_base::wait_type w, asio::error_code& ec) - { - switch (w) - { - case socket_base::wait_read: - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - break; - case socket_base::wait_write: - socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); - break; - case socket_base::wait_error: - socket_ops::poll_error(impl.socket_, impl.state_, -1, ec); - break; - default: - ec = asio::error::invalid_argument; - break; - } - - return ec; - } - - // Asynchronously wait for the socket to become ready to read, ready to - // write, or to have pending error conditions. - template - void async_wait(base_implementation_type& impl, - socket_base::wait_type w, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_wait_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_wait")); - - int op_type; - switch (w) - { - case socket_base::wait_read: - op_type = reactor::read_op; - break; - case socket_base::wait_write: - op_type = reactor::write_op; - break; - case socket_base::wait_error: - op_type = reactor::except_op; - break; - default: - p.p->ec_ = asio::error::invalid_argument; - reactor_.post_immediate_completion(p.p, is_continuation); - p.v = p.p = 0; - return; - } - - start_op(impl, op_type, p.p, is_continuation, false, false); - p.v = p.p = 0; - } - - // Send the given data to the peer. - template - size_t send(base_implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_send(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); - } - - // Wait until data can be sent without blocking. - size_t send(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); - - return 0; - } - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send(base_implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_send_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, impl.state_, buffers, flags, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_send")); - - start_op(impl, reactor::write_op, p.p, is_continuation, true, - ((impl.state_ & socket_ops::stream_oriented) - && buffer_sequence_adapter::all_empty(buffers))); - p.v = p.p = 0; - } - - // Start an asynchronous wait until data can be sent without blocking. - template - void async_send(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_send(null_buffers)")); - - start_op(impl, reactor::write_op, p.p, is_continuation, false, false); - p.v = p.p = 0; - } - - // Receive some data from the peer. Returns the number of bytes received. - template - size_t receive(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_recv(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); - } - - // Wait until data can be received without blocking. - size_t receive(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_recv_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, impl.state_, buffers, flags, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_receive")); - - start_op(impl, - (flags & socket_base::message_out_of_band) - ? reactor::except_op : reactor::read_op, - p.p, is_continuation, - (flags & socket_base::message_out_of_band) == 0, - ((impl.state_ & socket_ops::stream_oriented) - && buffer_sequence_adapter::all_empty(buffers))); - p.v = p.p = 0; - } - - // Wait until data can be received without blocking. - template - void async_receive(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_receive(null_buffers)")); - - start_op(impl, - (flags & socket_base::message_out_of_band) - ? reactor::except_op : reactor::read_op, - p.p, is_continuation, false, false); - p.v = p.p = 0; - } - - // Receive some data with associated flags. Returns the number of bytes - // received. - template - size_t receive_with_flags(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_recvmsg(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), in_flags, out_flags, ec); - } - - // Wait until data can be received without blocking. - size_t receive_with_flags(base_implementation_type& impl, - const null_buffers&, socket_base::message_flags, - socket_base::message_flags& out_flags, asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - - // Clear out_flags, since we cannot give it any other sensible value when - // performing a null_buffers operation. - out_flags = 0; - - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive_with_flags(base_implementation_type& impl, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_socket_recvmsg_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, buffers, in_flags, out_flags, handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_receive_with_flags")); - - start_op(impl, - (in_flags & socket_base::message_out_of_band) - ? reactor::except_op : reactor::read_op, - p.p, is_continuation, - (in_flags & socket_base::message_out_of_band) == 0, false); - p.v = p.p = 0; - } - - // Wait until data can be received without blocking. - template - void async_receive_with_flags(base_implementation_type& impl, - const null_buffers&, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef reactive_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((reactor_.context(), *p.p, "socket", - &impl, impl.socket_, "async_receive_with_flags(null_buffers)")); - - // Clear out_flags, since we cannot give it any other sensible value when - // performing a null_buffers operation. - out_flags = 0; - - start_op(impl, - (in_flags & socket_base::message_out_of_band) - ? reactor::except_op : reactor::read_op, - p.p, is_continuation, false, false); - p.v = p.p = 0; - } - -protected: - // Open a new socket implementation. - ASIO_DECL asio::error_code do_open( - base_implementation_type& impl, int af, - int type, int protocol, asio::error_code& ec); - - // Assign a native socket to a socket implementation. - ASIO_DECL asio::error_code do_assign( - base_implementation_type& impl, int type, - const native_handle_type& native_socket, asio::error_code& ec); - - // Start the asynchronous read or write operation. - ASIO_DECL void start_op(base_implementation_type& impl, int op_type, - reactor_op* op, bool is_continuation, bool is_non_blocking, bool noop); - - // Start the asynchronous accept operation. - ASIO_DECL void start_accept_op(base_implementation_type& impl, - reactor_op* op, bool is_continuation, bool peer_is_open); - - // Start the asynchronous connect operation. - ASIO_DECL void start_connect_op(base_implementation_type& impl, - reactor_op* op, bool is_continuation, - const socket_addr_type* addr, size_t addrlen); - - // The io_context that owns this socket service. - io_context& io_context_; - - // The selector that performs event demultiplexing for the service. - reactor& reactor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/reactive_socket_service_base.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // !defined(ASIO_HAS_IOCP) - // && !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_BASE_HPP diff --git a/scout_sdk/asio/asio/detail/reactive_wait_op.hpp b/scout_sdk/asio/asio/detail/reactive_wait_op.hpp deleted file mode 100644 index 616d8b1..0000000 --- a/scout_sdk/asio/asio/detail/reactive_wait_op.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// detail/reactive_wait_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_WAIT_OP_HPP -#define ASIO_DETAIL_REACTIVE_WAIT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactive_wait_op : public reactor_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(reactive_wait_op); - - reactive_wait_op(Handler& handler) - : reactor_op(&reactive_wait_op::do_perform, - &reactive_wait_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static status do_perform(reactor_op*) - { - return done; - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - reactive_wait_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(o->handler_, o->ec_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_WAIT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactor.hpp b/scout_sdk/asio/asio/detail/reactor.hpp deleted file mode 100644 index 4750276..0000000 --- a/scout_sdk/asio/asio/detail/reactor.hpp +++ /dev/null @@ -1,32 +0,0 @@ -// -// detail/reactor.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTOR_HPP -#define ASIO_DETAIL_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/reactor_fwd.hpp" - -#if defined(ASIO_HAS_EPOLL) -# include "asio/detail/epoll_reactor.hpp" -#elif defined(ASIO_HAS_KQUEUE) -# include "asio/detail/kqueue_reactor.hpp" -#elif defined(ASIO_HAS_DEV_POLL) -# include "asio/detail/dev_poll_reactor.hpp" -#elif defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/null_reactor.hpp" -#else -# include "asio/detail/select_reactor.hpp" -#endif - -#endif // ASIO_DETAIL_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/reactor_fwd.hpp b/scout_sdk/asio/asio/detail/reactor_fwd.hpp deleted file mode 100644 index a4555c3..0000000 --- a/scout_sdk/asio/asio/detail/reactor_fwd.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// -// detail/reactor_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTOR_FWD_HPP -#define ASIO_DETAIL_REACTOR_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_IOCP) || defined(ASIO_WINDOWS_RUNTIME) -typedef class null_reactor reactor; -#elif defined(ASIO_HAS_IOCP) -typedef class select_reactor reactor; -#elif defined(ASIO_HAS_EPOLL) -typedef class epoll_reactor reactor; -#elif defined(ASIO_HAS_KQUEUE) -typedef class kqueue_reactor reactor; -#elif defined(ASIO_HAS_DEV_POLL) -typedef class dev_poll_reactor reactor; -#else -typedef class select_reactor reactor; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_REACTOR_FWD_HPP diff --git a/scout_sdk/asio/asio/detail/reactor_op.hpp b/scout_sdk/asio/asio/detail/reactor_op.hpp deleted file mode 100644 index faad1a7..0000000 --- a/scout_sdk/asio/asio/detail/reactor_op.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// -// detail/reactor_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTOR_OP_HPP -#define ASIO_DETAIL_REACTOR_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class reactor_op - : public operation -{ -public: - // The error code to be passed to the completion handler. - asio::error_code ec_; - - // The number of bytes transferred, to be passed to the completion handler. - std::size_t bytes_transferred_; - - // Status returned by perform function. May be used to decide whether it is - // worth performing more operations on the descriptor immediately. - enum status { not_done, done, done_and_exhausted }; - - // Perform the operation. Returns true if it is finished. - status perform() - { - return perform_func_(this); - } - -protected: - typedef status (*perform_func_type)(reactor_op*); - - reactor_op(perform_func_type perform_func, func_type complete_func) - : operation(complete_func), - bytes_transferred_(0), - perform_func_(perform_func) - { - } - -private: - perform_func_type perform_func_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTOR_OP_HPP diff --git a/scout_sdk/asio/asio/detail/reactor_op_queue.hpp b/scout_sdk/asio/asio/detail/reactor_op_queue.hpp deleted file mode 100644 index 898f31d..0000000 --- a/scout_sdk/asio/asio/detail/reactor_op_queue.hpp +++ /dev/null @@ -1,168 +0,0 @@ -// -// detail/reactor_op_queue.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTOR_OP_QUEUE_HPP -#define ASIO_DETAIL_REACTOR_OP_QUEUE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/hash_map.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class reactor_op_queue - : private noncopyable -{ -public: - typedef Descriptor key_type; - - struct mapped_type : op_queue - { - mapped_type() {} - mapped_type(const mapped_type&) {} - void operator=(const mapped_type&) {} - }; - - typedef typename hash_map::value_type value_type; - typedef typename hash_map::iterator iterator; - - // Constructor. - reactor_op_queue() - : operations_() - { - } - - // Obtain iterators to all registered descriptors. - iterator begin() { return operations_.begin(); } - iterator end() { return operations_.end(); } - - // Add a new operation to the queue. Returns true if this is the only - // operation for the given descriptor, in which case the reactor's event - // demultiplexing function call may need to be interrupted and restarted. - bool enqueue_operation(Descriptor descriptor, reactor_op* op) - { - std::pair entry = - operations_.insert(value_type(descriptor, mapped_type())); - entry.first->second.push(op); - return entry.second; - } - - // Cancel all operations associated with the descriptor identified by the - // supplied iterator. Any operations pending for the descriptor will be - // cancelled. Returns true if any operations were cancelled, in which case - // the reactor's event demultiplexing function may need to be interrupted and - // restarted. - bool cancel_operations(iterator i, op_queue& ops, - const asio::error_code& ec = - asio::error::operation_aborted) - { - if (i != operations_.end()) - { - while (reactor_op* op = i->second.front()) - { - op->ec_ = ec; - i->second.pop(); - ops.push(op); - } - operations_.erase(i); - return true; - } - - return false; - } - - // Cancel all operations associated with the descriptor. Any operations - // pending for the descriptor will be cancelled. Returns true if any - // operations were cancelled, in which case the reactor's event - // demultiplexing function may need to be interrupted and restarted. - bool cancel_operations(Descriptor descriptor, op_queue& ops, - const asio::error_code& ec = - asio::error::operation_aborted) - { - return this->cancel_operations(operations_.find(descriptor), ops, ec); - } - - // Whether there are no operations in the queue. - bool empty() const - { - return operations_.empty(); - } - - // Determine whether there are any operations associated with the descriptor. - bool has_operation(Descriptor descriptor) const - { - return operations_.find(descriptor) != operations_.end(); - } - - // Perform the operations corresponding to the descriptor identified by the - // supplied iterator. Returns true if there are still unfinished operations - // queued for the descriptor. - bool perform_operations(iterator i, op_queue& ops) - { - if (i != operations_.end()) - { - while (reactor_op* op = i->second.front()) - { - if (op->perform()) - { - i->second.pop(); - ops.push(op); - } - else - { - return true; - } - } - operations_.erase(i); - } - return false; - } - - // Perform the operations corresponding to the descriptor. Returns true if - // there are still unfinished operations queued for the descriptor. - bool perform_operations(Descriptor descriptor, op_queue& ops) - { - return this->perform_operations(operations_.find(descriptor), ops); - } - - // Get all operations owned by the queue. - void get_all_operations(op_queue& ops) - { - iterator i = operations_.begin(); - while (i != operations_.end()) - { - iterator op_iter = i++; - ops.push(op_iter->second); - operations_.erase(op_iter); - } - } - -private: - // The operations that are currently executing asynchronously. - hash_map operations_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTOR_OP_QUEUE_HPP diff --git a/scout_sdk/asio/asio/detail/recycling_allocator.hpp b/scout_sdk/asio/asio/detail/recycling_allocator.hpp deleted file mode 100644 index 964af1d..0000000 --- a/scout_sdk/asio/asio/detail/recycling_allocator.hpp +++ /dev/null @@ -1,104 +0,0 @@ -// -// detail/recycling_allocator.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_RECYCLING_ALLOCATOR_HPP -#define ASIO_DETAIL_RECYCLING_ALLOCATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/thread_context.hpp" -#include "asio/detail/thread_info_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class recycling_allocator -{ -public: - typedef T value_type; - - template - struct rebind - { - typedef recycling_allocator other; - }; - - recycling_allocator() - { - } - - template - recycling_allocator(const recycling_allocator&) - { - } - - T* allocate(std::size_t n) - { - typedef thread_context::thread_call_stack call_stack; - void* p = thread_info_base::allocate(call_stack::top(), sizeof(T) * n); - return static_cast(p); - } - - void deallocate(T* p, std::size_t n) - { - typedef thread_context::thread_call_stack call_stack; - thread_info_base::deallocate(call_stack::top(), p, sizeof(T) * n); - } -}; - -template <> -class recycling_allocator -{ -public: - typedef void value_type; - - template - struct rebind - { - typedef recycling_allocator other; - }; - - recycling_allocator() - { - } - - template - recycling_allocator(const recycling_allocator&) - { - } -}; - -template -struct get_recycling_allocator -{ - typedef Allocator type; - static type get(const Allocator& a) { return a; } -}; - -template -struct get_recycling_allocator > -{ - typedef recycling_allocator type; - static type get(const std::allocator&) { return type(); } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_RECYCLING_ALLOCATOR_HPP diff --git a/scout_sdk/asio/asio/detail/regex_fwd.hpp b/scout_sdk/asio/asio/detail/regex_fwd.hpp deleted file mode 100644 index dcf7d06..0000000 --- a/scout_sdk/asio/asio/detail/regex_fwd.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// detail/regex_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REGEX_FWD_HPP -#define ASIO_DETAIL_REGEX_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if defined(ASIO_HAS_BOOST_REGEX) - -#include -#include - -namespace boost { - -template -struct sub_match; - -template -class match_results; - -} // namespace boost - -#endif // defined(ASIO_HAS_BOOST_REGEX) - -#endif // ASIO_DETAIL_REGEX_FWD_HPP diff --git a/scout_sdk/asio/asio/detail/resolve_endpoint_op.hpp b/scout_sdk/asio/asio/detail/resolve_endpoint_op.hpp deleted file mode 100644 index 8eee2f9..0000000 --- a/scout_sdk/asio/asio/detail/resolve_endpoint_op.hpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// detail/resolve_endpoint_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_RESOLVER_ENDPOINT_OP_HPP -#define ASIO_DETAIL_RESOLVER_ENDPOINT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/basic_resolver_results.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/resolve_op.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class resolve_endpoint_op : public resolve_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(resolve_endpoint_op); - - typedef typename Protocol::endpoint endpoint_type; - typedef asio::ip::basic_resolver_results results_type; - - resolve_endpoint_op(socket_ops::weak_cancel_token_type cancel_token, - const endpoint_type& endpoint, io_context_impl& ioc, Handler& handler) - : resolve_op(&resolve_endpoint_op::do_complete), - cancel_token_(cancel_token), - endpoint_(endpoint), - io_context_impl_(ioc), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the operation object. - resolve_endpoint_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - if (owner && owner != &o->io_context_impl_) - { - // The operation is being run on the worker io_context. Time to perform - // the resolver operation. - - // Perform the blocking endpoint resolution operation. - char host_name[NI_MAXHOST]; - char service_name[NI_MAXSERV]; - socket_ops::background_getnameinfo(o->cancel_token_, o->endpoint_.data(), - o->endpoint_.size(), host_name, NI_MAXHOST, service_name, NI_MAXSERV, - o->endpoint_.protocol().type(), o->ec_); - o->results_ = results_type::create(o->endpoint_, host_name, service_name); - - // Pass operation back to main io_context for completion. - o->io_context_impl_.post_deferred_completion(o); - p.v = p.p = 0; - } - else - { - // The operation has been returned to the main io_context. The completion - // handler is ready to be delivered. - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated - // before the upcall is made. Even if we're not about to make an upcall, - // a sub-object of the handler may be the true owner of the memory - // associated with the handler. Consequently, a local copy of the handler - // is required to ensure that any owning sub-object remains valid until - // after we have deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->results_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - } - -private: - socket_ops::weak_cancel_token_type cancel_token_; - endpoint_type endpoint_; - io_context_impl& io_context_impl_; - Handler handler_; - results_type results_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_RESOLVER_ENDPOINT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/resolve_op.hpp b/scout_sdk/asio/asio/detail/resolve_op.hpp deleted file mode 100644 index a528aa8..0000000 --- a/scout_sdk/asio/asio/detail/resolve_op.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// detail/resolve_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_RESOLVE_OP_HPP -#define ASIO_DETAIL_RESOLVE_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/error.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class resolve_op : public operation -{ -public: - // The error code to be passed to the completion handler. - asio::error_code ec_; - -protected: - resolve_op(func_type complete_func) - : operation(complete_func) - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_RESOLVE_OP_HPP diff --git a/scout_sdk/asio/asio/detail/resolve_query_op.hpp b/scout_sdk/asio/asio/detail/resolve_query_op.hpp deleted file mode 100644 index 0ec5a32..0000000 --- a/scout_sdk/asio/asio/detail/resolve_query_op.hpp +++ /dev/null @@ -1,134 +0,0 @@ -// -// detail/resolve_query_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_RESOLVE_QUERY_OP_HPP -#define ASIO_DETAIL_RESOLVE_QUERY_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/basic_resolver_results.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/resolve_op.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class resolve_query_op : public resolve_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(resolve_query_op); - - typedef asio::ip::basic_resolver_query query_type; - typedef asio::ip::basic_resolver_results results_type; - - resolve_query_op(socket_ops::weak_cancel_token_type cancel_token, - const query_type& query, io_context_impl& ioc, Handler& handler) - : resolve_op(&resolve_query_op::do_complete), - cancel_token_(cancel_token), - query_(query), - io_context_impl_(ioc), - handler_(ASIO_MOVE_CAST(Handler)(handler)), - addrinfo_(0) - { - handler_work::start(handler_); - } - - ~resolve_query_op() - { - if (addrinfo_) - socket_ops::freeaddrinfo(addrinfo_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the operation object. - resolve_query_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - - if (owner && owner != &o->io_context_impl_) - { - // The operation is being run on the worker io_context. Time to perform - // the resolver operation. - - // Perform the blocking host resolution operation. - socket_ops::background_getaddrinfo(o->cancel_token_, - o->query_.host_name().c_str(), o->query_.service_name().c_str(), - o->query_.hints(), &o->addrinfo_, o->ec_); - - // Pass operation back to main io_context for completion. - o->io_context_impl_.post_deferred_completion(o); - p.v = p.p = 0; - } - else - { - // The operation has been returned to the main io_context. The completion - // handler is ready to be delivered. - - // Take ownership of the operation's outstanding work. - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated - // before the upcall is made. Even if we're not about to make an upcall, - // a sub-object of the handler may be the true owner of the memory - // associated with the handler. Consequently, a local copy of the handler - // is required to ensure that any owning sub-object remains valid until - // after we have deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, results_type()); - p.h = asio::detail::addressof(handler.handler_); - if (o->addrinfo_) - { - handler.arg2_ = results_type::create(o->addrinfo_, - o->query_.host_name(), o->query_.service_name()); - } - p.reset(); - - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - } - -private: - socket_ops::weak_cancel_token_type cancel_token_; - query_type query_; - io_context_impl& io_context_impl_; - Handler handler_; - asio::detail::addrinfo_type* addrinfo_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_RESOLVE_QUERY_OP_HPP diff --git a/scout_sdk/asio/asio/detail/resolver_service.hpp b/scout_sdk/asio/asio/detail/resolver_service.hpp deleted file mode 100644 index 11a94d1..0000000 --- a/scout_sdk/asio/asio/detail/resolver_service.hpp +++ /dev/null @@ -1,145 +0,0 @@ -// -// detail/resolver_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_RESOLVER_SERVICE_HPP -#define ASIO_DETAIL_RESOLVER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/basic_resolver_results.hpp" -#include "asio/detail/concurrency_hint.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/resolve_endpoint_op.hpp" -#include "asio/detail/resolve_query_op.hpp" -#include "asio/detail/resolver_service_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class resolver_service : - public service_base >, - public resolver_service_base -{ -public: - // The implementation type of the resolver. A cancellation token is used to - // indicate to the background thread that the operation has been cancelled. - typedef socket_ops::shared_cancel_token_type implementation_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The query type. - typedef asio::ip::basic_resolver_query query_type; - - // The results type. - typedef asio::ip::basic_resolver_results results_type; - - // Constructor. - resolver_service(asio::io_context& io_context) - : service_base >(io_context), - resolver_service_base(io_context) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - this->base_shutdown(); - } - - // Perform any fork-related housekeeping. - void notify_fork(asio::io_context::fork_event fork_ev) - { - this->base_notify_fork(fork_ev); - } - - // Resolve a query to a list of entries. - results_type resolve(implementation_type&, const query_type& query, - asio::error_code& ec) - { - asio::detail::addrinfo_type* address_info = 0; - - socket_ops::getaddrinfo(query.host_name().c_str(), - query.service_name().c_str(), query.hints(), &address_info, ec); - auto_addrinfo auto_address_info(address_info); - - return ec ? results_type() : results_type::create( - address_info, query.host_name(), query.service_name()); - } - - // Asynchronously resolve a query to a list of entries. - template - void async_resolve(implementation_type& impl, - const query_type& query, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef resolve_query_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl, query, io_context_impl_, handler); - - ASIO_HANDLER_CREATION((io_context_impl_.context(), - *p.p, "resolver", &impl, 0, "async_resolve")); - - start_resolve_op(p.p); - p.v = p.p = 0; - } - - // Resolve an endpoint to a list of entries. - results_type resolve(implementation_type&, - const endpoint_type& endpoint, asio::error_code& ec) - { - char host_name[NI_MAXHOST]; - char service_name[NI_MAXSERV]; - socket_ops::sync_getnameinfo(endpoint.data(), endpoint.size(), - host_name, NI_MAXHOST, service_name, NI_MAXSERV, - endpoint.protocol().type(), ec); - - return ec ? results_type() : results_type::create( - endpoint, host_name, service_name); - } - - // Asynchronously resolve an endpoint to a list of entries. - template - void async_resolve(implementation_type& impl, - const endpoint_type& endpoint, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef resolve_endpoint_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl, endpoint, io_context_impl_, handler); - - ASIO_HANDLER_CREATION((io_context_impl_.context(), - *p.p, "resolver", &impl, 0, "async_resolve")); - - start_resolve_op(p.p); - p.v = p.p = 0; - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_RESOLVER_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/resolver_service_base.hpp b/scout_sdk/asio/asio/detail/resolver_service_base.hpp deleted file mode 100644 index 10a7922..0000000 --- a/scout_sdk/asio/asio/detail/resolver_service_base.hpp +++ /dev/null @@ -1,140 +0,0 @@ -// -// detail/resolver_service_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP -#define ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/error.hpp" -#include "asio/executor_work_guard.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/resolve_op.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/detail/thread.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class resolver_service_base -{ -public: - // The implementation type of the resolver. A cancellation token is used to - // indicate to the background thread that the operation has been cancelled. - typedef socket_ops::shared_cancel_token_type implementation_type; - - // Constructor. - ASIO_DECL resolver_service_base(asio::io_context& io_context); - - // Destructor. - ASIO_DECL ~resolver_service_base(); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void base_shutdown(); - - // Perform any fork-related housekeeping. - ASIO_DECL void base_notify_fork( - asio::io_context::fork_event fork_ev); - - // Construct a new resolver implementation. - ASIO_DECL void construct(implementation_type& impl); - - // Destroy a resolver implementation. - ASIO_DECL void destroy(implementation_type&); - - // Move-construct a new resolver implementation. - ASIO_DECL void move_construct(implementation_type& impl, - implementation_type& other_impl); - - // Move-assign from another resolver implementation. - ASIO_DECL void move_assign(implementation_type& impl, - resolver_service_base& other_service, - implementation_type& other_impl); - - // Cancel pending asynchronous operations. - ASIO_DECL void cancel(implementation_type& impl); - -protected: - // Helper function to start an asynchronous resolve operation. - ASIO_DECL void start_resolve_op(resolve_op* op); - -#if !defined(ASIO_WINDOWS_RUNTIME) - // Helper class to perform exception-safe cleanup of addrinfo objects. - class auto_addrinfo - : private asio::detail::noncopyable - { - public: - explicit auto_addrinfo(asio::detail::addrinfo_type* ai) - : ai_(ai) - { - } - - ~auto_addrinfo() - { - if (ai_) - socket_ops::freeaddrinfo(ai_); - } - - operator asio::detail::addrinfo_type*() - { - return ai_; - } - - private: - asio::detail::addrinfo_type* ai_; - }; -#endif // !defined(ASIO_WINDOWS_RUNTIME) - - // Helper class to run the work io_context in a thread. - class work_io_context_runner; - - // Start the work thread if it's not already running. - ASIO_DECL void start_work_thread(); - - // The io_context implementation used to post completions. - io_context_impl& io_context_impl_; - -private: - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // Private io_context used for performing asynchronous host resolution. - asio::detail::scoped_ptr work_io_context_; - - // The work io_context implementation used to post completions. - io_context_impl& work_io_context_impl_; - - // Work for the private io_context to perform. - asio::executor_work_guard< - asio::io_context::executor_type> work_; - - // Thread used for running the work io_context's run loop. - asio::detail::scoped_ptr work_thread_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/resolver_service_base.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_RESOLVER_SERVICE_BASE_HPP diff --git a/scout_sdk/asio/asio/detail/scheduler.hpp b/scout_sdk/asio/asio/detail/scheduler.hpp deleted file mode 100644 index 10c29b7..0000000 --- a/scout_sdk/asio/asio/detail/scheduler.hpp +++ /dev/null @@ -1,213 +0,0 @@ -// -// detail/scheduler.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SCHEDULER_HPP -#define ASIO_DETAIL_SCHEDULER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/error_code.hpp" -#include "asio/execution_context.hpp" -#include "asio/detail/atomic_count.hpp" -#include "asio/detail/conditionally_enabled_event.hpp" -#include "asio/detail/conditionally_enabled_mutex.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/reactor_fwd.hpp" -#include "asio/detail/scheduler_operation.hpp" -#include "asio/detail/thread_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct scheduler_thread_info; - -class scheduler - : public execution_context_service_base, - public thread_context -{ -public: - typedef scheduler_operation operation; - - // Constructor. Specifies the number of concurrent threads that are likely to - // run the scheduler. If set to 1 certain optimisation are performed. - ASIO_DECL scheduler(asio::execution_context& ctx, - int concurrency_hint = 0); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Initialise the task, if required. - ASIO_DECL void init_task(); - - // Run the event loop until interrupted or no more work. - ASIO_DECL std::size_t run(asio::error_code& ec); - - // Run until interrupted or one operation is performed. - ASIO_DECL std::size_t run_one(asio::error_code& ec); - - // Run until timeout, interrupted, or one operation is performed. - ASIO_DECL std::size_t wait_one( - long usec, asio::error_code& ec); - - // Poll for operations without blocking. - ASIO_DECL std::size_t poll(asio::error_code& ec); - - // Poll for one operation without blocking. - ASIO_DECL std::size_t poll_one(asio::error_code& ec); - - // Interrupt the event processing loop. - ASIO_DECL void stop(); - - // Determine whether the scheduler is stopped. - ASIO_DECL bool stopped() const; - - // Restart in preparation for a subsequent run invocation. - ASIO_DECL void restart(); - - // Notify that some work has started. - void work_started() - { - ++outstanding_work_; - } - - // Used to compensate for a forthcoming work_finished call. Must be called - // from within a scheduler-owned thread. - ASIO_DECL void compensating_work_started(); - - // Notify that some work has finished. - void work_finished() - { - if (--outstanding_work_ == 0) - stop(); - } - - // Return whether a handler can be dispatched immediately. - bool can_dispatch() - { - return thread_call_stack::contains(this) != 0; - } - - // Request invocation of the given operation and return immediately. Assumes - // that work_started() has not yet been called for the operation. - ASIO_DECL void post_immediate_completion( - operation* op, bool is_continuation); - - // Request invocation of the given operation and return immediately. Assumes - // that work_started() was previously called for the operation. - ASIO_DECL void post_deferred_completion(operation* op); - - // Request invocation of the given operations and return immediately. Assumes - // that work_started() was previously called for each operation. - ASIO_DECL void post_deferred_completions(op_queue& ops); - - // Enqueue the given operation following a failed attempt to dispatch the - // operation for immediate invocation. - ASIO_DECL void do_dispatch(operation* op); - - // Process unfinished operations as part of a shutdownoperation. Assumes that - // work_started() was previously called for the operations. - ASIO_DECL void abandon_operations(op_queue& ops); - - // Get the concurrency hint that was used to initialise the scheduler. - int concurrency_hint() const - { - return concurrency_hint_; - } - -private: - // The mutex type used by this scheduler. - typedef conditionally_enabled_mutex mutex; - - // The event type used by this scheduler. - typedef conditionally_enabled_event event; - - // Structure containing thread-specific data. - typedef scheduler_thread_info thread_info; - - // Run at most one operation. May block. - ASIO_DECL std::size_t do_run_one(mutex::scoped_lock& lock, - thread_info& this_thread, const asio::error_code& ec); - - // Run at most one operation with a timeout. May block. - ASIO_DECL std::size_t do_wait_one(mutex::scoped_lock& lock, - thread_info& this_thread, long usec, const asio::error_code& ec); - - // Poll for at most one operation. - ASIO_DECL std::size_t do_poll_one(mutex::scoped_lock& lock, - thread_info& this_thread, const asio::error_code& ec); - - // Stop the task and all idle threads. - ASIO_DECL void stop_all_threads(mutex::scoped_lock& lock); - - // Wake a single idle thread, or the task, and always unlock the mutex. - ASIO_DECL void wake_one_thread_and_unlock( - mutex::scoped_lock& lock); - - // Helper class to perform task-related operations on block exit. - struct task_cleanup; - friend struct task_cleanup; - - // Helper class to call work-related operations on block exit. - struct work_cleanup; - friend struct work_cleanup; - - // Whether to optimise for single-threaded use cases. - const bool one_thread_; - - // Mutex to protect access to internal data. - mutable mutex mutex_; - - // Event to wake up blocked threads. - event wakeup_event_; - - // The task to be run by this service. - reactor* task_; - - // Operation object to represent the position of the task in the queue. - struct task_operation : operation - { - task_operation() : operation(0) {} - } task_operation_; - - // Whether the task has been interrupted. - bool task_interrupted_; - - // The count of unfinished work. - atomic_count outstanding_work_; - - // The queue of handlers that are ready to be delivered. - op_queue op_queue_; - - // Flag to indicate that the dispatcher has been stopped. - bool stopped_; - - // Flag to indicate that the dispatcher has been shut down. - bool shutdown_; - - // The concurrency hint used to initialise the scheduler. - const int concurrency_hint_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/scheduler.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_SCHEDULER_HPP diff --git a/scout_sdk/asio/asio/detail/scheduler_operation.hpp b/scout_sdk/asio/asio/detail/scheduler_operation.hpp deleted file mode 100644 index 1c2ce02..0000000 --- a/scout_sdk/asio/asio/detail/scheduler_operation.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// detail/scheduler_operation.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SCHEDULER_OPERATION_HPP -#define ASIO_DETAIL_SCHEDULER_OPERATION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/error_code.hpp" -#include "asio/detail/handler_tracking.hpp" -#include "asio/detail/op_queue.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class scheduler; - -// Base class for all operations. A function pointer is used instead of virtual -// functions to avoid the associated overhead. -class scheduler_operation ASIO_INHERIT_TRACKED_HANDLER -{ -public: - typedef scheduler_operation operation_type; - - void complete(void* owner, const asio::error_code& ec, - std::size_t bytes_transferred) - { - func_(owner, this, ec, bytes_transferred); - } - - void destroy() - { - func_(0, this, asio::error_code(), 0); - } - -protected: - typedef void (*func_type)(void*, - scheduler_operation*, - const asio::error_code&, std::size_t); - - scheduler_operation(func_type func) - : next_(0), - func_(func), - task_result_(0) - { - } - - // Prevents deletion through this type. - ~scheduler_operation() - { - } - -private: - friend class op_queue_access; - scheduler_operation* next_; - func_type func_; -protected: - friend class scheduler; - unsigned int task_result_; // Passed into bytes transferred. -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SCHEDULER_OPERATION_HPP diff --git a/scout_sdk/asio/asio/detail/scheduler_thread_info.hpp b/scout_sdk/asio/asio/detail/scheduler_thread_info.hpp deleted file mode 100644 index 2ffe013..0000000 --- a/scout_sdk/asio/asio/detail/scheduler_thread_info.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// -// detail/scheduler_thread_info.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SCHEDULER_THREAD_INFO_HPP -#define ASIO_DETAIL_SCHEDULER_THREAD_INFO_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/op_queue.hpp" -#include "asio/detail/thread_info_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class scheduler; -class scheduler_operation; - -struct scheduler_thread_info : public thread_info_base -{ - op_queue private_op_queue; - long private_outstanding_work; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SCHEDULER_THREAD_INFO_HPP diff --git a/scout_sdk/asio/asio/detail/scoped_lock.hpp b/scout_sdk/asio/asio/detail/scoped_lock.hpp deleted file mode 100644 index 6cbce38..0000000 --- a/scout_sdk/asio/asio/detail/scoped_lock.hpp +++ /dev/null @@ -1,101 +0,0 @@ -// -// detail/scoped_lock.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SCOPED_LOCK_HPP -#define ASIO_DETAIL_SCOPED_LOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Helper class to lock and unlock a mutex automatically. -template -class scoped_lock - : private noncopyable -{ -public: - // Tag type used to distinguish constructors. - enum adopt_lock_t { adopt_lock }; - - // Constructor adopts a lock that is already held. - scoped_lock(Mutex& m, adopt_lock_t) - : mutex_(m), - locked_(true) - { - } - - // Constructor acquires the lock. - explicit scoped_lock(Mutex& m) - : mutex_(m) - { - mutex_.lock(); - locked_ = true; - } - - // Destructor releases the lock. - ~scoped_lock() - { - if (locked_) - mutex_.unlock(); - } - - // Explicitly acquire the lock. - void lock() - { - if (!locked_) - { - mutex_.lock(); - locked_ = true; - } - } - - // Explicitly release the lock. - void unlock() - { - if (locked_) - { - mutex_.unlock(); - locked_ = false; - } - } - - // Test whether the lock is held. - bool locked() const - { - return locked_; - } - - // Get the underlying mutex. - Mutex& mutex() - { - return mutex_; - } - -private: - // The underlying mutex. - Mutex& mutex_; - - // Whether the mutex is currently locked or unlocked. - bool locked_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SCOPED_LOCK_HPP diff --git a/scout_sdk/asio/asio/detail/scoped_ptr.hpp b/scout_sdk/asio/asio/detail/scoped_ptr.hpp deleted file mode 100644 index 3449c53..0000000 --- a/scout_sdk/asio/asio/detail/scoped_ptr.hpp +++ /dev/null @@ -1,87 +0,0 @@ -// -// detail/scoped_ptr.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SCOPED_PTR_HPP -#define ASIO_DETAIL_SCOPED_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class scoped_ptr -{ -public: - // Constructor. - explicit scoped_ptr(T* p = 0) - : p_(p) - { - } - - // Destructor. - ~scoped_ptr() - { - delete p_; - } - - // Access. - T* get() - { - return p_; - } - - // Access. - T* operator->() - { - return p_; - } - - // Dereference. - T& operator*() - { - return *p_; - } - - // Reset pointer. - void reset(T* p = 0) - { - delete p_; - p_ = p; - } - - // Release ownership of the pointer. - T* release() - { - T* tmp = p_; - p_ = 0; - return tmp; - } - -private: - // Disallow copying and assignment. - scoped_ptr(const scoped_ptr&); - scoped_ptr& operator=(const scoped_ptr&); - - T* p_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SCOPED_PTR_HPP diff --git a/scout_sdk/asio/asio/detail/select_interrupter.hpp b/scout_sdk/asio/asio/detail/select_interrupter.hpp deleted file mode 100644 index 1a07599..0000000 --- a/scout_sdk/asio/asio/detail/select_interrupter.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// detail/select_interrupter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SELECT_INTERRUPTER_HPP -#define ASIO_DETAIL_SELECT_INTERRUPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS_RUNTIME) - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) || defined(__SYMBIAN32__) -# include "asio/detail/socket_select_interrupter.hpp" -#elif defined(ASIO_HAS_EVENTFD) -# include "asio/detail/eventfd_select_interrupter.hpp" -#else -# include "asio/detail/pipe_select_interrupter.hpp" -#endif - -namespace asio { -namespace detail { - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) || defined(__SYMBIAN32__) -typedef socket_select_interrupter select_interrupter; -#elif defined(ASIO_HAS_EVENTFD) -typedef eventfd_select_interrupter select_interrupter; -#else -typedef pipe_select_interrupter select_interrupter; -#endif - -} // namespace detail -} // namespace asio - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_SELECT_INTERRUPTER_HPP diff --git a/scout_sdk/asio/asio/detail/select_reactor.hpp b/scout_sdk/asio/asio/detail/select_reactor.hpp deleted file mode 100644 index 0996549..0000000 --- a/scout_sdk/asio/asio/detail/select_reactor.hpp +++ /dev/null @@ -1,238 +0,0 @@ -// -// detail/select_reactor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SELECT_REACTOR_HPP -#define ASIO_DETAIL_SELECT_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) \ - || (!defined(ASIO_HAS_DEV_POLL) \ - && !defined(ASIO_HAS_EPOLL) \ - && !defined(ASIO_HAS_KQUEUE) \ - && !defined(ASIO_WINDOWS_RUNTIME)) - -#include -#include "asio/detail/fd_set_adapter.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/reactor_op_queue.hpp" -#include "asio/detail/select_interrupter.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue_base.hpp" -#include "asio/detail/timer_queue_set.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/execution_context.hpp" - -#if defined(ASIO_HAS_IOCP) -# include "asio/detail/thread.hpp" -#endif // defined(ASIO_HAS_IOCP) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class select_reactor - : public execution_context_service_base -{ -public: -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - enum op_types { read_op = 0, write_op = 1, except_op = 2, - max_select_ops = 3, connect_op = 3, max_ops = 4 }; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - enum op_types { read_op = 0, write_op = 1, except_op = 2, - max_select_ops = 3, connect_op = 1, max_ops = 3 }; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - - // Per-descriptor data. - struct per_descriptor_data - { - }; - - // Constructor. - ASIO_DECL select_reactor(asio::execution_context& ctx); - - // Destructor. - ASIO_DECL ~select_reactor(); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Recreate internal descriptors following a fork. - ASIO_DECL void notify_fork( - asio::execution_context::fork_event fork_ev); - - // Initialise the task, but only if the reactor is not in its own thread. - ASIO_DECL void init_task(); - - // Register a socket with the reactor. Returns 0 on success, system error - // code on failure. - ASIO_DECL int register_descriptor(socket_type, per_descriptor_data&); - - // Register a descriptor with an associated single operation. Returns 0 on - // success, system error code on failure. - ASIO_DECL int register_internal_descriptor( - int op_type, socket_type descriptor, - per_descriptor_data& descriptor_data, reactor_op* op); - - // Post a reactor operation for immediate completion. - void post_immediate_completion(reactor_op* op, bool is_continuation) - { - scheduler_.post_immediate_completion(op, is_continuation); - } - - // Start a new operation. The reactor operation will be performed when the - // given descriptor is flagged as ready, or an error has occurred. - ASIO_DECL void start_op(int op_type, socket_type descriptor, - per_descriptor_data&, reactor_op* op, bool is_continuation, bool); - - // Cancel all operations associated with the given descriptor. The - // handlers associated with the descriptor will be invoked with the - // operation_aborted error. - ASIO_DECL void cancel_ops(socket_type descriptor, per_descriptor_data&); - - // Cancel any operations that are running against the descriptor and remove - // its registration from the reactor. The reactor resources associated with - // the descriptor must be released by calling cleanup_descriptor_data. - ASIO_DECL void deregister_descriptor(socket_type descriptor, - per_descriptor_data&, bool closing); - - // Remove the descriptor's registration from the reactor. The reactor - // resources associated with the descriptor must be released by calling - // cleanup_descriptor_data. - ASIO_DECL void deregister_internal_descriptor( - socket_type descriptor, per_descriptor_data&); - - // Perform any post-deregistration cleanup tasks associated with the - // descriptor data. - ASIO_DECL void cleanup_descriptor_data(per_descriptor_data&); - - // Move descriptor registration from one descriptor_data object to another. - ASIO_DECL void move_descriptor(socket_type descriptor, - per_descriptor_data& target_descriptor_data, - per_descriptor_data& source_descriptor_data); - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& queue); - - // Remove a timer queue from the reactor. - template - void remove_timer_queue(timer_queue& queue); - - // Schedule a new operation in the given timer queue to expire at the - // specified absolute time. - template - void schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op); - - // Cancel the timer operations associated with the given token. Returns the - // number of operations that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled = (std::numeric_limits::max)()); - - // Move the timer operations associated with the given timer. - template - void move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& target, - typename timer_queue::per_timer_data& source); - - // Run select once until interrupted or events are ready to be dispatched. - ASIO_DECL void run(long usec, op_queue& ops); - - // Interrupt the select loop. - ASIO_DECL void interrupt(); - -private: -#if defined(ASIO_HAS_IOCP) - // Run the select loop in the thread. - ASIO_DECL void run_thread(); -#endif // defined(ASIO_HAS_IOCP) - - // Helper function to add a new timer queue. - ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); - - // Helper function to remove a timer queue. - ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); - - // Get the timeout value for the select call. - ASIO_DECL timeval* get_timeout(long usec, timeval& tv); - - // Cancel all operations associated with the given descriptor. This function - // does not acquire the select_reactor's mutex. - ASIO_DECL void cancel_ops_unlocked(socket_type descriptor, - const asio::error_code& ec); - - // The scheduler implementation used to post completions. -# if defined(ASIO_HAS_IOCP) - typedef class win_iocp_io_context scheduler_type; -# else // defined(ASIO_HAS_IOCP) - typedef class scheduler scheduler_type; -# endif // defined(ASIO_HAS_IOCP) - scheduler_type& scheduler_; - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // The interrupter is used to break a blocking select call. - select_interrupter interrupter_; - - // The queues of read, write and except operations. - reactor_op_queue op_queue_[max_ops]; - - // The file descriptor sets to be passed to the select system call. - fd_set_adapter fd_sets_[max_select_ops]; - - // The timer queues. - timer_queue_set timer_queues_; - -#if defined(ASIO_HAS_IOCP) - // Helper class to run the reactor loop in a thread. - class thread_function; - friend class thread_function; - - // Does the reactor loop thread need to stop. - bool stop_thread_; - - // The thread that is running the reactor loop. - asio::detail::thread* thread_; -#endif // defined(ASIO_HAS_IOCP) - - // Whether the service has been shut down. - bool shutdown_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/select_reactor.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/select_reactor.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_IOCP) - // || (!defined(ASIO_HAS_DEV_POLL) - // && !defined(ASIO_HAS_EPOLL) - // && !defined(ASIO_HAS_KQUEUE) - // && !defined(ASIO_WINDOWS_RUNTIME)) - -#endif // ASIO_DETAIL_SELECT_REACTOR_HPP diff --git a/scout_sdk/asio/asio/detail/service_registry.hpp b/scout_sdk/asio/asio/detail/service_registry.hpp deleted file mode 100644 index cda6307..0000000 --- a/scout_sdk/asio/asio/detail/service_registry.hpp +++ /dev/null @@ -1,164 +0,0 @@ -// -// detail/service_registry.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SERVICE_REGISTRY_HPP -#define ASIO_DETAIL_SERVICE_REGISTRY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/mutex.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -class io_context; - -namespace detail { - -template -class typeid_wrapper {}; - -class service_registry - : private noncopyable -{ -public: - // Constructor. - ASIO_DECL service_registry(execution_context& owner); - - // Destructor. - ASIO_DECL ~service_registry(); - - // Shutdown all services. - ASIO_DECL void shutdown_services(); - - // Destroy all services. - ASIO_DECL void destroy_services(); - - // Notify all services of a fork event. - ASIO_DECL void notify_fork(execution_context::fork_event fork_ev); - - // Get the service object corresponding to the specified service type. Will - // create a new service object automatically if no such object already - // exists. Ownership of the service object is not transferred to the caller. - template - Service& use_service(); - - // Get the service object corresponding to the specified service type. Will - // create a new service object automatically if no such object already - // exists. Ownership of the service object is not transferred to the caller. - // This overload is used for backwards compatibility with services that - // inherit from io_context::service. - template - Service& use_service(io_context& owner); - - // Add a service object. Throws on error, in which case ownership of the - // object is retained by the caller. - template - void add_service(Service* new_service); - - // Check whether a service object of the specified type already exists. - template - bool has_service() const; - -private: - // Initalise a service's key when the key_type typedef is not available. - template - static void init_key(execution_context::service::key& key, ...); - -#if !defined(ASIO_NO_TYPEID) - // Initalise a service's key when the key_type typedef is available. - template - static void init_key(execution_context::service::key& key, - typename enable_if< - is_base_of::value>::type*); -#endif // !defined(ASIO_NO_TYPEID) - - // Initialise a service's key based on its id. - ASIO_DECL static void init_key_from_id( - execution_context::service::key& key, - const execution_context::id& id); - -#if !defined(ASIO_NO_TYPEID) - // Initialise a service's key based on its id. - template - static void init_key_from_id(execution_context::service::key& key, - const service_id& /*id*/); -#endif // !defined(ASIO_NO_TYPEID) - - // Check if a service matches the given id. - ASIO_DECL static bool keys_match( - const execution_context::service::key& key1, - const execution_context::service::key& key2); - - // The type of a factory function used for creating a service instance. - typedef execution_context::service*(*factory_type)(void*); - - // Factory function for creating a service instance. - template - static execution_context::service* create(void* owner); - - // Destroy a service instance. - ASIO_DECL static void destroy(execution_context::service* service); - - // Helper class to manage service pointers. - struct auto_service_ptr; - friend struct auto_service_ptr; - struct auto_service_ptr - { - execution_context::service* ptr_; - ~auto_service_ptr() { destroy(ptr_); } - }; - - // Get the service object corresponding to the specified service key. Will - // create a new service object automatically if no such object already - // exists. Ownership of the service object is not transferred to the caller. - ASIO_DECL execution_context::service* do_use_service( - const execution_context::service::key& key, - factory_type factory, void* owner); - - // Add a service object. Throws on error, in which case ownership of the - // object is retained by the caller. - ASIO_DECL void do_add_service( - const execution_context::service::key& key, - execution_context::service* new_service); - - // Check whether a service object with the specified key already exists. - ASIO_DECL bool do_has_service( - const execution_context::service::key& key) const; - - // Mutex to protect access to internal data. - mutable asio::detail::mutex mutex_; - - // The owner of this service registry and the services it contains. - execution_context& owner_; - - // The first service in the list of contained services. - execution_context::service* first_service_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/service_registry.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/service_registry.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_SERVICE_REGISTRY_HPP diff --git a/scout_sdk/asio/asio/detail/signal_blocker.hpp b/scout_sdk/asio/asio/detail/signal_blocker.hpp deleted file mode 100644 index b684295..0000000 --- a/scout_sdk/asio/asio/detail/signal_blocker.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// detail/signal_blocker.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SIGNAL_BLOCKER_HPP -#define ASIO_DETAIL_SIGNAL_BLOCKER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) || defined(ASIO_WINDOWS) \ - || defined(ASIO_WINDOWS_RUNTIME) \ - || defined(__CYGWIN__) || defined(__SYMBIAN32__) -# include "asio/detail/null_signal_blocker.hpp" -#elif defined(ASIO_HAS_PTHREADS) -# include "asio/detail/posix_signal_blocker.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(ASIO_HAS_THREADS) || defined(ASIO_WINDOWS) \ - || defined(ASIO_WINDOWS_RUNTIME) \ - || defined(__CYGWIN__) || defined(__SYMBIAN32__) -typedef null_signal_blocker signal_blocker; -#elif defined(ASIO_HAS_PTHREADS) -typedef posix_signal_blocker signal_blocker; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_SIGNAL_BLOCKER_HPP diff --git a/scout_sdk/asio/asio/detail/signal_handler.hpp b/scout_sdk/asio/asio/detail/signal_handler.hpp deleted file mode 100644 index d1c9910..0000000 --- a/scout_sdk/asio/asio/detail/signal_handler.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// -// detail/signal_handler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SIGNAL_HANDLER_HPP -#define ASIO_DETAIL_SIGNAL_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_work.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/signal_op.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class signal_handler : public signal_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(signal_handler); - - signal_handler(Handler& h) - : signal_op(&signal_handler::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(h)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - signal_handler* h(static_cast(base)); - ptr p = { asio::detail::addressof(h->handler_), h, h }; - handler_work w(h->handler_); - - ASIO_HANDLER_COMPLETION((*h)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(h->handler_, h->ec_, h->signal_number_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SIGNAL_HANDLER_HPP diff --git a/scout_sdk/asio/asio/detail/signal_init.hpp b/scout_sdk/asio/asio/detail/signal_init.hpp deleted file mode 100644 index 814ff51..0000000 --- a/scout_sdk/asio/asio/detail/signal_init.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// detail/signal_init.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SIGNAL_INIT_HPP -#define ASIO_DETAIL_SIGNAL_INIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class signal_init -{ -public: - // Constructor. - signal_init() - { - std::signal(Signal, SIG_IGN); - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#endif // ASIO_DETAIL_SIGNAL_INIT_HPP diff --git a/scout_sdk/asio/asio/detail/signal_op.hpp b/scout_sdk/asio/asio/detail/signal_op.hpp deleted file mode 100644 index c4e364c..0000000 --- a/scout_sdk/asio/asio/detail/signal_op.hpp +++ /dev/null @@ -1,49 +0,0 @@ -// -// detail/signal_op.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SIGNAL_OP_HPP -#define ASIO_DETAIL_SIGNAL_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class signal_op - : public operation -{ -public: - // The error code to be passed to the completion handler. - asio::error_code ec_; - - // The signal number to be passed to the completion handler. - int signal_number_; - -protected: - signal_op(func_type func) - : operation(func), - signal_number_(0) - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SIGNAL_OP_HPP diff --git a/scout_sdk/asio/asio/detail/signal_set_service.hpp b/scout_sdk/asio/asio/detail/signal_set_service.hpp deleted file mode 100644 index a18ab70..0000000 --- a/scout_sdk/asio/asio/detail/signal_set_service.hpp +++ /dev/null @@ -1,217 +0,0 @@ -// -// detail/signal_set_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SIGNAL_SET_SERVICE_HPP -#define ASIO_DETAIL_SIGNAL_SET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/signal_handler.hpp" -#include "asio/detail/signal_op.hpp" -#include "asio/detail/socket_types.hpp" - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) -# include "asio/detail/reactor.hpp" -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -#if defined(NSIG) && (NSIG > 0) -enum { max_signal_number = NSIG }; -#else -enum { max_signal_number = 128 }; -#endif - -extern ASIO_DECL struct signal_state* get_signal_state(); - -extern "C" ASIO_DECL void asio_signal_handler(int signal_number); - -class signal_set_service : - public service_base -{ -public: - // Type used for tracking an individual signal registration. - class registration - { - public: - // Default constructor. - registration() - : signal_number_(0), - queue_(0), - undelivered_(0), - next_in_table_(0), - prev_in_table_(0), - next_in_set_(0) - { - } - - private: - // Only this service will have access to the internal values. - friend class signal_set_service; - - // The signal number that is registered. - int signal_number_; - - // The waiting signal handlers. - op_queue* queue_; - - // The number of undelivered signals. - std::size_t undelivered_; - - // Pointers to adjacent registrations in the registrations_ table. - registration* next_in_table_; - registration* prev_in_table_; - - // Link to next registration in the signal set. - registration* next_in_set_; - }; - - // The implementation type of the signal_set. - class implementation_type - { - public: - // Default constructor. - implementation_type() - : signals_(0) - { - } - - private: - // Only this service will have access to the internal values. - friend class signal_set_service; - - // The pending signal handlers. - op_queue queue_; - - // Linked list of registered signals. - registration* signals_; - }; - - // Constructor. - ASIO_DECL signal_set_service(asio::io_context& io_context); - - // Destructor. - ASIO_DECL ~signal_set_service(); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Perform fork-related housekeeping. - ASIO_DECL void notify_fork( - asio::io_context::fork_event fork_ev); - - // Construct a new signal_set implementation. - ASIO_DECL void construct(implementation_type& impl); - - // Destroy a signal_set implementation. - ASIO_DECL void destroy(implementation_type& impl); - - // Add a signal to a signal_set. - ASIO_DECL asio::error_code add(implementation_type& impl, - int signal_number, asio::error_code& ec); - - // Remove a signal to a signal_set. - ASIO_DECL asio::error_code remove(implementation_type& impl, - int signal_number, asio::error_code& ec); - - // Remove all signals from a signal_set. - ASIO_DECL asio::error_code clear(implementation_type& impl, - asio::error_code& ec); - - // Cancel all operations associated with the signal set. - ASIO_DECL asio::error_code cancel(implementation_type& impl, - asio::error_code& ec); - - // Start an asynchronous operation to wait for a signal to be delivered. - template - void async_wait(implementation_type& impl, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef signal_handler op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((io_context_.context(), - *p.p, "signal_set", &impl, 0, "async_wait")); - - start_wait_op(impl, p.p); - p.v = p.p = 0; - } - - // Deliver notification that a particular signal occurred. - ASIO_DECL static void deliver_signal(int signal_number); - -private: - // Helper function to add a service to the global signal state. - ASIO_DECL static void add_service(signal_set_service* service); - - // Helper function to remove a service from the global signal state. - ASIO_DECL static void remove_service(signal_set_service* service); - - // Helper function to create the pipe descriptors. - ASIO_DECL static void open_descriptors(); - - // Helper function to close the pipe descriptors. - ASIO_DECL static void close_descriptors(); - - // Helper function to start a wait operation. - ASIO_DECL void start_wait_op(implementation_type& impl, signal_op* op); - - // The io_context instance used for dispatching handlers. - io_context_impl& io_context_; - -#if !defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_RUNTIME) \ - && !defined(__CYGWIN__) - // The type used for registering for pipe reactor notifications. - class pipe_read_op; - - // The reactor used for waiting for pipe readiness. - reactor& reactor_; - - // The per-descriptor reactor data used for the pipe. - reactor::per_descriptor_data reactor_data_; -#endif // !defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_RUNTIME) - // && !defined(__CYGWIN__) - - // A mapping from signal number to the registered signal sets. - registration* registrations_[max_signal_number]; - - // Pointers to adjacent services in linked list. - signal_set_service* next_; - signal_set_service* prev_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/signal_set_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_SIGNAL_SET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/socket_holder.hpp b/scout_sdk/asio/asio/detail/socket_holder.hpp deleted file mode 100644 index 99b081f..0000000 --- a/scout_sdk/asio/asio/detail/socket_holder.hpp +++ /dev/null @@ -1,98 +0,0 @@ -// -// detail/socket_holder.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_HOLDER_HPP -#define ASIO_DETAIL_SOCKET_HOLDER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Implement the resource acquisition is initialisation idiom for sockets. -class socket_holder - : private noncopyable -{ -public: - // Construct as an uninitialised socket. - socket_holder() - : socket_(invalid_socket) - { - } - - // Construct to take ownership of the specified socket. - explicit socket_holder(socket_type s) - : socket_(s) - { - } - - // Destructor. - ~socket_holder() - { - if (socket_ != invalid_socket) - { - asio::error_code ec; - socket_ops::state_type state = 0; - socket_ops::close(socket_, state, true, ec); - } - } - - // Get the underlying socket. - socket_type get() const - { - return socket_; - } - - // Reset to an uninitialised socket. - void reset() - { - if (socket_ != invalid_socket) - { - asio::error_code ec; - socket_ops::state_type state = 0; - socket_ops::close(socket_, state, true, ec); - socket_ = invalid_socket; - } - } - - // Reset to take ownership of the specified socket. - void reset(socket_type s) - { - reset(); - socket_ = s; - } - - // Release ownership of the socket. - socket_type release() - { - socket_type tmp = socket_; - socket_ = invalid_socket; - return tmp; - } - -private: - // The underlying socket. - socket_type socket_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_HOLDER_HPP diff --git a/scout_sdk/asio/asio/detail/socket_ops.hpp b/scout_sdk/asio/asio/detail/socket_ops.hpp deleted file mode 100644 index 815b0d1..0000000 --- a/scout_sdk/asio/asio/detail/socket_ops.hpp +++ /dev/null @@ -1,337 +0,0 @@ -// -// detail/socket_ops.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_OPS_HPP -#define ASIO_DETAIL_SOCKET_OPS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/error_code.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { -namespace socket_ops { - -// Socket state bits. -enum -{ - // The user wants a non-blocking socket. - user_set_non_blocking = 1, - - // The socket has been set non-blocking. - internal_non_blocking = 2, - - // Helper "state" used to determine whether the socket is non-blocking. - non_blocking = user_set_non_blocking | internal_non_blocking, - - // User wants connection_aborted errors, which are disabled by default. - enable_connection_aborted = 4, - - // The user set the linger option. Needs to be checked when closing. - user_set_linger = 8, - - // The socket is stream-oriented. - stream_oriented = 16, - - // The socket is datagram-oriented. - datagram_oriented = 32, - - // The socket may have been dup()-ed. - possible_dup = 64 -}; - -typedef unsigned char state_type; - -struct noop_deleter { void operator()(void*) {} }; -typedef shared_ptr shared_cancel_token_type; -typedef weak_ptr weak_cancel_token_type; - -#if !defined(ASIO_WINDOWS_RUNTIME) - -ASIO_DECL socket_type accept(socket_type s, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec); - -ASIO_DECL socket_type sync_accept(socket_type s, - state_type state, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec); - -#if defined(ASIO_HAS_IOCP) - -ASIO_DECL void complete_iocp_accept(socket_type s, - void* output_buffer, DWORD address_length, - socket_addr_type* addr, std::size_t* addrlen, - socket_type new_socket, asio::error_code& ec); - -#else // defined(ASIO_HAS_IOCP) - -ASIO_DECL bool non_blocking_accept(socket_type s, - state_type state, socket_addr_type* addr, std::size_t* addrlen, - asio::error_code& ec, socket_type& new_socket); - -#endif // defined(ASIO_HAS_IOCP) - -ASIO_DECL int bind(socket_type s, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec); - -ASIO_DECL int close(socket_type s, state_type& state, - bool destruction, asio::error_code& ec); - -ASIO_DECL bool set_user_non_blocking(socket_type s, - state_type& state, bool value, asio::error_code& ec); - -ASIO_DECL bool set_internal_non_blocking(socket_type s, - state_type& state, bool value, asio::error_code& ec); - -ASIO_DECL int shutdown(socket_type s, - int what, asio::error_code& ec); - -ASIO_DECL int connect(socket_type s, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec); - -ASIO_DECL void sync_connect(socket_type s, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec); - -#if defined(ASIO_HAS_IOCP) - -ASIO_DECL void complete_iocp_connect(socket_type s, - asio::error_code& ec); - -#endif // defined(ASIO_HAS_IOCP) - -ASIO_DECL bool non_blocking_connect(socket_type s, - asio::error_code& ec); - -ASIO_DECL int socketpair(int af, int type, int protocol, - socket_type sv[2], asio::error_code& ec); - -ASIO_DECL bool sockatmark(socket_type s, asio::error_code& ec); - -ASIO_DECL size_t available(socket_type s, asio::error_code& ec); - -ASIO_DECL int listen(socket_type s, - int backlog, asio::error_code& ec); - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -typedef WSABUF buf; -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) -typedef iovec buf; -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -ASIO_DECL void init_buf(buf& b, void* data, size_t size); - -ASIO_DECL void init_buf(buf& b, const void* data, size_t size); - -ASIO_DECL signed_size_type recv(socket_type s, buf* bufs, - size_t count, int flags, asio::error_code& ec); - -ASIO_DECL size_t sync_recv(socket_type s, state_type state, buf* bufs, - size_t count, int flags, bool all_empty, asio::error_code& ec); - -#if defined(ASIO_HAS_IOCP) - -ASIO_DECL void complete_iocp_recv(state_type state, - const weak_cancel_token_type& cancel_token, bool all_empty, - asio::error_code& ec, size_t bytes_transferred); - -#else // defined(ASIO_HAS_IOCP) - -ASIO_DECL bool non_blocking_recv(socket_type s, - buf* bufs, size_t count, int flags, bool is_stream, - asio::error_code& ec, size_t& bytes_transferred); - -#endif // defined(ASIO_HAS_IOCP) - -ASIO_DECL signed_size_type recvfrom(socket_type s, buf* bufs, - size_t count, int flags, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec); - -ASIO_DECL size_t sync_recvfrom(socket_type s, state_type state, - buf* bufs, size_t count, int flags, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec); - -#if defined(ASIO_HAS_IOCP) - -ASIO_DECL void complete_iocp_recvfrom( - const weak_cancel_token_type& cancel_token, - asio::error_code& ec); - -#else // defined(ASIO_HAS_IOCP) - -ASIO_DECL bool non_blocking_recvfrom(socket_type s, - buf* bufs, size_t count, int flags, - socket_addr_type* addr, std::size_t* addrlen, - asio::error_code& ec, size_t& bytes_transferred); - -#endif // defined(ASIO_HAS_IOCP) - -ASIO_DECL signed_size_type recvmsg(socket_type s, buf* bufs, - size_t count, int in_flags, int& out_flags, - asio::error_code& ec); - -ASIO_DECL size_t sync_recvmsg(socket_type s, state_type state, - buf* bufs, size_t count, int in_flags, int& out_flags, - asio::error_code& ec); - -#if defined(ASIO_HAS_IOCP) - -ASIO_DECL void complete_iocp_recvmsg( - const weak_cancel_token_type& cancel_token, - asio::error_code& ec); - -#else // defined(ASIO_HAS_IOCP) - -ASIO_DECL bool non_blocking_recvmsg(socket_type s, - buf* bufs, size_t count, int in_flags, int& out_flags, - asio::error_code& ec, size_t& bytes_transferred); - -#endif // defined(ASIO_HAS_IOCP) - -ASIO_DECL signed_size_type send(socket_type s, const buf* bufs, - size_t count, int flags, asio::error_code& ec); - -ASIO_DECL size_t sync_send(socket_type s, state_type state, - const buf* bufs, size_t count, int flags, - bool all_empty, asio::error_code& ec); - -#if defined(ASIO_HAS_IOCP) - -ASIO_DECL void complete_iocp_send( - const weak_cancel_token_type& cancel_token, - asio::error_code& ec); - -#else // defined(ASIO_HAS_IOCP) - -ASIO_DECL bool non_blocking_send(socket_type s, - const buf* bufs, size_t count, int flags, - asio::error_code& ec, size_t& bytes_transferred); - -#endif // defined(ASIO_HAS_IOCP) - -ASIO_DECL signed_size_type sendto(socket_type s, const buf* bufs, - size_t count, int flags, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec); - -ASIO_DECL size_t sync_sendto(socket_type s, state_type state, - const buf* bufs, size_t count, int flags, const socket_addr_type* addr, - std::size_t addrlen, asio::error_code& ec); - -#if !defined(ASIO_HAS_IOCP) - -ASIO_DECL bool non_blocking_sendto(socket_type s, - const buf* bufs, size_t count, int flags, - const socket_addr_type* addr, std::size_t addrlen, - asio::error_code& ec, size_t& bytes_transferred); - -#endif // !defined(ASIO_HAS_IOCP) - -ASIO_DECL socket_type socket(int af, int type, int protocol, - asio::error_code& ec); - -ASIO_DECL int setsockopt(socket_type s, state_type& state, - int level, int optname, const void* optval, - std::size_t optlen, asio::error_code& ec); - -ASIO_DECL int getsockopt(socket_type s, state_type state, - int level, int optname, void* optval, - size_t* optlen, asio::error_code& ec); - -ASIO_DECL int getpeername(socket_type s, socket_addr_type* addr, - std::size_t* addrlen, bool cached, asio::error_code& ec); - -ASIO_DECL int getsockname(socket_type s, socket_addr_type* addr, - std::size_t* addrlen, asio::error_code& ec); - -ASIO_DECL int ioctl(socket_type s, state_type& state, - int cmd, ioctl_arg_type* arg, asio::error_code& ec); - -ASIO_DECL int select(int nfds, fd_set* readfds, fd_set* writefds, - fd_set* exceptfds, timeval* timeout, asio::error_code& ec); - -ASIO_DECL int poll_read(socket_type s, - state_type state, int msec, asio::error_code& ec); - -ASIO_DECL int poll_write(socket_type s, - state_type state, int msec, asio::error_code& ec); - -ASIO_DECL int poll_error(socket_type s, - state_type state, int msec, asio::error_code& ec); - -ASIO_DECL int poll_connect(socket_type s, - int msec, asio::error_code& ec); - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -ASIO_DECL const char* inet_ntop(int af, const void* src, char* dest, - size_t length, unsigned long scope_id, asio::error_code& ec); - -ASIO_DECL int inet_pton(int af, const char* src, void* dest, - unsigned long* scope_id, asio::error_code& ec); - -ASIO_DECL int gethostname(char* name, - int namelen, asio::error_code& ec); - -#if !defined(ASIO_WINDOWS_RUNTIME) - -ASIO_DECL asio::error_code getaddrinfo(const char* host, - const char* service, const addrinfo_type& hints, - addrinfo_type** result, asio::error_code& ec); - -ASIO_DECL asio::error_code background_getaddrinfo( - const weak_cancel_token_type& cancel_token, const char* host, - const char* service, const addrinfo_type& hints, - addrinfo_type** result, asio::error_code& ec); - -ASIO_DECL void freeaddrinfo(addrinfo_type* ai); - -ASIO_DECL asio::error_code getnameinfo( - const socket_addr_type* addr, std::size_t addrlen, - char* host, std::size_t hostlen, char* serv, - std::size_t servlen, int flags, asio::error_code& ec); - -ASIO_DECL asio::error_code sync_getnameinfo( - const socket_addr_type* addr, std::size_t addrlen, - char* host, std::size_t hostlen, char* serv, - std::size_t servlen, int sock_type, asio::error_code& ec); - -ASIO_DECL asio::error_code background_getnameinfo( - const weak_cancel_token_type& cancel_token, - const socket_addr_type* addr, std::size_t addrlen, - char* host, std::size_t hostlen, char* serv, - std::size_t servlen, int sock_type, asio::error_code& ec); - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -ASIO_DECL u_long_type network_to_host_long(u_long_type value); - -ASIO_DECL u_long_type host_to_network_long(u_long_type value); - -ASIO_DECL u_short_type network_to_host_short(u_short_type value); - -ASIO_DECL u_short_type host_to_network_short(u_short_type value); - -} // namespace socket_ops -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/socket_ops.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_SOCKET_OPS_HPP diff --git a/scout_sdk/asio/asio/detail/socket_option.hpp b/scout_sdk/asio/asio/detail/socket_option.hpp deleted file mode 100644 index 6852d56..0000000 --- a/scout_sdk/asio/asio/detail/socket_option.hpp +++ /dev/null @@ -1,316 +0,0 @@ -// -// detail/socket_option.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_OPTION_HPP -#define ASIO_DETAIL_SOCKET_OPTION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_exception.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { -namespace socket_option { - -// Helper template for implementing boolean-based options. -template -class boolean -{ -public: - // Default constructor. - boolean() - : value_(0) - { - } - - // Construct with a specific option value. - explicit boolean(bool v) - : value_(v ? 1 : 0) - { - } - - // Set the current value of the boolean. - boolean& operator=(bool v) - { - value_ = v ? 1 : 0; - return *this; - } - - // Get the current value of the boolean. - bool value() const - { - return !!value_; - } - - // Convert to bool. - operator bool() const - { - return !!value_; - } - - // Test for false. - bool operator!() const - { - return !value_; - } - - // Get the level of the socket option. - template - int level(const Protocol&) const - { - return Level; - } - - // Get the name of the socket option. - template - int name(const Protocol&) const - { - return Name; - } - - // Get the address of the boolean data. - template - int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the boolean data. - template - const int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the boolean data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - - // Set the size of the boolean data. - template - void resize(const Protocol&, std::size_t s) - { - // On some platforms (e.g. Windows Vista), the getsockopt function will - // return the size of a boolean socket option as one byte, even though a - // four byte integer was passed in. - switch (s) - { - case sizeof(char): - value_ = *reinterpret_cast(&value_) ? 1 : 0; - break; - case sizeof(value_): - break; - default: - { - std::length_error ex("boolean socket option resize"); - asio::detail::throw_exception(ex); - } - } - } - -private: - int value_; -}; - -// Helper template for implementing integer options. -template -class integer -{ -public: - // Default constructor. - integer() - : value_(0) - { - } - - // Construct with a specific option value. - explicit integer(int v) - : value_(v) - { - } - - // Set the value of the int option. - integer& operator=(int v) - { - value_ = v; - return *this; - } - - // Get the current value of the int option. - int value() const - { - return value_; - } - - // Get the level of the socket option. - template - int level(const Protocol&) const - { - return Level; - } - - // Get the name of the socket option. - template - int name(const Protocol&) const - { - return Name; - } - - // Get the address of the int data. - template - int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the int data. - template - const int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the int data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - - // Set the size of the int data. - template - void resize(const Protocol&, std::size_t s) - { - if (s != sizeof(value_)) - { - std::length_error ex("integer socket option resize"); - asio::detail::throw_exception(ex); - } - } - -private: - int value_; -}; - -// Helper template for implementing linger options. -template -class linger -{ -public: - // Default constructor. - linger() - { - value_.l_onoff = 0; - value_.l_linger = 0; - } - - // Construct with specific option values. - linger(bool e, int t) - { - enabled(e); - timeout ASIO_PREVENT_MACRO_SUBSTITUTION(t); - } - - // Set the value for whether linger is enabled. - void enabled(bool value) - { - value_.l_onoff = value ? 1 : 0; - } - - // Get the value for whether linger is enabled. - bool enabled() const - { - return value_.l_onoff != 0; - } - - // Set the value for the linger timeout. - void timeout ASIO_PREVENT_MACRO_SUBSTITUTION(int value) - { -#if defined(WIN32) - value_.l_linger = static_cast(value); -#else - value_.l_linger = value; -#endif - } - - // Get the value for the linger timeout. - int timeout ASIO_PREVENT_MACRO_SUBSTITUTION() const - { - return static_cast(value_.l_linger); - } - - // Get the level of the socket option. - template - int level(const Protocol&) const - { - return Level; - } - - // Get the name of the socket option. - template - int name(const Protocol&) const - { - return Name; - } - - // Get the address of the linger data. - template - detail::linger_type* data(const Protocol&) - { - return &value_; - } - - // Get the address of the linger data. - template - const detail::linger_type* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the linger data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - - // Set the size of the int data. - template - void resize(const Protocol&, std::size_t s) - { - if (s != sizeof(value_)) - { - std::length_error ex("linger socket option resize"); - asio::detail::throw_exception(ex); - } - } - -private: - detail::linger_type value_; -}; - -} // namespace socket_option -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_OPTION_HPP diff --git a/scout_sdk/asio/asio/detail/socket_select_interrupter.hpp b/scout_sdk/asio/asio/detail/socket_select_interrupter.hpp deleted file mode 100644 index 7351070..0000000 --- a/scout_sdk/asio/asio/detail/socket_select_interrupter.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// detail/socket_select_interrupter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP -#define ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_WINDOWS_RUNTIME) - -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(__SYMBIAN32__) - -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class socket_select_interrupter -{ -public: - // Constructor. - ASIO_DECL socket_select_interrupter(); - - // Destructor. - ASIO_DECL ~socket_select_interrupter(); - - // Recreate the interrupter's descriptors. Used after a fork. - ASIO_DECL void recreate(); - - // Interrupt the select call. - ASIO_DECL void interrupt(); - - // Reset the select interrupt. Returns true if the call was interrupted. - ASIO_DECL bool reset(); - - // Get the read descriptor to be passed to select. - socket_type read_descriptor() const - { - return read_descriptor_; - } - -private: - // Open the descriptors. Throws on error. - ASIO_DECL void open_descriptors(); - - // Close the descriptors. - ASIO_DECL void close_descriptors(); - - // The read end of a connection used to interrupt the select call. This file - // descriptor is passed to select such that when it is time to stop, a single - // byte will be written on the other end of the connection and this - // descriptor will become readable. - socket_type read_descriptor_; - - // The write end of a connection used to interrupt the select call. A single - // byte may be written to this to wake up the select which is waiting for the - // other end to become readable. - socket_type write_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/socket_select_interrupter.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS) - // || defined(__CYGWIN__) - // || defined(__SYMBIAN32__) - -#endif // !defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP diff --git a/scout_sdk/asio/asio/detail/socket_types.hpp b/scout_sdk/asio/asio/detail/socket_types.hpp deleted file mode 100644 index d354343..0000000 --- a/scout_sdk/asio/asio/detail/socket_types.hpp +++ /dev/null @@ -1,416 +0,0 @@ -// -// detail/socket_types.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_TYPES_HPP -#define ASIO_DETAIL_SOCKET_TYPES_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -// Empty. -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_) -# error WinSock.h has already been included -# endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_) -# if defined(__BORLANDC__) -# include // Needed for __errno -# if !defined(_WSPIAPI_H_) -# define _WSPIAPI_H_ -# define ASIO_WSPIAPI_H_DEFINED -# endif // !defined(_WSPIAPI_H_) -# endif // defined(__BORLANDC__) -# include -# include -# if defined(WINAPI_FAMILY) -# if ((WINAPI_FAMILY & WINAPI_PARTITION_DESKTOP) != 0) -# include -# endif // ((WINAPI_FAMILY & WINAPI_PARTITION_DESKTOP) != 0) -# endif // defined(WINAPI_FAMILY) -# if !defined(ASIO_WINDOWS_APP) -# include -# endif // !defined(ASIO_WINDOWS_APP) -# if defined(ASIO_WSPIAPI_H_DEFINED) -# undef _WSPIAPI_H_ -# undef ASIO_WSPIAPI_H_DEFINED -# endif // defined(ASIO_WSPIAPI_H_DEFINED) -# if !defined(ASIO_NO_DEFAULT_LINKED_LIBS) -# if defined(UNDER_CE) -# pragma comment(lib, "ws2.lib") -# elif defined(_MSC_VER) || defined(__BORLANDC__) -# pragma comment(lib, "ws2_32.lib") -# if !defined(ASIO_WINDOWS_APP) -# pragma comment(lib, "mswsock.lib") -# endif // !defined(ASIO_WINDOWS_APP) -# endif // defined(_MSC_VER) || defined(__BORLANDC__) -# endif // !defined(ASIO_NO_DEFAULT_LINKED_LIBS) -# include "asio/detail/old_win_sdk_compat.hpp" -#else -# include -# if (defined(__MACH__) && defined(__APPLE__)) \ - || defined(__FreeBSD__) || defined(__NetBSD__) \ - || defined(__OpenBSD__) || defined(__linux__) \ - || defined(__EMSCRIPTEN__) -# include -# elif !defined(__SYMBIAN32__) -# include -# endif -# include -# include -# include -# if defined(__hpux) -# include -# endif -# if !defined(__hpux) || defined(__SELECT) -# include -# endif -# include -# include -# include -# include -# if !defined(__SYMBIAN32__) -# include -# endif -# include -# include -# include -# include -# if defined(__sun) -# include -# include -# endif -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -#if defined(ASIO_WINDOWS_RUNTIME) -const int max_addr_v4_str_len = 256; -const int max_addr_v6_str_len = 256; -typedef unsigned __int32 u_long_type; -typedef unsigned __int16 u_short_type; -struct in4_addr_type { u_long_type s_addr; }; -struct in4_mreq_type { in4_addr_type imr_multiaddr, imr_interface; }; -struct in6_addr_type { unsigned char s6_addr[16]; }; -struct in6_mreq_type { in6_addr_type ipv6mr_multiaddr; - unsigned long ipv6mr_interface; }; -struct socket_addr_type { int sa_family; }; -struct sockaddr_in4_type { int sin_family; - in4_addr_type sin_addr; u_short_type sin_port; }; -struct sockaddr_in6_type { int sin6_family; - in6_addr_type sin6_addr; u_short_type sin6_port; - u_long_type sin6_flowinfo; u_long_type sin6_scope_id; }; -struct sockaddr_storage_type { int ss_family; - unsigned char ss_bytes[128 - sizeof(int)]; }; -struct addrinfo_type { int ai_flags; - int ai_family, ai_socktype, ai_protocol; - int ai_addrlen; const void* ai_addr; - const char* ai_canonname; addrinfo_type* ai_next; }; -struct linger_type { u_short_type l_onoff, l_linger; }; -typedef u_long_type ioctl_arg_type; -typedef int signed_size_type; -# define ASIO_OS_DEF(c) ASIO_OS_DEF_##c -# define ASIO_OS_DEF_AF_UNSPEC 0 -# define ASIO_OS_DEF_AF_INET 2 -# define ASIO_OS_DEF_AF_INET6 23 -# define ASIO_OS_DEF_SOCK_STREAM 1 -# define ASIO_OS_DEF_SOCK_DGRAM 2 -# define ASIO_OS_DEF_SOCK_RAW 3 -# define ASIO_OS_DEF_SOCK_SEQPACKET 5 -# define ASIO_OS_DEF_IPPROTO_IP 0 -# define ASIO_OS_DEF_IPPROTO_IPV6 41 -# define ASIO_OS_DEF_IPPROTO_TCP 6 -# define ASIO_OS_DEF_IPPROTO_UDP 17 -# define ASIO_OS_DEF_IPPROTO_ICMP 1 -# define ASIO_OS_DEF_IPPROTO_ICMPV6 58 -# define ASIO_OS_DEF_FIONBIO 1 -# define ASIO_OS_DEF_FIONREAD 2 -# define ASIO_OS_DEF_INADDR_ANY 0 -# define ASIO_OS_DEF_MSG_OOB 0x1 -# define ASIO_OS_DEF_MSG_PEEK 0x2 -# define ASIO_OS_DEF_MSG_DONTROUTE 0x4 -# define ASIO_OS_DEF_MSG_EOR 0 // Not supported. -# define ASIO_OS_DEF_SHUT_RD 0x0 -# define ASIO_OS_DEF_SHUT_WR 0x1 -# define ASIO_OS_DEF_SHUT_RDWR 0x2 -# define ASIO_OS_DEF_SOMAXCONN 0x7fffffff -# define ASIO_OS_DEF_SOL_SOCKET 0xffff -# define ASIO_OS_DEF_SO_BROADCAST 0x20 -# define ASIO_OS_DEF_SO_DEBUG 0x1 -# define ASIO_OS_DEF_SO_DONTROUTE 0x10 -# define ASIO_OS_DEF_SO_KEEPALIVE 0x8 -# define ASIO_OS_DEF_SO_LINGER 0x80 -# define ASIO_OS_DEF_SO_OOBINLINE 0x100 -# define ASIO_OS_DEF_SO_SNDBUF 0x1001 -# define ASIO_OS_DEF_SO_RCVBUF 0x1002 -# define ASIO_OS_DEF_SO_SNDLOWAT 0x1003 -# define ASIO_OS_DEF_SO_RCVLOWAT 0x1004 -# define ASIO_OS_DEF_SO_REUSEADDR 0x4 -# define ASIO_OS_DEF_TCP_NODELAY 0x1 -# define ASIO_OS_DEF_IP_MULTICAST_IF 2 -# define ASIO_OS_DEF_IP_MULTICAST_TTL 3 -# define ASIO_OS_DEF_IP_MULTICAST_LOOP 4 -# define ASIO_OS_DEF_IP_ADD_MEMBERSHIP 5 -# define ASIO_OS_DEF_IP_DROP_MEMBERSHIP 6 -# define ASIO_OS_DEF_IP_TTL 7 -# define ASIO_OS_DEF_IPV6_UNICAST_HOPS 4 -# define ASIO_OS_DEF_IPV6_MULTICAST_IF 9 -# define ASIO_OS_DEF_IPV6_MULTICAST_HOPS 10 -# define ASIO_OS_DEF_IPV6_MULTICAST_LOOP 11 -# define ASIO_OS_DEF_IPV6_JOIN_GROUP 12 -# define ASIO_OS_DEF_IPV6_LEAVE_GROUP 13 -# define ASIO_OS_DEF_AI_CANONNAME 0x2 -# define ASIO_OS_DEF_AI_PASSIVE 0x1 -# define ASIO_OS_DEF_AI_NUMERICHOST 0x4 -# define ASIO_OS_DEF_AI_NUMERICSERV 0x8 -# define ASIO_OS_DEF_AI_V4MAPPED 0x800 -# define ASIO_OS_DEF_AI_ALL 0x100 -# define ASIO_OS_DEF_AI_ADDRCONFIG 0x400 -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) -typedef SOCKET socket_type; -const SOCKET invalid_socket = INVALID_SOCKET; -const int socket_error_retval = SOCKET_ERROR; -const int max_addr_v4_str_len = 256; -const int max_addr_v6_str_len = 256; -typedef sockaddr socket_addr_type; -typedef in_addr in4_addr_type; -typedef ip_mreq in4_mreq_type; -typedef sockaddr_in sockaddr_in4_type; -# if defined(ASIO_HAS_OLD_WIN_SDK) -typedef in6_addr_emulation in6_addr_type; -typedef ipv6_mreq_emulation in6_mreq_type; -typedef sockaddr_in6_emulation sockaddr_in6_type; -typedef sockaddr_storage_emulation sockaddr_storage_type; -typedef addrinfo_emulation addrinfo_type; -# else -typedef in6_addr in6_addr_type; -typedef ipv6_mreq in6_mreq_type; -typedef sockaddr_in6 sockaddr_in6_type; -typedef sockaddr_storage sockaddr_storage_type; -typedef addrinfo addrinfo_type; -# endif -typedef ::linger linger_type; -typedef unsigned long ioctl_arg_type; -typedef u_long u_long_type; -typedef u_short u_short_type; -typedef int signed_size_type; -# define ASIO_OS_DEF(c) ASIO_OS_DEF_##c -# define ASIO_OS_DEF_AF_UNSPEC AF_UNSPEC -# define ASIO_OS_DEF_AF_INET AF_INET -# define ASIO_OS_DEF_AF_INET6 AF_INET6 -# define ASIO_OS_DEF_SOCK_STREAM SOCK_STREAM -# define ASIO_OS_DEF_SOCK_DGRAM SOCK_DGRAM -# define ASIO_OS_DEF_SOCK_RAW SOCK_RAW -# define ASIO_OS_DEF_SOCK_SEQPACKET SOCK_SEQPACKET -# define ASIO_OS_DEF_IPPROTO_IP IPPROTO_IP -# define ASIO_OS_DEF_IPPROTO_IPV6 IPPROTO_IPV6 -# define ASIO_OS_DEF_IPPROTO_TCP IPPROTO_TCP -# define ASIO_OS_DEF_IPPROTO_UDP IPPROTO_UDP -# define ASIO_OS_DEF_IPPROTO_ICMP IPPROTO_ICMP -# define ASIO_OS_DEF_IPPROTO_ICMPV6 IPPROTO_ICMPV6 -# define ASIO_OS_DEF_FIONBIO FIONBIO -# define ASIO_OS_DEF_FIONREAD FIONREAD -# define ASIO_OS_DEF_INADDR_ANY INADDR_ANY -# define ASIO_OS_DEF_MSG_OOB MSG_OOB -# define ASIO_OS_DEF_MSG_PEEK MSG_PEEK -# define ASIO_OS_DEF_MSG_DONTROUTE MSG_DONTROUTE -# define ASIO_OS_DEF_MSG_EOR 0 // Not supported on Windows. -# define ASIO_OS_DEF_SHUT_RD SD_RECEIVE -# define ASIO_OS_DEF_SHUT_WR SD_SEND -# define ASIO_OS_DEF_SHUT_RDWR SD_BOTH -# define ASIO_OS_DEF_SOMAXCONN SOMAXCONN -# define ASIO_OS_DEF_SOL_SOCKET SOL_SOCKET -# define ASIO_OS_DEF_SO_BROADCAST SO_BROADCAST -# define ASIO_OS_DEF_SO_DEBUG SO_DEBUG -# define ASIO_OS_DEF_SO_DONTROUTE SO_DONTROUTE -# define ASIO_OS_DEF_SO_KEEPALIVE SO_KEEPALIVE -# define ASIO_OS_DEF_SO_LINGER SO_LINGER -# define ASIO_OS_DEF_SO_OOBINLINE SO_OOBINLINE -# define ASIO_OS_DEF_SO_SNDBUF SO_SNDBUF -# define ASIO_OS_DEF_SO_RCVBUF SO_RCVBUF -# define ASIO_OS_DEF_SO_SNDLOWAT SO_SNDLOWAT -# define ASIO_OS_DEF_SO_RCVLOWAT SO_RCVLOWAT -# define ASIO_OS_DEF_SO_REUSEADDR SO_REUSEADDR -# define ASIO_OS_DEF_TCP_NODELAY TCP_NODELAY -# define ASIO_OS_DEF_IP_MULTICAST_IF IP_MULTICAST_IF -# define ASIO_OS_DEF_IP_MULTICAST_TTL IP_MULTICAST_TTL -# define ASIO_OS_DEF_IP_MULTICAST_LOOP IP_MULTICAST_LOOP -# define ASIO_OS_DEF_IP_ADD_MEMBERSHIP IP_ADD_MEMBERSHIP -# define ASIO_OS_DEF_IP_DROP_MEMBERSHIP IP_DROP_MEMBERSHIP -# define ASIO_OS_DEF_IP_TTL IP_TTL -# define ASIO_OS_DEF_IPV6_UNICAST_HOPS IPV6_UNICAST_HOPS -# define ASIO_OS_DEF_IPV6_MULTICAST_IF IPV6_MULTICAST_IF -# define ASIO_OS_DEF_IPV6_MULTICAST_HOPS IPV6_MULTICAST_HOPS -# define ASIO_OS_DEF_IPV6_MULTICAST_LOOP IPV6_MULTICAST_LOOP -# define ASIO_OS_DEF_IPV6_JOIN_GROUP IPV6_JOIN_GROUP -# define ASIO_OS_DEF_IPV6_LEAVE_GROUP IPV6_LEAVE_GROUP -# define ASIO_OS_DEF_AI_CANONNAME AI_CANONNAME -# define ASIO_OS_DEF_AI_PASSIVE AI_PASSIVE -# define ASIO_OS_DEF_AI_NUMERICHOST AI_NUMERICHOST -# if defined(AI_NUMERICSERV) -# define ASIO_OS_DEF_AI_NUMERICSERV AI_NUMERICSERV -# else -# define ASIO_OS_DEF_AI_NUMERICSERV 0 -# endif -# if defined(AI_V4MAPPED) -# define ASIO_OS_DEF_AI_V4MAPPED AI_V4MAPPED -# else -# define ASIO_OS_DEF_AI_V4MAPPED 0 -# endif -# if defined(AI_ALL) -# define ASIO_OS_DEF_AI_ALL AI_ALL -# else -# define ASIO_OS_DEF_AI_ALL 0 -# endif -# if defined(AI_ADDRCONFIG) -# define ASIO_OS_DEF_AI_ADDRCONFIG AI_ADDRCONFIG -# else -# define ASIO_OS_DEF_AI_ADDRCONFIG 0 -# endif -# if defined (_WIN32_WINNT) -const int max_iov_len = 64; -# else -const int max_iov_len = 16; -# endif -#else -typedef int socket_type; -const int invalid_socket = -1; -const int socket_error_retval = -1; -const int max_addr_v4_str_len = INET_ADDRSTRLEN; -#if defined(INET6_ADDRSTRLEN) -const int max_addr_v6_str_len = INET6_ADDRSTRLEN + 1 + IF_NAMESIZE; -#else // defined(INET6_ADDRSTRLEN) -const int max_addr_v6_str_len = 256; -#endif // defined(INET6_ADDRSTRLEN) -typedef sockaddr socket_addr_type; -typedef in_addr in4_addr_type; -# if defined(__hpux) -// HP-UX doesn't provide ip_mreq when _XOPEN_SOURCE_EXTENDED is defined. -struct in4_mreq_type -{ - struct in_addr imr_multiaddr; - struct in_addr imr_interface; -}; -# else -typedef ip_mreq in4_mreq_type; -# endif -typedef sockaddr_in sockaddr_in4_type; -typedef in6_addr in6_addr_type; -typedef ipv6_mreq in6_mreq_type; -typedef sockaddr_in6 sockaddr_in6_type; -typedef sockaddr_storage sockaddr_storage_type; -typedef sockaddr_un sockaddr_un_type; -typedef addrinfo addrinfo_type; -typedef ::linger linger_type; -typedef int ioctl_arg_type; -typedef uint32_t u_long_type; -typedef uint16_t u_short_type; -#if defined(ASIO_HAS_SSIZE_T) -typedef ssize_t signed_size_type; -#else // defined(ASIO_HAS_SSIZE_T) -typedef int signed_size_type; -#endif // defined(ASIO_HAS_SSIZE_T) -# define ASIO_OS_DEF(c) ASIO_OS_DEF_##c -# define ASIO_OS_DEF_AF_UNSPEC AF_UNSPEC -# define ASIO_OS_DEF_AF_INET AF_INET -# define ASIO_OS_DEF_AF_INET6 AF_INET6 -# define ASIO_OS_DEF_SOCK_STREAM SOCK_STREAM -# define ASIO_OS_DEF_SOCK_DGRAM SOCK_DGRAM -# define ASIO_OS_DEF_SOCK_RAW SOCK_RAW -# define ASIO_OS_DEF_SOCK_SEQPACKET SOCK_SEQPACKET -# define ASIO_OS_DEF_IPPROTO_IP IPPROTO_IP -# define ASIO_OS_DEF_IPPROTO_IPV6 IPPROTO_IPV6 -# define ASIO_OS_DEF_IPPROTO_TCP IPPROTO_TCP -# define ASIO_OS_DEF_IPPROTO_UDP IPPROTO_UDP -# define ASIO_OS_DEF_IPPROTO_ICMP IPPROTO_ICMP -# define ASIO_OS_DEF_IPPROTO_ICMPV6 IPPROTO_ICMPV6 -# define ASIO_OS_DEF_FIONBIO FIONBIO -# define ASIO_OS_DEF_FIONREAD FIONREAD -# define ASIO_OS_DEF_INADDR_ANY INADDR_ANY -# define ASIO_OS_DEF_MSG_OOB MSG_OOB -# define ASIO_OS_DEF_MSG_PEEK MSG_PEEK -# define ASIO_OS_DEF_MSG_DONTROUTE MSG_DONTROUTE -# define ASIO_OS_DEF_MSG_EOR MSG_EOR -# define ASIO_OS_DEF_SHUT_RD SHUT_RD -# define ASIO_OS_DEF_SHUT_WR SHUT_WR -# define ASIO_OS_DEF_SHUT_RDWR SHUT_RDWR -# define ASIO_OS_DEF_SOMAXCONN SOMAXCONN -# define ASIO_OS_DEF_SOL_SOCKET SOL_SOCKET -# define ASIO_OS_DEF_SO_BROADCAST SO_BROADCAST -# define ASIO_OS_DEF_SO_DEBUG SO_DEBUG -# define ASIO_OS_DEF_SO_DONTROUTE SO_DONTROUTE -# define ASIO_OS_DEF_SO_KEEPALIVE SO_KEEPALIVE -# define ASIO_OS_DEF_SO_LINGER SO_LINGER -# define ASIO_OS_DEF_SO_OOBINLINE SO_OOBINLINE -# define ASIO_OS_DEF_SO_SNDBUF SO_SNDBUF -# define ASIO_OS_DEF_SO_RCVBUF SO_RCVBUF -# define ASIO_OS_DEF_SO_SNDLOWAT SO_SNDLOWAT -# define ASIO_OS_DEF_SO_RCVLOWAT SO_RCVLOWAT -# define ASIO_OS_DEF_SO_REUSEADDR SO_REUSEADDR -# define ASIO_OS_DEF_TCP_NODELAY TCP_NODELAY -# define ASIO_OS_DEF_IP_MULTICAST_IF IP_MULTICAST_IF -# define ASIO_OS_DEF_IP_MULTICAST_TTL IP_MULTICAST_TTL -# define ASIO_OS_DEF_IP_MULTICAST_LOOP IP_MULTICAST_LOOP -# define ASIO_OS_DEF_IP_ADD_MEMBERSHIP IP_ADD_MEMBERSHIP -# define ASIO_OS_DEF_IP_DROP_MEMBERSHIP IP_DROP_MEMBERSHIP -# define ASIO_OS_DEF_IP_TTL IP_TTL -# define ASIO_OS_DEF_IPV6_UNICAST_HOPS IPV6_UNICAST_HOPS -# define ASIO_OS_DEF_IPV6_MULTICAST_IF IPV6_MULTICAST_IF -# define ASIO_OS_DEF_IPV6_MULTICAST_HOPS IPV6_MULTICAST_HOPS -# define ASIO_OS_DEF_IPV6_MULTICAST_LOOP IPV6_MULTICAST_LOOP -# define ASIO_OS_DEF_IPV6_JOIN_GROUP IPV6_JOIN_GROUP -# define ASIO_OS_DEF_IPV6_LEAVE_GROUP IPV6_LEAVE_GROUP -# define ASIO_OS_DEF_AI_CANONNAME AI_CANONNAME -# define ASIO_OS_DEF_AI_PASSIVE AI_PASSIVE -# define ASIO_OS_DEF_AI_NUMERICHOST AI_NUMERICHOST -# if defined(AI_NUMERICSERV) -# define ASIO_OS_DEF_AI_NUMERICSERV AI_NUMERICSERV -# else -# define ASIO_OS_DEF_AI_NUMERICSERV 0 -# endif -// Note: QNX Neutrino 6.3 defines AI_V4MAPPED, AI_ALL and AI_ADDRCONFIG but -// does not implement them. Therefore they are specifically excluded here. -# if defined(AI_V4MAPPED) && !defined(__QNXNTO__) -# define ASIO_OS_DEF_AI_V4MAPPED AI_V4MAPPED -# else -# define ASIO_OS_DEF_AI_V4MAPPED 0 -# endif -# if defined(AI_ALL) && !defined(__QNXNTO__) -# define ASIO_OS_DEF_AI_ALL AI_ALL -# else -# define ASIO_OS_DEF_AI_ALL 0 -# endif -# if defined(AI_ADDRCONFIG) && !defined(__QNXNTO__) -# define ASIO_OS_DEF_AI_ADDRCONFIG AI_ADDRCONFIG -# else -# define ASIO_OS_DEF_AI_ADDRCONFIG 0 -# endif -# if defined(IOV_MAX) -const int max_iov_len = IOV_MAX; -# else -// POSIX platforms are not required to define IOV_MAX. -const int max_iov_len = 16; -# endif -#endif -const int custom_socket_option_level = 0xA5100000; -const int enable_connection_aborted_option = 1; -const int always_fail_option = 2; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_TYPES_HPP diff --git a/scout_sdk/asio/asio/detail/solaris_fenced_block.hpp b/scout_sdk/asio/asio/detail/solaris_fenced_block.hpp deleted file mode 100644 index d48f6a3..0000000 --- a/scout_sdk/asio/asio/detail/solaris_fenced_block.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// detail/solaris_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOLARIS_FENCED_BLOCK_HPP -#define ASIO_DETAIL_SOLARIS_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(__sun) - -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class solaris_fenced_block - : private noncopyable -{ -public: - enum half_t { half }; - enum full_t { full }; - - // Constructor for a half fenced block. - explicit solaris_fenced_block(half_t) - { - } - - // Constructor for a full fenced block. - explicit solaris_fenced_block(full_t) - { - membar_consumer(); - } - - // Destructor. - ~solaris_fenced_block() - { - membar_producer(); - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(__sun) - -#endif // ASIO_DETAIL_SOLARIS_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/static_mutex.hpp b/scout_sdk/asio/asio/detail/static_mutex.hpp deleted file mode 100644 index 8f2bc02..0000000 --- a/scout_sdk/asio/asio/detail/static_mutex.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// detail/static_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STATIC_MUTEX_HPP -#define ASIO_DETAIL_STATIC_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) -# include "asio/detail/null_static_mutex.hpp" -#elif defined(ASIO_WINDOWS) -# include "asio/detail/win_static_mutex.hpp" -#elif defined(ASIO_HAS_PTHREADS) -# include "asio/detail/posix_static_mutex.hpp" -#elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) -# include "asio/detail/std_static_mutex.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(ASIO_HAS_THREADS) -typedef null_static_mutex static_mutex; -# define ASIO_STATIC_MUTEX_INIT ASIO_NULL_STATIC_MUTEX_INIT -#elif defined(ASIO_WINDOWS) -typedef win_static_mutex static_mutex; -# define ASIO_STATIC_MUTEX_INIT ASIO_WIN_STATIC_MUTEX_INIT -#elif defined(ASIO_HAS_PTHREADS) -typedef posix_static_mutex static_mutex; -# define ASIO_STATIC_MUTEX_INIT ASIO_POSIX_STATIC_MUTEX_INIT -#elif defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) -typedef std_static_mutex static_mutex; -# define ASIO_STATIC_MUTEX_INIT ASIO_STD_STATIC_MUTEX_INIT -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_STATIC_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/std_event.hpp b/scout_sdk/asio/asio/detail/std_event.hpp deleted file mode 100644 index 5639ecd..0000000 --- a/scout_sdk/asio/asio/detail/std_event.hpp +++ /dev/null @@ -1,176 +0,0 @@ -// -// detail/std_event.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STD_EVENT_HPP -#define ASIO_DETAIL_STD_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) - -#include -#include -#include "asio/detail/assert.hpp" -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class std_event - : private noncopyable -{ -public: - // Constructor. - std_event() - : state_(0) - { - } - - // Destructor. - ~std_event() - { - } - - // Signal the event. (Retained for backward compatibility.) - template - void signal(Lock& lock) - { - this->signal_all(lock); - } - - // Signal all waiters. - template - void signal_all(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - (void)lock; - state_ |= 1; - cond_.notify_all(); - } - - // Unlock the mutex and signal one waiter. - template - void unlock_and_signal_one(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - state_ |= 1; - bool have_waiters = (state_ > 1); - lock.unlock(); - if (have_waiters) - cond_.notify_one(); - } - - // If there's a waiter, unlock the mutex and signal it. - template - bool maybe_unlock_and_signal_one(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - state_ |= 1; - if (state_ > 1) - { - lock.unlock(); - cond_.notify_one(); - return true; - } - return false; - } - - // Reset the event. - template - void clear(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - (void)lock; - state_ &= ~std::size_t(1); - } - - // Wait for the event to become signalled. - template - void wait(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - unique_lock_adapter u_lock(lock); - while ((state_ & 1) == 0) - { - waiter w(state_); - cond_.wait(u_lock.unique_lock_); - } - } - - // Timed wait for the event to become signalled. - template - bool wait_for_usec(Lock& lock, long usec) - { - ASIO_ASSERT(lock.locked()); - unique_lock_adapter u_lock(lock); - if ((state_ & 1) == 0) - { - waiter w(state_); - cond_.wait_for(u_lock.unique_lock_, std::chrono::microseconds(usec)); - } - return (state_ & 1) != 0; - } - -private: - // Helper class to temporarily adapt a scoped_lock into a unique_lock so that - // it can be passed to std::condition_variable::wait(). - struct unique_lock_adapter - { - template - explicit unique_lock_adapter(Lock& lock) - : unique_lock_(lock.mutex().mutex_, std::adopt_lock) - { - } - - ~unique_lock_adapter() - { - unique_lock_.release(); - } - - std::unique_lock unique_lock_; - }; - - // Helper to increment and decrement the state to track outstanding waiters. - class waiter - { - public: - explicit waiter(std::size_t& state) - : state_(state) - { - state_ += 2; - } - - ~waiter() - { - state_ -= 2; - } - - private: - std::size_t& state_; - }; - - std::condition_variable cond_; - std::size_t state_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) - -#endif // ASIO_DETAIL_STD_EVENT_HPP diff --git a/scout_sdk/asio/asio/detail/std_fenced_block.hpp b/scout_sdk/asio/asio/detail/std_fenced_block.hpp deleted file mode 100644 index 0d8ade0..0000000 --- a/scout_sdk/asio/asio/detail/std_fenced_block.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// detail/std_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STD_FENCED_BLOCK_HPP -#define ASIO_DETAIL_STD_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_ATOMIC) - -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class std_fenced_block - : private noncopyable -{ -public: - enum half_t { half }; - enum full_t { full }; - - // Constructor for a half fenced block. - explicit std_fenced_block(half_t) - { - } - - // Constructor for a full fenced block. - explicit std_fenced_block(full_t) - { - std::atomic_thread_fence(std::memory_order_acquire); - } - - // Destructor. - ~std_fenced_block() - { - std::atomic_thread_fence(std::memory_order_release); - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_STD_ATOMIC) - -#endif // ASIO_DETAIL_STD_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/std_global.hpp b/scout_sdk/asio/asio/detail/std_global.hpp deleted file mode 100644 index 0c5173e..0000000 --- a/scout_sdk/asio/asio/detail/std_global.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// detail/std_global.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STD_GLOBAL_HPP -#define ASIO_DETAIL_STD_GLOBAL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_CALL_ONCE) - -#include -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct std_global_impl -{ - // Helper function to perform initialisation. - static void do_init() - { - instance_.ptr_ = new T; - } - - // Destructor automatically cleans up the global. - ~std_global_impl() - { - delete ptr_; - } - - static std::once_flag init_once_; - static std_global_impl instance_; - T* ptr_; -}; - -template -std::once_flag std_global_impl::init_once_; - -template -std_global_impl std_global_impl::instance_; - -template -T& std_global() -{ - std::call_once(std_global_impl::init_once_, &std_global_impl::do_init); - return *std_global_impl::instance_.ptr_; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_STD_CALL_ONCE) - -#endif // ASIO_DETAIL_STD_GLOBAL_HPP diff --git a/scout_sdk/asio/asio/detail/std_mutex.hpp b/scout_sdk/asio/asio/detail/std_mutex.hpp deleted file mode 100644 index 159049e..0000000 --- a/scout_sdk/asio/asio/detail/std_mutex.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// -// detail/std_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STD_MUTEX_HPP -#define ASIO_DETAIL_STD_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) - -#include -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class std_event; - -class std_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - std_mutex() - { - } - - // Destructor. - ~std_mutex() - { - } - - // Lock the mutex. - void lock() - { - mutex_.lock(); - } - - // Unlock the mutex. - void unlock() - { - mutex_.unlock(); - } - -private: - friend class std_event; - std::mutex mutex_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) - -#endif // ASIO_DETAIL_STD_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/std_static_mutex.hpp b/scout_sdk/asio/asio/detail/std_static_mutex.hpp deleted file mode 100644 index e9c9dc5..0000000 --- a/scout_sdk/asio/asio/detail/std_static_mutex.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// -// detail/std_static_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STD_STATIC_MUTEX_HPP -#define ASIO_DETAIL_STD_STATIC_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) - -#include -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class std_event; - -class std_static_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - std_static_mutex(int) - { - } - - // Destructor. - ~std_static_mutex() - { - } - - // Initialise the mutex. - void init() - { - // Nothing to do. - } - - // Lock the mutex. - void lock() - { - mutex_.lock(); - } - - // Unlock the mutex. - void unlock() - { - mutex_.unlock(); - } - -private: - friend class std_event; - std::mutex mutex_; -}; - -#define ASIO_STD_STATIC_MUTEX_INIT 0 - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR) - -#endif // ASIO_DETAIL_STD_STATIC_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/std_thread.hpp b/scout_sdk/asio/asio/detail/std_thread.hpp deleted file mode 100644 index a240308..0000000 --- a/scout_sdk/asio/asio/detail/std_thread.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// -// detail/std_thread.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STD_THREAD_HPP -#define ASIO_DETAIL_STD_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_THREAD) - -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class std_thread - : private noncopyable -{ -public: - // Constructor. - template - std_thread(Function f, unsigned int = 0) - : thread_(f) - { - } - - // Destructor. - ~std_thread() - { - join(); - } - - // Wait for the thread to exit. - void join() - { - if (thread_.joinable()) - thread_.join(); - } - - // Get number of CPUs. - static std::size_t hardware_concurrency() - { - return std::thread::hardware_concurrency(); - } - -private: - std::thread thread_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_STD_THREAD) - -#endif // ASIO_DETAIL_STD_THREAD_HPP diff --git a/scout_sdk/asio/asio/detail/strand_executor_service.hpp b/scout_sdk/asio/asio/detail/strand_executor_service.hpp deleted file mode 100644 index 67e8427..0000000 --- a/scout_sdk/asio/asio/detail/strand_executor_service.hpp +++ /dev/null @@ -1,142 +0,0 @@ -// -// detail/strand_executor_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STRAND_EXECUTOR_SERVICE_HPP -#define ASIO_DETAIL_STRAND_EXECUTOR_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/atomic_count.hpp" -#include "asio/detail/executor_op.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/scheduler_operation.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Default service implementation for a strand. -class strand_executor_service - : public execution_context_service_base -{ -public: - // The underlying implementation of a strand. - class strand_impl - { - public: - ASIO_DECL ~strand_impl(); - - private: - friend class strand_executor_service; - - // Mutex to protect access to internal data. - mutex* mutex_; - - // Indicates whether the strand is currently "locked" by a handler. This - // means that there is a handler upcall in progress, or that the strand - // itself has been scheduled in order to invoke some pending handlers. - bool locked_; - - // Indicates that the strand has been shut down and will accept no further - // handlers. - bool shutdown_; - - // The handlers that are waiting on the strand but should not be run until - // after the next time the strand is scheduled. This queue must only be - // modified while the mutex is locked. - op_queue waiting_queue_; - - // The handlers that are ready to be run. Logically speaking, these are the - // handlers that hold the strand's lock. The ready queue is only modified - // from within the strand and so may be accessed without locking the mutex. - op_queue ready_queue_; - - // Pointers to adjacent handle implementations in linked list. - strand_impl* next_; - strand_impl* prev_; - - // The strand service in where the implementation is held. - strand_executor_service* service_; - }; - - typedef shared_ptr implementation_type; - - // Construct a new strand service for the specified context. - ASIO_DECL explicit strand_executor_service(execution_context& context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Create a new strand_executor implementation. - ASIO_DECL implementation_type create_implementation(); - - // Request invocation of the given function. - template - static void dispatch(const implementation_type& impl, Executor& ex, - ASIO_MOVE_ARG(Function) function, const Allocator& a); - - // Request invocation of the given function and return immediately. - template - static void post(const implementation_type& impl, Executor& ex, - ASIO_MOVE_ARG(Function) function, const Allocator& a); - - // Request invocation of the given function and return immediately. - template - static void defer(const implementation_type& impl, Executor& ex, - ASIO_MOVE_ARG(Function) function, const Allocator& a); - - // Determine whether the strand is running in the current thread. - ASIO_DECL static bool running_in_this_thread( - const implementation_type& impl); - -private: - friend class strand_impl; - template class invoker; - - // Adds a function to the strand. Returns true if it acquires the lock. - ASIO_DECL static bool enqueue(const implementation_type& impl, - scheduler_operation* op); - - // Mutex to protect access to the service-wide state. - mutex mutex_; - - // Number of mutexes shared between all strand objects. - enum { num_mutexes = 193 }; - - // Pool of mutexes. - scoped_ptr mutexes_[num_mutexes]; - - // Extra value used when hashing to prevent recycled memory locations from - // getting the same mutex. - std::size_t salt_; - - // The head of a linked list of all implementations. - strand_impl* impl_list_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/strand_executor_service.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/strand_executor_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_STRAND_EXECUTOR_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/strand_service.hpp b/scout_sdk/asio/asio/detail/strand_service.hpp deleted file mode 100644 index edc14a0..0000000 --- a/scout_sdk/asio/asio/detail/strand_service.hpp +++ /dev/null @@ -1,142 +0,0 @@ -// -// detail/strand_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STRAND_SERVICE_HPP -#define ASIO_DETAIL_STRAND_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/scoped_ptr.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Default service implementation for a strand. -class strand_service - : public asio::detail::service_base -{ -private: - // Helper class to re-post the strand on exit. - struct on_do_complete_exit; - - // Helper class to re-post the strand on exit. - struct on_dispatch_exit; - -public: - - // The underlying implementation of a strand. - class strand_impl - : public operation - { - public: - strand_impl(); - - private: - // Only this service will have access to the internal values. - friend class strand_service; - friend struct on_do_complete_exit; - friend struct on_dispatch_exit; - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // Indicates whether the strand is currently "locked" by a handler. This - // means that there is a handler upcall in progress, or that the strand - // itself has been scheduled in order to invoke some pending handlers. - bool locked_; - - // The handlers that are waiting on the strand but should not be run until - // after the next time the strand is scheduled. This queue must only be - // modified while the mutex is locked. - op_queue waiting_queue_; - - // The handlers that are ready to be run. Logically speaking, these are the - // handlers that hold the strand's lock. The ready queue is only modified - // from within the strand and so may be accessed without locking the mutex. - op_queue ready_queue_; - }; - - typedef strand_impl* implementation_type; - - // Construct a new strand service for the specified io_context. - ASIO_DECL explicit strand_service(asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Construct a new strand implementation. - ASIO_DECL void construct(implementation_type& impl); - - // Request the io_context to invoke the given handler. - template - void dispatch(implementation_type& impl, Handler& handler); - - // Request the io_context to invoke the given handler and return immediately. - template - void post(implementation_type& impl, Handler& handler); - - // Determine whether the strand is running in the current thread. - ASIO_DECL bool running_in_this_thread( - const implementation_type& impl) const; - -private: - // Helper function to dispatch a handler. Returns true if the handler should - // be dispatched immediately. - ASIO_DECL bool do_dispatch(implementation_type& impl, operation* op); - - // Helper fiunction to post a handler. - ASIO_DECL void do_post(implementation_type& impl, - operation* op, bool is_continuation); - - ASIO_DECL static void do_complete(void* owner, - operation* base, const asio::error_code& ec, - std::size_t bytes_transferred); - - // The io_context implementation used to post completions. - io_context_impl& io_context_; - - // Mutex to protect access to the array of implementations. - asio::detail::mutex mutex_; - - // Number of implementations shared between all strand objects. -#if defined(ASIO_STRAND_IMPLEMENTATIONS) - enum { num_implementations = ASIO_STRAND_IMPLEMENTATIONS }; -#else // defined(ASIO_STRAND_IMPLEMENTATIONS) - enum { num_implementations = 193 }; -#endif // defined(ASIO_STRAND_IMPLEMENTATIONS) - - // Pool of implementations. - scoped_ptr implementations_[num_implementations]; - - // Extra value used when hashing to prevent recycled memory locations from - // getting the same strand implementation. - std::size_t salt_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/strand_service.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/strand_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_STRAND_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/string_view.hpp b/scout_sdk/asio/asio/detail/string_view.hpp deleted file mode 100644 index f09cebc..0000000 --- a/scout_sdk/asio/asio/detail/string_view.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// detail/string_view.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STRING_VIEW_HPP -#define ASIO_DETAIL_STRING_VIEW_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STRING_VIEW) - -#if defined(ASIO_HAS_STD_STRING_VIEW) -# include -#elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) -# include -#else // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) -# error ASIO_HAS_STRING_VIEW is set but no string_view is available -#endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) - -namespace asio { - -#if defined(ASIO_HAS_STD_STRING_VIEW) -using std::basic_string_view; -using std::string_view; -#elif defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) -using std::experimental::basic_string_view; -using std::experimental::string_view; -#endif // defined(ASIO_HAS_STD_EXPERIMENTAL_STRING_VIEW) - -} // namespace asio - -# define ASIO_STRING_VIEW_PARAM asio::string_view -#else // defined(ASIO_HAS_STRING_VIEW) -# define ASIO_STRING_VIEW_PARAM const std::string& -#endif // defined(ASIO_HAS_STRING_VIEW) - -#endif // ASIO_DETAIL_STRING_VIEW_HPP diff --git a/scout_sdk/asio/asio/detail/thread.hpp b/scout_sdk/asio/asio/detail/thread.hpp deleted file mode 100644 index ea556db..0000000 --- a/scout_sdk/asio/asio/detail/thread.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// detail/thread.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_THREAD_HPP -#define ASIO_DETAIL_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) -# include "asio/detail/null_thread.hpp" -#elif defined(ASIO_WINDOWS) -# if defined(UNDER_CE) -# include "asio/detail/wince_thread.hpp" -# elif defined(ASIO_WINDOWS_APP) -# include "asio/detail/winapp_thread.hpp" -# else -# include "asio/detail/win_thread.hpp" -# endif -#elif defined(ASIO_HAS_PTHREADS) -# include "asio/detail/posix_thread.hpp" -#elif defined(ASIO_HAS_STD_THREAD) -# include "asio/detail/std_thread.hpp" -#else -# error Only Windows, POSIX and std::thread are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(ASIO_HAS_THREADS) -typedef null_thread thread; -#elif defined(ASIO_WINDOWS) -# if defined(UNDER_CE) -typedef wince_thread thread; -# elif defined(ASIO_WINDOWS_APP) -typedef winapp_thread thread; -# else -typedef win_thread thread; -# endif -#elif defined(ASIO_HAS_PTHREADS) -typedef posix_thread thread; -#elif defined(ASIO_HAS_STD_THREAD) -typedef std_thread thread; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_THREAD_HPP diff --git a/scout_sdk/asio/asio/detail/thread_context.hpp b/scout_sdk/asio/asio/detail/thread_context.hpp deleted file mode 100644 index 88b4f31..0000000 --- a/scout_sdk/asio/asio/detail/thread_context.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// -// detail/thread_context.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_THREAD_CONTEXT_HPP -#define ASIO_DETAIL_THREAD_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include -#include -#include "asio/detail/call_stack.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class thread_info_base; - -// Base class for things that manage threads (scheduler, win_iocp_io_context). -class thread_context -{ -public: - // Per-thread call stack to track the state of each thread in the context. - typedef call_stack thread_call_stack; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_THREAD_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/detail/thread_group.hpp b/scout_sdk/asio/asio/detail/thread_group.hpp deleted file mode 100644 index 1e400b0..0000000 --- a/scout_sdk/asio/asio/detail/thread_group.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// detail/thread_group.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_THREAD_GROUP_HPP -#define ASIO_DETAIL_THREAD_GROUP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/detail/thread.hpp" - -namespace asio { -namespace detail { - -class thread_group -{ -public: - // Constructor initialises an empty thread group. - thread_group() - : first_(0) - { - } - - // Destructor joins any remaining threads in the group. - ~thread_group() - { - join(); - } - - // Create a new thread in the group. - template - void create_thread(Function f) - { - first_ = new item(f, first_); - } - - // Create new threads in the group. - template - void create_threads(Function f, std::size_t num_threads) - { - for (std::size_t i = 0; i < num_threads; ++i) - create_thread(f); - } - - // Wait for all threads in the group to exit. - void join() - { - while (first_) - { - first_->thread_.join(); - item* tmp = first_; - first_ = first_->next_; - delete tmp; - } - } - -private: - // Structure used to track a single thread in the group. - struct item - { - template - explicit item(Function f, item* next) - : thread_(f), - next_(next) - { - } - - asio::detail::thread thread_; - item* next_; - }; - - // The first thread in the group. - item* first_; -}; - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_THREAD_GROUP_HPP diff --git a/scout_sdk/asio/asio/detail/thread_info_base.hpp b/scout_sdk/asio/asio/detail/thread_info_base.hpp deleted file mode 100644 index 1b22207..0000000 --- a/scout_sdk/asio/asio/detail/thread_info_base.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// detail/thread_info_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_THREAD_INFO_BASE_HPP -#define ASIO_DETAIL_THREAD_INFO_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include -#include -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class thread_info_base - : private noncopyable -{ -public: - struct default_tag - { - enum { mem_index = 0 }; - }; - - struct awaitee_tag - { - enum { mem_index = 1 }; - }; - - thread_info_base() - { - for (int i = 0; i < max_mem_index; ++i) - reusable_memory_[i] = 0; - } - - ~thread_info_base() - { - for (int i = 0; i < max_mem_index; ++i) - if (reusable_memory_[i]) - ::operator delete(reusable_memory_[i]); - } - - static void* allocate(thread_info_base* this_thread, std::size_t size) - { - return allocate(default_tag(), this_thread, size); - } - - static void deallocate(thread_info_base* this_thread, - void* pointer, std::size_t size) - { - deallocate(default_tag(), this_thread, pointer, size); - } - - template - static void* allocate(Purpose, thread_info_base* this_thread, - std::size_t size) - { - std::size_t chunks = (size + chunk_size - 1) / chunk_size; - - if (this_thread && this_thread->reusable_memory_[Purpose::mem_index]) - { - void* const pointer = this_thread->reusable_memory_[Purpose::mem_index]; - this_thread->reusable_memory_[Purpose::mem_index] = 0; - - unsigned char* const mem = static_cast(pointer); - if (static_cast(mem[0]) >= chunks) - { - mem[size] = mem[0]; - return pointer; - } - - ::operator delete(pointer); - } - - void* const pointer = ::operator new(chunks * chunk_size + 1); - unsigned char* const mem = static_cast(pointer); - mem[size] = (chunks <= UCHAR_MAX) ? static_cast(chunks) : 0; - return pointer; - } - - template - static void deallocate(Purpose, thread_info_base* this_thread, - void* pointer, std::size_t size) - { - if (size <= chunk_size * UCHAR_MAX) - { - if (this_thread && this_thread->reusable_memory_[Purpose::mem_index] == 0) - { - unsigned char* const mem = static_cast(pointer); - mem[0] = mem[size]; - this_thread->reusable_memory_[Purpose::mem_index] = pointer; - return; - } - } - - ::operator delete(pointer); - } - -private: - enum { chunk_size = 4 }; - enum { max_mem_index = 2 }; - void* reusable_memory_[max_mem_index]; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_THREAD_INFO_BASE_HPP diff --git a/scout_sdk/asio/asio/detail/throw_error.hpp b/scout_sdk/asio/asio/detail/throw_error.hpp deleted file mode 100644 index 5dd8785..0000000 --- a/scout_sdk/asio/asio/detail/throw_error.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// -// detail/throw_error.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_THROW_ERROR_HPP -#define ASIO_DETAIL_THROW_ERROR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/error_code.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -ASIO_DECL void do_throw_error(const asio::error_code& err); - -ASIO_DECL void do_throw_error(const asio::error_code& err, - const char* location); - -inline void throw_error(const asio::error_code& err) -{ - if (err) - do_throw_error(err); -} - -inline void throw_error(const asio::error_code& err, - const char* location) -{ - if (err) - do_throw_error(err, location); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/throw_error.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_THROW_ERROR_HPP diff --git a/scout_sdk/asio/asio/detail/throw_exception.hpp b/scout_sdk/asio/asio/detail/throw_exception.hpp deleted file mode 100644 index f9f7bfb..0000000 --- a/scout_sdk/asio/asio/detail/throw_exception.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// -// detail/throw_exception.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_THROW_EXCEPTION_HPP -#define ASIO_DETAIL_THROW_EXCEPTION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_THROW_EXCEPTION) -# include -#endif // defined(ASIO_BOOST_THROW_EXCEPTION) - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_BOOST_THROW_EXCEPTION) -using boost::throw_exception; -#else // defined(ASIO_HAS_BOOST_THROW_EXCEPTION) - -// Declare the throw_exception function for all targets. -template -void throw_exception(const Exception& e); - -// Only define the throw_exception function when exceptions are enabled. -// Otherwise, it is up to the application to provide a definition of this -// function. -# if !defined(ASIO_NO_EXCEPTIONS) -template -void throw_exception(const Exception& e) -{ - throw e; -} -# endif // !defined(ASIO_NO_EXCEPTIONS) - -#endif // defined(ASIO_HAS_BOOST_THROW_EXCEPTION) - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_THROW_EXCEPTION_HPP diff --git a/scout_sdk/asio/asio/detail/timer_queue.hpp b/scout_sdk/asio/asio/detail/timer_queue.hpp deleted file mode 100644 index 380e779..0000000 --- a/scout_sdk/asio/asio/detail/timer_queue.hpp +++ /dev/null @@ -1,358 +0,0 @@ -// -// detail/timer_queue.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_QUEUE_HPP -#define ASIO_DETAIL_TIMER_QUEUE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include "asio/detail/cstdint.hpp" -#include "asio/detail/date_time_fwd.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/timer_queue_base.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class timer_queue - : public timer_queue_base -{ -public: - // The time type. - typedef typename Time_Traits::time_type time_type; - - // The duration type. - typedef typename Time_Traits::duration_type duration_type; - - // Per-timer data. - class per_timer_data - { - public: - per_timer_data() : - heap_index_((std::numeric_limits::max)()), - next_(0), prev_(0) - { - } - - private: - friend class timer_queue; - - // The operations waiting on the timer. - op_queue op_queue_; - - // The index of the timer in the heap. - std::size_t heap_index_; - - // Pointers to adjacent timers in a linked list. - per_timer_data* next_; - per_timer_data* prev_; - }; - - // Constructor. - timer_queue() - : timers_(), - heap_() - { - } - - // Add a new timer to the queue. Returns true if this is the timer that is - // earliest in the queue, in which case the reactor's event demultiplexing - // function call may need to be interrupted and restarted. - bool enqueue_timer(const time_type& time, per_timer_data& timer, wait_op* op) - { - // Enqueue the timer object. - if (timer.prev_ == 0 && &timer != timers_) - { - if (this->is_positive_infinity(time)) - { - // No heap entry is required for timers that never expire. - timer.heap_index_ = (std::numeric_limits::max)(); - } - else - { - // Put the new timer at the correct position in the heap. This is done - // first since push_back() can throw due to allocation failure. - timer.heap_index_ = heap_.size(); - heap_entry entry = { time, &timer }; - heap_.push_back(entry); - up_heap(heap_.size() - 1); - } - - // Insert the new timer into the linked list of active timers. - timer.next_ = timers_; - timer.prev_ = 0; - if (timers_) - timers_->prev_ = &timer; - timers_ = &timer; - } - - // Enqueue the individual timer operation. - timer.op_queue_.push(op); - - // Interrupt reactor only if newly added timer is first to expire. - return timer.heap_index_ == 0 && timer.op_queue_.front() == op; - } - - // Whether there are no timers in the queue. - virtual bool empty() const - { - return timers_ == 0; - } - - // Get the time for the timer that is earliest in the queue. - virtual long wait_duration_msec(long max_duration) const - { - if (heap_.empty()) - return max_duration; - - return this->to_msec( - Time_Traits::to_posix_duration( - Time_Traits::subtract(heap_[0].time_, Time_Traits::now())), - max_duration); - } - - // Get the time for the timer that is earliest in the queue. - virtual long wait_duration_usec(long max_duration) const - { - if (heap_.empty()) - return max_duration; - - return this->to_usec( - Time_Traits::to_posix_duration( - Time_Traits::subtract(heap_[0].time_, Time_Traits::now())), - max_duration); - } - - // Dequeue all timers not later than the current time. - virtual void get_ready_timers(op_queue& ops) - { - if (!heap_.empty()) - { - const time_type now = Time_Traits::now(); - while (!heap_.empty() && !Time_Traits::less_than(now, heap_[0].time_)) - { - per_timer_data* timer = heap_[0].timer_; - ops.push(timer->op_queue_); - remove_timer(*timer); - } - } - } - - // Dequeue all timers. - virtual void get_all_timers(op_queue& ops) - { - while (timers_) - { - per_timer_data* timer = timers_; - timers_ = timers_->next_; - ops.push(timer->op_queue_); - timer->next_ = 0; - timer->prev_ = 0; - } - - heap_.clear(); - } - - // Cancel and dequeue operations for the given timer. - std::size_t cancel_timer(per_timer_data& timer, op_queue& ops, - std::size_t max_cancelled = (std::numeric_limits::max)()) - { - std::size_t num_cancelled = 0; - if (timer.prev_ != 0 || &timer == timers_) - { - while (wait_op* op = (num_cancelled != max_cancelled) - ? timer.op_queue_.front() : 0) - { - op->ec_ = asio::error::operation_aborted; - timer.op_queue_.pop(); - ops.push(op); - ++num_cancelled; - } - if (timer.op_queue_.empty()) - remove_timer(timer); - } - return num_cancelled; - } - - // Move operations from one timer to another, empty timer. - void move_timer(per_timer_data& target, per_timer_data& source) - { - target.op_queue_.push(source.op_queue_); - - target.heap_index_ = source.heap_index_; - source.heap_index_ = (std::numeric_limits::max)(); - - if (target.heap_index_ < heap_.size()) - heap_[target.heap_index_].timer_ = ⌖ - - if (timers_ == &source) - timers_ = ⌖ - if (source.prev_) - source.prev_->next_ = ⌖ - if (source.next_) - source.next_->prev_= ⌖ - target.next_ = source.next_; - target.prev_ = source.prev_; - source.next_ = 0; - source.prev_ = 0; - } - -private: - // Move the item at the given index up the heap to its correct position. - void up_heap(std::size_t index) - { - while (index > 0) - { - std::size_t parent = (index - 1) / 2; - if (!Time_Traits::less_than(heap_[index].time_, heap_[parent].time_)) - break; - swap_heap(index, parent); - index = parent; - } - } - - // Move the item at the given index down the heap to its correct position. - void down_heap(std::size_t index) - { - std::size_t child = index * 2 + 1; - while (child < heap_.size()) - { - std::size_t min_child = (child + 1 == heap_.size() - || Time_Traits::less_than( - heap_[child].time_, heap_[child + 1].time_)) - ? child : child + 1; - if (Time_Traits::less_than(heap_[index].time_, heap_[min_child].time_)) - break; - swap_heap(index, min_child); - index = min_child; - child = index * 2 + 1; - } - } - - // Swap two entries in the heap. - void swap_heap(std::size_t index1, std::size_t index2) - { - heap_entry tmp = heap_[index1]; - heap_[index1] = heap_[index2]; - heap_[index2] = tmp; - heap_[index1].timer_->heap_index_ = index1; - heap_[index2].timer_->heap_index_ = index2; - } - - // Remove a timer from the heap and list of timers. - void remove_timer(per_timer_data& timer) - { - // Remove the timer from the heap. - std::size_t index = timer.heap_index_; - if (!heap_.empty() && index < heap_.size()) - { - if (index == heap_.size() - 1) - { - heap_.pop_back(); - } - else - { - swap_heap(index, heap_.size() - 1); - heap_.pop_back(); - if (index > 0 && Time_Traits::less_than( - heap_[index].time_, heap_[(index - 1) / 2].time_)) - up_heap(index); - else - down_heap(index); - } - } - - // Remove the timer from the linked list of active timers. - if (timers_ == &timer) - timers_ = timer.next_; - if (timer.prev_) - timer.prev_->next_ = timer.next_; - if (timer.next_) - timer.next_->prev_= timer.prev_; - timer.next_ = 0; - timer.prev_ = 0; - } - - // Determine if the specified absolute time is positive infinity. - template - static bool is_positive_infinity(const Time_Type&) - { - return false; - } - - // Determine if the specified absolute time is positive infinity. - template - static bool is_positive_infinity( - const boost::date_time::base_time& time) - { - return time.is_pos_infinity(); - } - - // Helper function to convert a duration into milliseconds. - template - long to_msec(const Duration& d, long max_duration) const - { - if (d.ticks() <= 0) - return 0; - int64_t msec = d.total_milliseconds(); - if (msec == 0) - return 1; - if (msec > max_duration) - return max_duration; - return static_cast(msec); - } - - // Helper function to convert a duration into microseconds. - template - long to_usec(const Duration& d, long max_duration) const - { - if (d.ticks() <= 0) - return 0; - int64_t usec = d.total_microseconds(); - if (usec == 0) - return 1; - if (usec > max_duration) - return max_duration; - return static_cast(usec); - } - - // The head of a linked list of all active timers. - per_timer_data* timers_; - - struct heap_entry - { - // The time when the timer should fire. - time_type time_; - - // The associated timer with enqueued operations. - per_timer_data* timer_; - }; - - // The heap of timers, with the earliest timer at the front. - std::vector heap_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TIMER_QUEUE_HPP diff --git a/scout_sdk/asio/asio/detail/timer_queue_base.hpp b/scout_sdk/asio/asio/detail/timer_queue_base.hpp deleted file mode 100644 index 4af995f..0000000 --- a/scout_sdk/asio/asio/detail/timer_queue_base.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// detail/timer_queue_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_QUEUE_BASE_HPP -#define ASIO_DETAIL_TIMER_QUEUE_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class timer_queue_base - : private noncopyable -{ -public: - // Constructor. - timer_queue_base() : next_(0) {} - - // Destructor. - virtual ~timer_queue_base() {} - - // Whether there are no timers in the queue. - virtual bool empty() const = 0; - - // Get the time to wait until the next timer. - virtual long wait_duration_msec(long max_duration) const = 0; - - // Get the time to wait until the next timer. - virtual long wait_duration_usec(long max_duration) const = 0; - - // Dequeue all ready timers. - virtual void get_ready_timers(op_queue& ops) = 0; - - // Dequeue all timers. - virtual void get_all_timers(op_queue& ops) = 0; - -private: - friend class timer_queue_set; - - // Next timer queue in the set. - timer_queue_base* next_; -}; - -template -class timer_queue; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TIMER_QUEUE_BASE_HPP diff --git a/scout_sdk/asio/asio/detail/timer_queue_ptime.hpp b/scout_sdk/asio/asio/detail/timer_queue_ptime.hpp deleted file mode 100644 index 84e8338..0000000 --- a/scout_sdk/asio/asio/detail/timer_queue_ptime.hpp +++ /dev/null @@ -1,99 +0,0 @@ -// -// detail/timer_queue_ptime.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_QUEUE_PTIME_HPP -#define ASIO_DETAIL_TIMER_QUEUE_PTIME_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_DATE_TIME) - -#include "asio/time_traits.hpp" -#include "asio/detail/timer_queue.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct forwarding_posix_time_traits : time_traits {}; - -// Template specialisation for the commonly used instantation. -template <> -class timer_queue > - : public timer_queue_base -{ -public: - // The time type. - typedef boost::posix_time::ptime time_type; - - // The duration type. - typedef boost::posix_time::time_duration duration_type; - - // Per-timer data. - typedef timer_queue::per_timer_data - per_timer_data; - - // Constructor. - ASIO_DECL timer_queue(); - - // Destructor. - ASIO_DECL virtual ~timer_queue(); - - // Add a new timer to the queue. Returns true if this is the timer that is - // earliest in the queue, in which case the reactor's event demultiplexing - // function call may need to be interrupted and restarted. - ASIO_DECL bool enqueue_timer(const time_type& time, - per_timer_data& timer, wait_op* op); - - // Whether there are no timers in the queue. - ASIO_DECL virtual bool empty() const; - - // Get the time for the timer that is earliest in the queue. - ASIO_DECL virtual long wait_duration_msec(long max_duration) const; - - // Get the time for the timer that is earliest in the queue. - ASIO_DECL virtual long wait_duration_usec(long max_duration) const; - - // Dequeue all timers not later than the current time. - ASIO_DECL virtual void get_ready_timers(op_queue& ops); - - // Dequeue all timers. - ASIO_DECL virtual void get_all_timers(op_queue& ops); - - // Cancel and dequeue operations for the given timer. - ASIO_DECL std::size_t cancel_timer( - per_timer_data& timer, op_queue& ops, - std::size_t max_cancelled = (std::numeric_limits::max)()); - - // Move operations from one timer to another, empty timer. - ASIO_DECL void move_timer(per_timer_data& target, - per_timer_data& source); - -private: - timer_queue impl_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/timer_queue_ptime.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - -#endif // ASIO_DETAIL_TIMER_QUEUE_PTIME_HPP diff --git a/scout_sdk/asio/asio/detail/timer_queue_set.hpp b/scout_sdk/asio/asio/detail/timer_queue_set.hpp deleted file mode 100644 index 0ea372a..0000000 --- a/scout_sdk/asio/asio/detail/timer_queue_set.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// detail/timer_queue_set.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_QUEUE_SET_HPP -#define ASIO_DETAIL_TIMER_QUEUE_SET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/timer_queue_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class timer_queue_set -{ -public: - // Constructor. - ASIO_DECL timer_queue_set(); - - // Add a timer queue to the set. - ASIO_DECL void insert(timer_queue_base* q); - - // Remove a timer queue from the set. - ASIO_DECL void erase(timer_queue_base* q); - - // Determine whether all queues are empty. - ASIO_DECL bool all_empty() const; - - // Get the wait duration in milliseconds. - ASIO_DECL long wait_duration_msec(long max_duration) const; - - // Get the wait duration in microseconds. - ASIO_DECL long wait_duration_usec(long max_duration) const; - - // Dequeue all ready timers. - ASIO_DECL void get_ready_timers(op_queue& ops); - - // Dequeue all timers. - ASIO_DECL void get_all_timers(op_queue& ops); - -private: - timer_queue_base* first_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/timer_queue_set.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_DETAIL_TIMER_QUEUE_SET_HPP diff --git a/scout_sdk/asio/asio/detail/timer_scheduler.hpp b/scout_sdk/asio/asio/detail/timer_scheduler.hpp deleted file mode 100644 index b1f8df4..0000000 --- a/scout_sdk/asio/asio/detail/timer_scheduler.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// detail/timer_scheduler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_SCHEDULER_HPP -#define ASIO_DETAIL_TIMER_SCHEDULER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/timer_scheduler_fwd.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/winrt_timer_scheduler.hpp" -#elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_io_context.hpp" -#elif defined(ASIO_HAS_EPOLL) -# include "asio/detail/epoll_reactor.hpp" -#elif defined(ASIO_HAS_KQUEUE) -# include "asio/detail/kqueue_reactor.hpp" -#elif defined(ASIO_HAS_DEV_POLL) -# include "asio/detail/dev_poll_reactor.hpp" -#else -# include "asio/detail/select_reactor.hpp" -#endif - -#endif // ASIO_DETAIL_TIMER_SCHEDULER_HPP diff --git a/scout_sdk/asio/asio/detail/timer_scheduler_fwd.hpp b/scout_sdk/asio/asio/detail/timer_scheduler_fwd.hpp deleted file mode 100644 index 80bae50..0000000 --- a/scout_sdk/asio/asio/detail/timer_scheduler_fwd.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// -// detail/timer_scheduler_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_SCHEDULER_FWD_HPP -#define ASIO_DETAIL_TIMER_SCHEDULER_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -namespace asio { -namespace detail { - -#if defined(ASIO_WINDOWS_RUNTIME) -typedef class winrt_timer_scheduler timer_scheduler; -#elif defined(ASIO_HAS_IOCP) -typedef class win_iocp_io_context timer_scheduler; -#elif defined(ASIO_HAS_EPOLL) -typedef class epoll_reactor timer_scheduler; -#elif defined(ASIO_HAS_KQUEUE) -typedef class kqueue_reactor timer_scheduler; -#elif defined(ASIO_HAS_DEV_POLL) -typedef class dev_poll_reactor timer_scheduler; -#else -typedef class select_reactor timer_scheduler; -#endif - -} // namespace detail -} // namespace asio - -#endif // ASIO_DETAIL_TIMER_SCHEDULER_FWD_HPP diff --git a/scout_sdk/asio/asio/detail/tss_ptr.hpp b/scout_sdk/asio/asio/detail/tss_ptr.hpp deleted file mode 100644 index e628abe..0000000 --- a/scout_sdk/asio/asio/detail/tss_ptr.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// -// detail/tss_ptr.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TSS_PTR_HPP -#define ASIO_DETAIL_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_THREADS) -# include "asio/detail/null_tss_ptr.hpp" -#elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) -# include "asio/detail/keyword_tss_ptr.hpp" -#elif defined(ASIO_WINDOWS) -# include "asio/detail/win_tss_ptr.hpp" -#elif defined(ASIO_HAS_PTHREADS) -# include "asio/detail/posix_tss_ptr.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class tss_ptr -#if !defined(ASIO_HAS_THREADS) - : public null_tss_ptr -#elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) - : public keyword_tss_ptr -#elif defined(ASIO_WINDOWS) - : public win_tss_ptr -#elif defined(ASIO_HAS_PTHREADS) - : public posix_tss_ptr -#endif -{ -public: - void operator=(T* value) - { -#if !defined(ASIO_HAS_THREADS) - null_tss_ptr::operator=(value); -#elif defined(ASIO_HAS_THREAD_KEYWORD_EXTENSION) - keyword_tss_ptr::operator=(value); -#elif defined(ASIO_WINDOWS) - win_tss_ptr::operator=(value); -#elif defined(ASIO_HAS_PTHREADS) - posix_tss_ptr::operator=(value); -#endif - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TSS_PTR_HPP diff --git a/scout_sdk/asio/asio/detail/type_traits.hpp b/scout_sdk/asio/asio/detail/type_traits.hpp deleted file mode 100644 index edf0928..0000000 --- a/scout_sdk/asio/asio/detail/type_traits.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// -// detail/type_traits.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TYPE_TRAITS_HPP -#define ASIO_DETAIL_TYPE_TRAITS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_TYPE_TRAITS) -# include -#else // defined(ASIO_HAS_TYPE_TRAITS) -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -#endif // defined(ASIO_HAS_TYPE_TRAITS) - -namespace asio { - -#if defined(ASIO_HAS_STD_TYPE_TRAITS) -using std::add_const; -using std::conditional; -using std::decay; -using std::enable_if; -using std::false_type; -using std::integral_constant; -using std::is_base_of; -using std::is_class; -using std::is_const; -using std::is_convertible; -using std::is_function; -using std::is_same; -using std::remove_pointer; -using std::remove_reference; -#if defined(ASIO_HAS_STD_INVOKE_RESULT) -template struct result_of; -template -struct result_of : std::invoke_result {}; -#else // defined(ASIO_HAS_STD_INVOKE_RESULT) -using std::result_of; -#endif // defined(ASIO_HAS_STD_INVOKE_RESULT) -using std::true_type; -#else // defined(ASIO_HAS_STD_TYPE_TRAITS) -using boost::add_const; -template -struct enable_if : boost::enable_if_c {}; -using boost::conditional; -using boost::decay; -using boost::false_type; -using boost::integral_constant; -using boost::is_base_of; -using boost::is_class; -using boost::is_const; -using boost::is_convertible; -using boost::is_function; -using boost::is_same; -using boost::remove_pointer; -using boost::remove_reference; -using boost::result_of; -using boost::true_type; -#endif // defined(ASIO_HAS_STD_TYPE_TRAITS) - -} // namespace asio - -#endif // ASIO_DETAIL_TYPE_TRAITS_HPP diff --git a/scout_sdk/asio/asio/detail/variadic_templates.hpp b/scout_sdk/asio/asio/detail/variadic_templates.hpp deleted file mode 100644 index d54eb4e..0000000 --- a/scout_sdk/asio/asio/detail/variadic_templates.hpp +++ /dev/null @@ -1,119 +0,0 @@ -// -// detail/variadic_templates.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_VARIADIC_TEMPLATES_HPP -#define ASIO_DETAIL_VARIADIC_TEMPLATES_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -# define ASIO_VARIADIC_TPARAMS(n) ASIO_VARIADIC_TPARAMS_##n - -# define ASIO_VARIADIC_TPARAMS_1 \ - typename T1 -# define ASIO_VARIADIC_TPARAMS_2 \ - typename T1, typename T2 -# define ASIO_VARIADIC_TPARAMS_3 \ - typename T1, typename T2, typename T3 -# define ASIO_VARIADIC_TPARAMS_4 \ - typename T1, typename T2, typename T3, typename T4 -# define ASIO_VARIADIC_TPARAMS_5 \ - typename T1, typename T2, typename T3, typename T4, typename T5 - -# define ASIO_VARIADIC_TARGS(n) ASIO_VARIADIC_TARGS_##n - -# define ASIO_VARIADIC_TARGS_1 T1 -# define ASIO_VARIADIC_TARGS_2 T1, T2 -# define ASIO_VARIADIC_TARGS_3 T1, T2, T3 -# define ASIO_VARIADIC_TARGS_4 T1, T2, T3, T4 -# define ASIO_VARIADIC_TARGS_5 T1, T2, T3, T4, T5 - -# define ASIO_VARIADIC_BYVAL_PARAMS(n) \ - ASIO_VARIADIC_BYVAL_PARAMS_##n - -# define ASIO_VARIADIC_BYVAL_PARAMS_1 T1 x1 -# define ASIO_VARIADIC_BYVAL_PARAMS_2 T1 x1, T2 x2 -# define ASIO_VARIADIC_BYVAL_PARAMS_3 T1 x1, T2 x2, T3 x3 -# define ASIO_VARIADIC_BYVAL_PARAMS_4 T1 x1, T2 x2, T3 x3, T4 x4 -# define ASIO_VARIADIC_BYVAL_PARAMS_5 T1 x1, T2 x2, T3 x3, T4 x4, T5 x5 - -# define ASIO_VARIADIC_BYVAL_ARGS(n) \ - ASIO_VARIADIC_BYVAL_ARGS_##n - -# define ASIO_VARIADIC_BYVAL_ARGS_1 x1 -# define ASIO_VARIADIC_BYVAL_ARGS_2 x1, x2 -# define ASIO_VARIADIC_BYVAL_ARGS_3 x1, x2, x3 -# define ASIO_VARIADIC_BYVAL_ARGS_4 x1, x2, x3, x4 -# define ASIO_VARIADIC_BYVAL_ARGS_5 x1, x2, x3, x4, x5 - -# define ASIO_VARIADIC_MOVE_PARAMS(n) \ - ASIO_VARIADIC_MOVE_PARAMS_##n - -# define ASIO_VARIADIC_MOVE_PARAMS_1 \ - ASIO_MOVE_ARG(T1) x1 -# define ASIO_VARIADIC_MOVE_PARAMS_2 \ - ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2 -# define ASIO_VARIADIC_MOVE_PARAMS_3 \ - ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2, \ - ASIO_MOVE_ARG(T3) x3 -# define ASIO_VARIADIC_MOVE_PARAMS_4 \ - ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2, \ - ASIO_MOVE_ARG(T3) x3, ASIO_MOVE_ARG(T4) x4 -# define ASIO_VARIADIC_MOVE_PARAMS_5 \ - ASIO_MOVE_ARG(T1) x1, ASIO_MOVE_ARG(T2) x2, \ - ASIO_MOVE_ARG(T3) x3, ASIO_MOVE_ARG(T4) x4, \ - ASIO_MOVE_ARG(T5) x5 - -# define ASIO_VARIADIC_MOVE_ARGS(n) \ - ASIO_VARIADIC_MOVE_ARGS_##n - -# define ASIO_VARIADIC_MOVE_ARGS_1 \ - ASIO_MOVE_CAST(T1)(x1) -# define ASIO_VARIADIC_MOVE_ARGS_2 \ - ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2) -# define ASIO_VARIADIC_MOVE_ARGS_3 \ - ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2), \ - ASIO_MOVE_CAST(T3)(x3) -# define ASIO_VARIADIC_MOVE_ARGS_4 \ - ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2), \ - ASIO_MOVE_CAST(T3)(x3), ASIO_MOVE_CAST(T4)(x4) -# define ASIO_VARIADIC_MOVE_ARGS_5 \ - ASIO_MOVE_CAST(T1)(x1), ASIO_MOVE_CAST(T2)(x2), \ - ASIO_MOVE_CAST(T3)(x3), ASIO_MOVE_CAST(T4)(x4), \ - ASIO_MOVE_CAST(T5)(x5) - -# define ASIO_VARIADIC_DECAY(n) \ - ASIO_VARIADIC_DECAY_##n - -# define ASIO_VARIADIC_DECAY_1 \ - typename decay::type -# define ASIO_VARIADIC_DECAY_2 \ - typename decay::type, typename decay::type -# define ASIO_VARIADIC_DECAY_3 \ - typename decay::type, typename decay::type, \ - typename decay::type -# define ASIO_VARIADIC_DECAY_4 \ - typename decay::type, typename decay::type, \ - typename decay::type, typename decay::type -# define ASIO_VARIADIC_DECAY_5 \ - typename decay::type, typename decay::type, \ - typename decay::type, typename decay::type, \ - typename decay::type - -# define ASIO_VARIADIC_GENERATE(m) m(1) m(2) m(3) m(4) m(5) - -#endif // !defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#endif // ASIO_DETAIL_VARIADIC_TEMPLATES_HPP diff --git a/scout_sdk/asio/asio/detail/wait_handler.hpp b/scout_sdk/asio/asio/detail/wait_handler.hpp deleted file mode 100644 index bd3dc24..0000000 --- a/scout_sdk/asio/asio/detail/wait_handler.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// detail/wait_handler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WAIT_HANDLER_HPP -#define ASIO_DETAIL_WAIT_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class wait_handler : public wait_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(wait_handler); - - wait_handler(Handler& h) - : wait_op(&wait_handler::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(h)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& /*ec*/, - std::size_t /*bytes_transferred*/) - { - // Take ownership of the handler object. - wait_handler* h(static_cast(base)); - ptr p = { asio::detail::addressof(h->handler_), h, h }; - handler_work w(h->handler_); - - ASIO_HANDLER_COMPLETION((*h)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(h->handler_, h->ec_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WAIT_HANDLER_HPP diff --git a/scout_sdk/asio/asio/detail/wait_op.hpp b/scout_sdk/asio/asio/detail/wait_op.hpp deleted file mode 100644 index 1a3017b..0000000 --- a/scout_sdk/asio/asio/detail/wait_op.hpp +++ /dev/null @@ -1,45 +0,0 @@ -// -// detail/wait_op.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WAIT_OP_HPP -#define ASIO_DETAIL_WAIT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class wait_op - : public operation -{ -public: - // The error code to be passed to the completion handler. - asio::error_code ec_; - -protected: - wait_op(func_type func) - : operation(func) - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WAIT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_event.hpp b/scout_sdk/asio/asio/detail/win_event.hpp deleted file mode 100644 index 859cdee..0000000 --- a/scout_sdk/asio/asio/detail/win_event.hpp +++ /dev/null @@ -1,151 +0,0 @@ -// -// detail/win_event.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_EVENT_HPP -#define ASIO_DETAIL_WIN_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include "asio/detail/assert.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_event - : private noncopyable -{ -public: - // Constructor. - ASIO_DECL win_event(); - - // Destructor. - ASIO_DECL ~win_event(); - - // Signal the event. (Retained for backward compatibility.) - template - void signal(Lock& lock) - { - this->signal_all(lock); - } - - // Signal all waiters. - template - void signal_all(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - (void)lock; - state_ |= 1; - ::SetEvent(events_[0]); - } - - // Unlock the mutex and signal one waiter. - template - void unlock_and_signal_one(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - state_ |= 1; - bool have_waiters = (state_ > 1); - lock.unlock(); - if (have_waiters) - ::SetEvent(events_[1]); - } - - // If there's a waiter, unlock the mutex and signal it. - template - bool maybe_unlock_and_signal_one(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - state_ |= 1; - if (state_ > 1) - { - lock.unlock(); - ::SetEvent(events_[1]); - return true; - } - return false; - } - - // Reset the event. - template - void clear(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - (void)lock; - ::ResetEvent(events_[0]); - state_ &= ~std::size_t(1); - } - - // Wait for the event to become signalled. - template - void wait(Lock& lock) - { - ASIO_ASSERT(lock.locked()); - while ((state_ & 1) == 0) - { - state_ += 2; - lock.unlock(); -#if defined(ASIO_WINDOWS_APP) - ::WaitForMultipleObjectsEx(2, events_, false, INFINITE, false); -#else // defined(ASIO_WINDOWS_APP) - ::WaitForMultipleObjects(2, events_, false, INFINITE); -#endif // defined(ASIO_WINDOWS_APP) - lock.lock(); - state_ -= 2; - } - } - - // Timed wait for the event to become signalled. - template - bool wait_for_usec(Lock& lock, long usec) - { - ASIO_ASSERT(lock.locked()); - if ((state_ & 1) == 0) - { - state_ += 2; - lock.unlock(); - DWORD msec = usec > 0 ? (usec < 1000 ? 1 : usec / 1000) : 0; -#if defined(ASIO_WINDOWS_APP) - ::WaitForMultipleObjectsEx(2, events_, false, msec, false); -#else // defined(ASIO_WINDOWS_APP) - ::WaitForMultipleObjects(2, events_, false, msec); -#endif // defined(ASIO_WINDOWS_APP) - lock.lock(); - state_ -= 2; - } - return (state_ & 1) != 0; - } - -private: - HANDLE events_[2]; - std::size_t state_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_event.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_WIN_EVENT_HPP diff --git a/scout_sdk/asio/asio/detail/win_fd_set_adapter.hpp b/scout_sdk/asio/asio/detail/win_fd_set_adapter.hpp deleted file mode 100644 index 8d5e700..0000000 --- a/scout_sdk/asio/asio/detail/win_fd_set_adapter.hpp +++ /dev/null @@ -1,149 +0,0 @@ -// -// detail/win_fd_set_adapter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP -#define ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/reactor_op_queue.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Adapts the FD_SET type to meet the Descriptor_Set concept's requirements. -class win_fd_set_adapter : noncopyable -{ -public: - enum { default_fd_set_size = 1024 }; - - win_fd_set_adapter() - : capacity_(default_fd_set_size), - max_descriptor_(invalid_socket) - { - fd_set_ = static_cast(::operator new( - sizeof(win_fd_set) - sizeof(SOCKET) - + sizeof(SOCKET) * (capacity_))); - fd_set_->fd_count = 0; - } - - ~win_fd_set_adapter() - { - ::operator delete(fd_set_); - } - - void reset() - { - fd_set_->fd_count = 0; - max_descriptor_ = invalid_socket; - } - - bool set(socket_type descriptor) - { - for (u_int i = 0; i < fd_set_->fd_count; ++i) - if (fd_set_->fd_array[i] == descriptor) - return true; - - reserve(fd_set_->fd_count + 1); - fd_set_->fd_array[fd_set_->fd_count++] = descriptor; - return true; - } - - void set(reactor_op_queue& operations, op_queue&) - { - reactor_op_queue::iterator i = operations.begin(); - while (i != operations.end()) - { - reactor_op_queue::iterator op_iter = i++; - reserve(fd_set_->fd_count + 1); - fd_set_->fd_array[fd_set_->fd_count++] = op_iter->first; - } - } - - bool is_set(socket_type descriptor) const - { - return !!__WSAFDIsSet(descriptor, - const_cast(reinterpret_cast(fd_set_))); - } - - operator fd_set*() - { - return reinterpret_cast(fd_set_); - } - - socket_type max_descriptor() const - { - return max_descriptor_; - } - - void perform(reactor_op_queue& operations, - op_queue& ops) const - { - for (u_int i = 0; i < fd_set_->fd_count; ++i) - operations.perform_operations(fd_set_->fd_array[i], ops); - } - -private: - // This structure is defined to be compatible with the Windows API fd_set - // structure, but without being dependent on the value of FD_SETSIZE. We use - // the "struct hack" to allow the number of descriptors to be varied at - // runtime. - struct win_fd_set - { - u_int fd_count; - SOCKET fd_array[1]; - }; - - // Increase the fd_set_ capacity to at least the specified number of elements. - void reserve(u_int n) - { - if (n <= capacity_) - return; - - u_int new_capacity = capacity_ + capacity_ / 2; - if (new_capacity < n) - new_capacity = n; - - win_fd_set* new_fd_set = static_cast(::operator new( - sizeof(win_fd_set) - sizeof(SOCKET) - + sizeof(SOCKET) * (new_capacity))); - - new_fd_set->fd_count = fd_set_->fd_count; - for (u_int i = 0; i < fd_set_->fd_count; ++i) - new_fd_set->fd_array[i] = fd_set_->fd_array[i]; - - ::operator delete(fd_set_); - fd_set_ = new_fd_set; - capacity_ = new_capacity; - } - - win_fd_set* fd_set_; - u_int capacity_; - socket_type max_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#endif // ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP diff --git a/scout_sdk/asio/asio/detail/win_fenced_block.hpp b/scout_sdk/asio/asio/detail/win_fenced_block.hpp deleted file mode 100644 index 1ce6e13..0000000 --- a/scout_sdk/asio/asio/detail/win_fenced_block.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// detail/win_fenced_block.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_FENCED_BLOCK_HPP -#define ASIO_DETAIL_WIN_FENCED_BLOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) && !defined(UNDER_CE) - -#include "asio/detail/socket_types.hpp" -#include "asio/detail/noncopyable.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_fenced_block - : private noncopyable -{ -public: - enum half_t { half }; - enum full_t { full }; - - // Constructor for a half fenced block. - explicit win_fenced_block(half_t) - { - } - - // Constructor for a full fenced block. - explicit win_fenced_block(full_t) - { -#if defined(__BORLANDC__) - LONG barrier = 0; - ::InterlockedExchange(&barrier, 1); -#elif defined(ASIO_MSVC) \ - && ((ASIO_MSVC < 1400) || !defined(MemoryBarrier)) -# if defined(_M_IX86) -# pragma warning(push) -# pragma warning(disable:4793) - LONG barrier; - __asm { xchg barrier, eax } -# pragma warning(pop) -# endif // defined(_M_IX86) -#else - MemoryBarrier(); -#endif - } - - // Destructor. - ~win_fenced_block() - { -#if defined(__BORLANDC__) - LONG barrier = 0; - ::InterlockedExchange(&barrier, 1); -#elif defined(ASIO_MSVC) \ - && ((ASIO_MSVC < 1400) || !defined(MemoryBarrier)) -# if defined(_M_IX86) -# pragma warning(push) -# pragma warning(disable:4793) - LONG barrier; - __asm { xchg barrier, eax } -# pragma warning(pop) -# endif // defined(_M_IX86) -#else - MemoryBarrier(); -#endif - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) && !defined(UNDER_CE) - -#endif // ASIO_DETAIL_WIN_FENCED_BLOCK_HPP diff --git a/scout_sdk/asio/asio/detail/win_global.hpp b/scout_sdk/asio/asio/detail/win_global.hpp deleted file mode 100644 index 3b15a32..0000000 --- a/scout_sdk/asio/asio/detail/win_global.hpp +++ /dev/null @@ -1,73 +0,0 @@ -// -// detail/win_global.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_GLOBAL_HPP -#define ASIO_DETAIL_WIN_GLOBAL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/static_mutex.hpp" -#include "asio/detail/tss_ptr.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -struct win_global_impl -{ - // Destructor automatically cleans up the global. - ~win_global_impl() - { - delete ptr_; - } - - static win_global_impl instance_; - static static_mutex mutex_; - static T* ptr_; - static tss_ptr tss_ptr_; -}; - -template -win_global_impl win_global_impl::instance_ = { 0 }; - -template -static_mutex win_global_impl::mutex_ = ASIO_STATIC_MUTEX_INIT; - -template -T* win_global_impl::ptr_ = 0; - -template -tss_ptr win_global_impl::tss_ptr_; - -template -T& win_global() -{ - if (static_cast(win_global_impl::tss_ptr_) == 0) - { - win_global_impl::mutex_.init(); - static_mutex::scoped_lock lock(win_global_impl::mutex_); - win_global_impl::ptr_ = new T; - win_global_impl::tss_ptr_ = win_global_impl::ptr_; - } - - return *win_global_impl::tss_ptr_; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_GLOBAL_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_handle_read_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_handle_read_op.hpp deleted file mode 100644 index 88e3f6c..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_handle_read_op.hpp +++ /dev/null @@ -1,111 +0,0 @@ -// -// detail/win_iocp_handle_read_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_HANDLE_READ_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_HANDLE_READ_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/error.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_handle_read_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_handle_read_op); - - win_iocp_handle_read_op( - const MutableBufferSequence& buffers, Handler& handler) - : operation(&win_iocp_handle_read_op::do_complete), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t bytes_transferred) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_handle_read_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - if (owner) - { - // Check whether buffers are still valid. - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_HANDLE_EOF) - ec = asio::error::eof; - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - MutableBufferSequence buffers_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_HANDLE_READ_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_handle_service.hpp b/scout_sdk/asio/asio/detail/win_iocp_handle_service.hpp deleted file mode 100644 index 849fe8f..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_handle_service.hpp +++ /dev/null @@ -1,323 +0,0 @@ -// -// detail/win_iocp_handle_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_HANDLE_SERVICE_HPP -#define ASIO_DETAIL_WIN_IOCP_HANDLE_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/cstdint.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/win_iocp_handle_read_op.hpp" -#include "asio/detail/win_iocp_handle_write_op.hpp" -#include "asio/detail/win_iocp_io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_iocp_handle_service : - public service_base -{ -public: - // The native type of a stream handle. - typedef HANDLE native_handle_type; - - // The implementation type of the stream handle. - class implementation_type - { - public: - // Default constructor. - implementation_type() - : handle_(INVALID_HANDLE_VALUE), - safe_cancellation_thread_id_(0), - next_(0), - prev_(0) - { - } - - private: - // Only this service will have access to the internal values. - friend class win_iocp_handle_service; - - // The native stream handle representation. - native_handle_type handle_; - - // The ID of the thread from which it is safe to cancel asynchronous - // operations. 0 means no asynchronous operations have been started yet. - // ~0 means asynchronous operations have been started from more than one - // thread, and cancellation is not supported for the handle. - DWORD safe_cancellation_thread_id_; - - // Pointers to adjacent handle implementations in linked list. - implementation_type* next_; - implementation_type* prev_; - }; - - ASIO_DECL win_iocp_handle_service(asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Construct a new handle implementation. - ASIO_DECL void construct(implementation_type& impl); - - // Move-construct a new handle implementation. - ASIO_DECL void move_construct(implementation_type& impl, - implementation_type& other_impl); - - // Move-assign from another handle implementation. - ASIO_DECL void move_assign(implementation_type& impl, - win_iocp_handle_service& other_service, - implementation_type& other_impl); - - // Destroy a handle implementation. - ASIO_DECL void destroy(implementation_type& impl); - - // Assign a native handle to a handle implementation. - ASIO_DECL asio::error_code assign(implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec); - - // Determine whether the handle is open. - bool is_open(const implementation_type& impl) const - { - return impl.handle_ != INVALID_HANDLE_VALUE; - } - - // Destroy a handle implementation. - ASIO_DECL asio::error_code close(implementation_type& impl, - asio::error_code& ec); - - // Get the native handle representation. - native_handle_type native_handle(const implementation_type& impl) const - { - return impl.handle_; - } - - // Cancel all operations associated with the handle. - ASIO_DECL asio::error_code cancel(implementation_type& impl, - asio::error_code& ec); - - // Write the given data. Returns the number of bytes written. - template - size_t write_some(implementation_type& impl, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return write_some_at(impl, 0, buffers, ec); - } - - // Write the given data at the specified offset. Returns the number of bytes - // written. - template - size_t write_some_at(implementation_type& impl, uint64_t offset, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - asio::const_buffer buffer = - buffer_sequence_adapter::first(buffers); - - return do_write(impl, offset, buffer, ec); - } - - // Start an asynchronous write. The data being written must be valid for the - // lifetime of the asynchronous operation. - template - void async_write_some(implementation_type& impl, - const ConstBufferSequence& buffers, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_handle_write_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(buffers, handler); - - ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, - reinterpret_cast(impl.handle_), "async_write_some")); - - start_write_op(impl, 0, - buffer_sequence_adapter::first(buffers), p.p); - p.v = p.p = 0; - } - - // Start an asynchronous write at a specified offset. The data being written - // must be valid for the lifetime of the asynchronous operation. - template - void async_write_some_at(implementation_type& impl, uint64_t offset, - const ConstBufferSequence& buffers, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_handle_write_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(buffers, handler); - - ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, - reinterpret_cast(impl.handle_), "async_write_some_at")); - - start_write_op(impl, offset, - buffer_sequence_adapter::first(buffers), p.p); - p.v = p.p = 0; - } - - // Read some data. Returns the number of bytes received. - template - size_t read_some(implementation_type& impl, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return read_some_at(impl, 0, buffers, ec); - } - - // Read some data at a specified offset. Returns the number of bytes received. - template - size_t read_some_at(implementation_type& impl, uint64_t offset, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - asio::mutable_buffer buffer = - buffer_sequence_adapter::first(buffers); - - return do_read(impl, offset, buffer, ec); - } - - // Start an asynchronous read. The buffer for the data being received must be - // valid for the lifetime of the asynchronous operation. - template - void async_read_some(implementation_type& impl, - const MutableBufferSequence& buffers, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_handle_read_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(buffers, handler); - - ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, - reinterpret_cast(impl.handle_), "async_read_some")); - - start_read_op(impl, 0, - buffer_sequence_adapter::first(buffers), p.p); - p.v = p.p = 0; - } - - // Start an asynchronous read at a specified offset. The buffer for the data - // being received must be valid for the lifetime of the asynchronous - // operation. - template - void async_read_some_at(implementation_type& impl, uint64_t offset, - const MutableBufferSequence& buffers, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_handle_read_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(buffers, handler); - - ASIO_HANDLER_CREATION((iocp_service_.context(), *p.p, "handle", &impl, - reinterpret_cast(impl.handle_), "async_read_some_at")); - - start_read_op(impl, offset, - buffer_sequence_adapter::first(buffers), p.p); - p.v = p.p = 0; - } - -private: - // Prevent the use of the null_buffers type with this service. - size_t write_some(implementation_type& impl, - const null_buffers& buffers, asio::error_code& ec); - size_t write_some_at(implementation_type& impl, uint64_t offset, - const null_buffers& buffers, asio::error_code& ec); - template - void async_write_some(implementation_type& impl, - const null_buffers& buffers, Handler& handler); - template - void async_write_some_at(implementation_type& impl, uint64_t offset, - const null_buffers& buffers, Handler& handler); - size_t read_some(implementation_type& impl, - const null_buffers& buffers, asio::error_code& ec); - size_t read_some_at(implementation_type& impl, uint64_t offset, - const null_buffers& buffers, asio::error_code& ec); - template - void async_read_some(implementation_type& impl, - const null_buffers& buffers, Handler& handler); - template - void async_read_some_at(implementation_type& impl, uint64_t offset, - const null_buffers& buffers, Handler& handler); - - // Helper class for waiting for synchronous operations to complete. - class overlapped_wrapper; - - // Helper function to perform a synchronous write operation. - ASIO_DECL size_t do_write(implementation_type& impl, - uint64_t offset, const asio::const_buffer& buffer, - asio::error_code& ec); - - // Helper function to start a write operation. - ASIO_DECL void start_write_op(implementation_type& impl, - uint64_t offset, const asio::const_buffer& buffer, - operation* op); - - // Helper function to perform a synchronous write operation. - ASIO_DECL size_t do_read(implementation_type& impl, - uint64_t offset, const asio::mutable_buffer& buffer, - asio::error_code& ec); - - // Helper function to start a read operation. - ASIO_DECL void start_read_op(implementation_type& impl, - uint64_t offset, const asio::mutable_buffer& buffer, - operation* op); - - // Update the ID of the thread from which cancellation is safe. - ASIO_DECL void update_cancellation_thread_id(implementation_type& impl); - - // Helper function to close a handle when the associated object is being - // destroyed. - ASIO_DECL void close_for_destruction(implementation_type& impl); - - // The IOCP service used for running asynchronous operations and dispatching - // handlers. - win_iocp_io_context& iocp_service_; - - // Mutex to protect access to the linked list of implementations. - mutex mutex_; - - // The head of a linked list of all implementations. - implementation_type* impl_list_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_iocp_handle_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_HANDLE_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_handle_write_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_handle_write_op.hpp deleted file mode 100644 index d7bb944..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_handle_write_op.hpp +++ /dev/null @@ -1,103 +0,0 @@ -// -// detail/win_iocp_handle_write_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_HANDLE_WRITE_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_HANDLE_WRITE_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/error.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_handle_write_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_handle_write_op); - - win_iocp_handle_write_op(const ConstBufferSequence& buffers, Handler& handler) - : operation(&win_iocp_handle_write_op::do_complete), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& ec, std::size_t bytes_transferred) - { - // Take ownership of the operation object. - win_iocp_handle_write_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - if (owner) - { - // Check whether buffers are still valid. - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - ConstBufferSequence buffers_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_HANDLE_WRITE_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_io_context.hpp b/scout_sdk/asio/asio/detail/win_iocp_io_context.hpp deleted file mode 100644 index 11bf58b..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_io_context.hpp +++ /dev/null @@ -1,328 +0,0 @@ -// -// detail/win_iocp_io_context.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_IO_CONTEXT_HPP -#define ASIO_DETAIL_WIN_IOCP_IO_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/limits.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/thread.hpp" -#include "asio/detail/thread_context.hpp" -#include "asio/detail/timer_queue_base.hpp" -#include "asio/detail/timer_queue_set.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/detail/win_iocp_operation.hpp" -#include "asio/detail/win_iocp_thread_info.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class wait_op; - -class win_iocp_io_context - : public execution_context_service_base, - public thread_context -{ -public: - // Constructor. Specifies a concurrency hint that is passed through to the - // underlying I/O completion port. - ASIO_DECL win_iocp_io_context(asio::execution_context& ctx, - int concurrency_hint = -1); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Initialise the task. Nothing to do here. - void init_task() - { - } - - // Register a handle with the IO completion port. - ASIO_DECL asio::error_code register_handle( - HANDLE handle, asio::error_code& ec); - - // Run the event loop until stopped or no more work. - ASIO_DECL size_t run(asio::error_code& ec); - - // Run until stopped or one operation is performed. - ASIO_DECL size_t run_one(asio::error_code& ec); - - // Run until timeout, interrupted, or one operation is performed. - ASIO_DECL size_t wait_one(long usec, asio::error_code& ec); - - // Poll for operations without blocking. - ASIO_DECL size_t poll(asio::error_code& ec); - - // Poll for one operation without blocking. - ASIO_DECL size_t poll_one(asio::error_code& ec); - - // Stop the event processing loop. - ASIO_DECL void stop(); - - // Determine whether the io_context is stopped. - bool stopped() const - { - return ::InterlockedExchangeAdd(&stopped_, 0) != 0; - } - - // Restart in preparation for a subsequent run invocation. - void restart() - { - ::InterlockedExchange(&stopped_, 0); - } - - // Notify that some work has started. - void work_started() - { - ::InterlockedIncrement(&outstanding_work_); - } - - // Notify that some work has finished. - void work_finished() - { - if (::InterlockedDecrement(&outstanding_work_) == 0) - stop(); - } - - // Return whether a handler can be dispatched immediately. - bool can_dispatch() - { - return thread_call_stack::contains(this) != 0; - } - - // Request invocation of the given operation and return immediately. Assumes - // that work_started() has not yet been called for the operation. - void post_immediate_completion(win_iocp_operation* op, bool) - { - work_started(); - post_deferred_completion(op); - } - - // Request invocation of the given operation and return immediately. Assumes - // that work_started() was previously called for the operation. - ASIO_DECL void post_deferred_completion(win_iocp_operation* op); - - // Request invocation of the given operation and return immediately. Assumes - // that work_started() was previously called for the operations. - ASIO_DECL void post_deferred_completions( - op_queue& ops); - - // Request invocation of the given operation using the thread-private queue - // and return immediately. Assumes that work_started() has not yet been - // called for the operation. - void post_private_immediate_completion(win_iocp_operation* op) - { - post_immediate_completion(op, false); - } - - // Request invocation of the given operation using the thread-private queue - // and return immediately. Assumes that work_started() was previously called - // for the operation. - void post_private_deferred_completion(win_iocp_operation* op) - { - post_deferred_completion(op); - } - - // Enqueue the given operation following a failed attempt to dispatch the - // operation for immediate invocation. - void do_dispatch(operation* op) - { - post_immediate_completion(op, false); - } - - // Process unfinished operations as part of a shutdown operation. Assumes - // that work_started() was previously called for the operations. - ASIO_DECL void abandon_operations(op_queue& ops); - - // Called after starting an overlapped I/O operation that did not complete - // immediately. The caller must have already called work_started() prior to - // starting the operation. - ASIO_DECL void on_pending(win_iocp_operation* op); - - // Called after starting an overlapped I/O operation that completed - // immediately. The caller must have already called work_started() prior to - // starting the operation. - ASIO_DECL void on_completion(win_iocp_operation* op, - DWORD last_error = 0, DWORD bytes_transferred = 0); - - // Called after starting an overlapped I/O operation that completed - // immediately. The caller must have already called work_started() prior to - // starting the operation. - ASIO_DECL void on_completion(win_iocp_operation* op, - const asio::error_code& ec, DWORD bytes_transferred = 0); - - // Add a new timer queue to the service. - template - void add_timer_queue(timer_queue& timer_queue); - - // Remove a timer queue from the service. - template - void remove_timer_queue(timer_queue& timer_queue); - - // Schedule a new operation in the given timer queue to expire at the - // specified absolute time. - template - void schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op); - - // Cancel the timer associated with the given token. Returns the number of - // handlers that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled = (std::numeric_limits::max)()); - - // Move the timer operations associated with the given timer. - template - void move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& to, - typename timer_queue::per_timer_data& from); - - // Get the concurrency hint that was used to initialise the io_context. - int concurrency_hint() const - { - return concurrency_hint_; - } - -private: -#if defined(WINVER) && (WINVER < 0x0500) - typedef DWORD dword_ptr_t; - typedef ULONG ulong_ptr_t; -#else // defined(WINVER) && (WINVER < 0x0500) - typedef DWORD_PTR dword_ptr_t; - typedef ULONG_PTR ulong_ptr_t; -#endif // defined(WINVER) && (WINVER < 0x0500) - - // Dequeues at most one operation from the I/O completion port, and then - // executes it. Returns the number of operations that were dequeued (i.e. - // either 0 or 1). - ASIO_DECL size_t do_one(DWORD msec, asio::error_code& ec); - - // Helper to calculate the GetQueuedCompletionStatus timeout. - ASIO_DECL static DWORD get_gqcs_timeout(); - - // Helper function to add a new timer queue. - ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); - - // Helper function to remove a timer queue. - ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); - - // Called to recalculate and update the timeout. - ASIO_DECL void update_timeout(); - - // Helper class to call work_finished() on block exit. - struct work_finished_on_block_exit; - - // Helper class for managing a HANDLE. - struct auto_handle - { - HANDLE handle; - auto_handle() : handle(0) {} - ~auto_handle() { if (handle) ::CloseHandle(handle); } - }; - - // The IO completion port used for queueing operations. - auto_handle iocp_; - - // The count of unfinished work. - long outstanding_work_; - - // Flag to indicate whether the event loop has been stopped. - mutable long stopped_; - - // Flag to indicate whether there is an in-flight stop event. Every event - // posted using PostQueuedCompletionStatus consumes non-paged pool, so to - // avoid exhausting this resouce we limit the number of outstanding events. - long stop_event_posted_; - - // Flag to indicate whether the service has been shut down. - long shutdown_; - - enum - { - // Timeout to use with GetQueuedCompletionStatus on older versions of - // Windows. Some versions of windows have a "bug" where a call to - // GetQueuedCompletionStatus can appear stuck even though there are events - // waiting on the queue. Using a timeout helps to work around the issue. - default_gqcs_timeout = 500, - - // Maximum waitable timer timeout, in milliseconds. - max_timeout_msec = 5 * 60 * 1000, - - // Maximum waitable timer timeout, in microseconds. - max_timeout_usec = max_timeout_msec * 1000, - - // Completion key value used to wake up a thread to dispatch timers or - // completed operations. - wake_for_dispatch = 1, - - // Completion key value to indicate that an operation has posted with the - // original last_error and bytes_transferred values stored in the fields of - // the OVERLAPPED structure. - overlapped_contains_result = 2 - }; - - // Timeout to use with GetQueuedCompletionStatus. - const DWORD gqcs_timeout_; - - // Function object for processing timeouts in a background thread. - struct timer_thread_function; - friend struct timer_thread_function; - - // Background thread used for processing timeouts. - scoped_ptr timer_thread_; - - // A waitable timer object used for waiting for timeouts. - auto_handle waitable_timer_; - - // Non-zero if timers or completed operations need to be dispatched. - long dispatch_required_; - - // Mutex for protecting access to the timer queues and completed operations. - mutex dispatch_mutex_; - - // The timer queues. - timer_queue_set timer_queues_; - - // The operations that are ready to dispatch. - op_queue completed_ops_; - - // The concurrency hint used to initialise the io_context. - const int concurrency_hint_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/win_iocp_io_context.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_iocp_io_context.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_IO_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_null_buffers_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_null_buffers_op.hpp deleted file mode 100644 index db70cb2..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_null_buffers_op.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// detail/win_iocp_null_buffers_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_NULL_BUFFERS_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_NULL_BUFFERS_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_null_buffers_op : public reactor_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_null_buffers_op); - - win_iocp_null_buffers_op(socket_ops::weak_cancel_token_type cancel_token, - Handler& handler) - : reactor_op(&win_iocp_null_buffers_op::do_perform, - &win_iocp_null_buffers_op::do_complete), - cancel_token_(cancel_token), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static status do_perform(reactor_op*) - { - return done; - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t bytes_transferred) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_null_buffers_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // The reactor may have stored a result in the operation object. - if (o->ec_) - ec = o->ec_; - - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_NETNAME_DELETED) - { - if (o->cancel_token_.expired()) - ec = asio::error::operation_aborted; - else - ec = asio::error::connection_reset; - } - else if (ec.value() == ERROR_PORT_UNREACHABLE) - { - ec = asio::error::connection_refused; - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - socket_ops::weak_cancel_token_type cancel_token_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_NULL_BUFFERS_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_operation.hpp b/scout_sdk/asio/asio/detail/win_iocp_operation.hpp deleted file mode 100644 index 81d43f0..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_operation.hpp +++ /dev/null @@ -1,96 +0,0 @@ -// -// detail/win_iocp_operation.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_OPERATION_HPP -#define ASIO_DETAIL_WIN_IOCP_OPERATION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/handler_tracking.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/error_code.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_iocp_io_context; - -// Base class for all operations. A function pointer is used instead of virtual -// functions to avoid the associated overhead. -class win_iocp_operation - : public OVERLAPPED - ASIO_ALSO_INHERIT_TRACKED_HANDLER -{ -public: - typedef win_iocp_operation operation_type; - - void complete(void* owner, const asio::error_code& ec, - std::size_t bytes_transferred) - { - func_(owner, this, ec, bytes_transferred); - } - - void destroy() - { - func_(0, this, asio::error_code(), 0); - } - -protected: - typedef void (*func_type)( - void*, win_iocp_operation*, - const asio::error_code&, std::size_t); - - win_iocp_operation(func_type func) - : next_(0), - func_(func) - { - reset(); - } - - // Prevents deletion through this type. - ~win_iocp_operation() - { - } - - void reset() - { - Internal = 0; - InternalHigh = 0; - Offset = 0; - OffsetHigh = 0; - hEvent = 0; - ready_ = 0; - } - -private: - friend class op_queue_access; - friend class win_iocp_io_context; - win_iocp_operation* next_; - func_type func_; - long ready_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_OPERATION_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_overlapped_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_overlapped_op.hpp deleted file mode 100644 index 2b2cc31..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_overlapped_op.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// detail/win_iocp_overlapped_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_OVERLAPPED_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_OVERLAPPED_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/error.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_overlapped_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_overlapped_op); - - win_iocp_overlapped_op(Handler& handler) - : operation(&win_iocp_overlapped_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& ec, std::size_t bytes_transferred) - { - // Take ownership of the operation object. - win_iocp_overlapped_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_OVERLAPPED_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_overlapped_ptr.hpp b/scout_sdk/asio/asio/detail/win_iocp_overlapped_ptr.hpp deleted file mode 100644 index 7a19114..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_overlapped_ptr.hpp +++ /dev/null @@ -1,143 +0,0 @@ -// -// detail/win_iocp_overlapped_ptr.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_OVERLAPPED_PTR_HPP -#define ASIO_DETAIL_WIN_IOCP_OVERLAPPED_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/io_context.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/win_iocp_overlapped_op.hpp" -#include "asio/detail/win_iocp_io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Wraps a handler to create an OVERLAPPED object for use with overlapped I/O. -class win_iocp_overlapped_ptr - : private noncopyable -{ -public: - // Construct an empty win_iocp_overlapped_ptr. - win_iocp_overlapped_ptr() - : ptr_(0), - iocp_service_(0) - { - } - - // Construct an win_iocp_overlapped_ptr to contain the specified handler. - template - explicit win_iocp_overlapped_ptr( - asio::io_context& io_context, ASIO_MOVE_ARG(Handler) handler) - : ptr_(0), - iocp_service_(0) - { - this->reset(io_context, ASIO_MOVE_CAST(Handler)(handler)); - } - - // Destructor automatically frees the OVERLAPPED object unless released. - ~win_iocp_overlapped_ptr() - { - reset(); - } - - // Reset to empty. - void reset() - { - if (ptr_) - { - ptr_->destroy(); - ptr_ = 0; - iocp_service_->work_finished(); - iocp_service_ = 0; - } - } - - // Reset to contain the specified handler, freeing any current OVERLAPPED - // object. - template - void reset(asio::io_context& io_context, Handler handler) - { - typedef win_iocp_overlapped_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((io_context, *p.p, - "io_context", &io_context.impl_, 0, "overlapped")); - - io_context.impl_.work_started(); - reset(); - ptr_ = p.p; - p.v = p.p = 0; - iocp_service_ = &io_context.impl_; - } - - // Get the contained OVERLAPPED object. - OVERLAPPED* get() - { - return ptr_; - } - - // Get the contained OVERLAPPED object. - const OVERLAPPED* get() const - { - return ptr_; - } - - // Release ownership of the OVERLAPPED object. - OVERLAPPED* release() - { - if (ptr_) - iocp_service_->on_pending(ptr_); - - OVERLAPPED* tmp = ptr_; - ptr_ = 0; - iocp_service_ = 0; - return tmp; - } - - // Post completion notification for overlapped operation. Releases ownership. - void complete(const asio::error_code& ec, - std::size_t bytes_transferred) - { - if (ptr_) - { - iocp_service_->on_completion(ptr_, ec, - static_cast(bytes_transferred)); - ptr_ = 0; - iocp_service_ = 0; - } - } - -private: - win_iocp_operation* ptr_; - win_iocp_io_context* iocp_service_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_OVERLAPPED_PTR_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_serial_port_service.hpp b/scout_sdk/asio/asio/detail/win_iocp_serial_port_service.hpp deleted file mode 100644 index ac06348..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_serial_port_service.hpp +++ /dev/null @@ -1,230 +0,0 @@ -// -// detail/win_iocp_serial_port_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SERIAL_PORT_SERVICE_HPP -#define ASIO_DETAIL_WIN_IOCP_SERIAL_PORT_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) - -#include -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/win_iocp_handle_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Extend win_iocp_handle_service to provide serial port support. -class win_iocp_serial_port_service : - public service_base -{ -public: - // The native type of a serial port. - typedef win_iocp_handle_service::native_handle_type native_handle_type; - - // The implementation type of the serial port. - typedef win_iocp_handle_service::implementation_type implementation_type; - - // Constructor. - ASIO_DECL win_iocp_serial_port_service( - asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Construct a new serial port implementation. - void construct(implementation_type& impl) - { - handle_service_.construct(impl); - } - - // Move-construct a new serial port implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - handle_service_.move_construct(impl, other_impl); - } - - // Move-assign from another serial port implementation. - void move_assign(implementation_type& impl, - win_iocp_serial_port_service& other_service, - implementation_type& other_impl) - { - handle_service_.move_assign(impl, - other_service.handle_service_, other_impl); - } - - // Destroy a serial port implementation. - void destroy(implementation_type& impl) - { - handle_service_.destroy(impl); - } - - // Open the serial port using the specified device name. - ASIO_DECL asio::error_code open(implementation_type& impl, - const std::string& device, asio::error_code& ec); - - // Assign a native handle to a serial port implementation. - asio::error_code assign(implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec) - { - return handle_service_.assign(impl, handle, ec); - } - - // Determine whether the serial port is open. - bool is_open(const implementation_type& impl) const - { - return handle_service_.is_open(impl); - } - - // Destroy a serial port implementation. - asio::error_code close(implementation_type& impl, - asio::error_code& ec) - { - return handle_service_.close(impl, ec); - } - - // Get the native serial port representation. - native_handle_type native_handle(implementation_type& impl) - { - return handle_service_.native_handle(impl); - } - - // Cancel all operations associated with the handle. - asio::error_code cancel(implementation_type& impl, - asio::error_code& ec) - { - return handle_service_.cancel(impl, ec); - } - - // Set an option on the serial port. - template - asio::error_code set_option(implementation_type& impl, - const SettableSerialPortOption& option, asio::error_code& ec) - { - return do_set_option(impl, - &win_iocp_serial_port_service::store_option, - &option, ec); - } - - // Get an option from the serial port. - template - asio::error_code get_option(const implementation_type& impl, - GettableSerialPortOption& option, asio::error_code& ec) const - { - return do_get_option(impl, - &win_iocp_serial_port_service::load_option, - &option, ec); - } - - // Send a break sequence to the serial port. - asio::error_code send_break(implementation_type&, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Write the given data. Returns the number of bytes sent. - template - size_t write_some(implementation_type& impl, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return handle_service_.write_some(impl, buffers, ec); - } - - // Start an asynchronous write. The data being written must be valid for the - // lifetime of the asynchronous operation. - template - void async_write_some(implementation_type& impl, - const ConstBufferSequence& buffers, Handler& handler) - { - handle_service_.async_write_some(impl, buffers, handler); - } - - // Read some data. Returns the number of bytes received. - template - size_t read_some(implementation_type& impl, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return handle_service_.read_some(impl, buffers, ec); - } - - // Start an asynchronous read. The buffer for the data being received must be - // valid for the lifetime of the asynchronous operation. - template - void async_read_some(implementation_type& impl, - const MutableBufferSequence& buffers, Handler& handler) - { - handle_service_.async_read_some(impl, buffers, handler); - } - -private: - // Function pointer type for storing a serial port option. - typedef asio::error_code (*store_function_type)( - const void*, ::DCB&, asio::error_code&); - - // Helper function template to store a serial port option. - template - static asio::error_code store_option(const void* option, - ::DCB& storage, asio::error_code& ec) - { - static_cast(option)->store(storage, ec); - return ec; - } - - // Helper function to set a serial port option. - ASIO_DECL asio::error_code do_set_option( - implementation_type& impl, store_function_type store, - const void* option, asio::error_code& ec); - - // Function pointer type for loading a serial port option. - typedef asio::error_code (*load_function_type)( - void*, const ::DCB&, asio::error_code&); - - // Helper function template to load a serial port option. - template - static asio::error_code load_option(void* option, - const ::DCB& storage, asio::error_code& ec) - { - static_cast(option)->load(storage, ec); - return ec; - } - - // Helper function to get a serial port option. - ASIO_DECL asio::error_code do_get_option( - const implementation_type& impl, load_function_type load, - void* option, asio::error_code& ec) const; - - // The implementation used for initiating asynchronous operations. - win_iocp_handle_service handle_service_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_iocp_serial_port_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_IOCP) && defined(ASIO_HAS_SERIAL_PORT) - -#endif // ASIO_DETAIL_WIN_IOCP_SERIAL_PORT_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_accept_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_accept_op.hpp deleted file mode 100644 index 18e7335..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_accept_op.hpp +++ /dev/null @@ -1,297 +0,0 @@ -// -// detail/win_iocp_socket_accept_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_ACCEPT_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_ACCEPT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/win_iocp_socket_service_base.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_socket_accept_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_accept_op); - - win_iocp_socket_accept_op(win_iocp_socket_service_base& socket_service, - socket_type socket, Socket& peer, const Protocol& protocol, - typename Protocol::endpoint* peer_endpoint, - bool enable_connection_aborted, Handler& handler) - : operation(&win_iocp_socket_accept_op::do_complete), - socket_service_(socket_service), - socket_(socket), - peer_(peer), - protocol_(protocol), - peer_endpoint_(peer_endpoint), - enable_connection_aborted_(enable_connection_aborted), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - socket_holder& new_socket() - { - return new_socket_; - } - - void* output_buffer() - { - return output_buffer_; - } - - DWORD address_length() - { - return sizeof(sockaddr_storage_type) + 16; - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t /*bytes_transferred*/) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_socket_accept_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - if (owner) - { - typename Protocol::endpoint peer_endpoint; - std::size_t addr_len = peer_endpoint.capacity(); - socket_ops::complete_iocp_accept(o->socket_, - o->output_buffer(), o->address_length(), - peer_endpoint.data(), &addr_len, - o->new_socket_.get(), ec); - - // Restart the accept operation if we got the connection_aborted error - // and the enable_connection_aborted socket option is not set. - if (ec == asio::error::connection_aborted - && !o->enable_connection_aborted_) - { - o->reset(); - o->socket_service_.restart_accept_op(o->socket_, - o->new_socket_, o->protocol_.family(), - o->protocol_.type(), o->protocol_.protocol(), - o->output_buffer(), o->address_length(), o); - p.v = p.p = 0; - return; - } - - // If the socket was successfully accepted, transfer ownership of the - // socket to the peer object. - if (!ec) - { - o->peer_.assign(o->protocol_, - typename Socket::native_handle_type( - o->new_socket_.get(), peer_endpoint), ec); - if (!ec) - o->new_socket_.release(); - } - - // Pass endpoint back to caller. - if (o->peer_endpoint_) - *o->peer_endpoint_ = peer_endpoint; - } - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(o->handler_, ec); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - win_iocp_socket_service_base& socket_service_; - socket_type socket_; - socket_holder new_socket_; - Socket& peer_; - Protocol protocol_; - typename Protocol::endpoint* peer_endpoint_; - unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2]; - bool enable_connection_aborted_; - Handler handler_; -}; - -#if defined(ASIO_HAS_MOVE) - -template -class win_iocp_socket_move_accept_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_move_accept_op); - - win_iocp_socket_move_accept_op( - win_iocp_socket_service_base& socket_service, socket_type socket, - const Protocol& protocol, asio::io_context& peer_io_context, - typename Protocol::endpoint* peer_endpoint, - bool enable_connection_aborted, Handler& handler) - : operation(&win_iocp_socket_move_accept_op::do_complete), - socket_service_(socket_service), - socket_(socket), - peer_(peer_io_context), - protocol_(protocol), - peer_endpoint_(peer_endpoint), - enable_connection_aborted_(enable_connection_aborted), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - socket_holder& new_socket() - { - return new_socket_; - } - - void* output_buffer() - { - return output_buffer_; - } - - DWORD address_length() - { - return sizeof(sockaddr_storage_type) + 16; - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t /*bytes_transferred*/) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_socket_move_accept_op* o( - static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - if (owner) - { - typename Protocol::endpoint peer_endpoint; - std::size_t addr_len = peer_endpoint.capacity(); - socket_ops::complete_iocp_accept(o->socket_, - o->output_buffer(), o->address_length(), - peer_endpoint.data(), &addr_len, - o->new_socket_.get(), ec); - - // Restart the accept operation if we got the connection_aborted error - // and the enable_connection_aborted socket option is not set. - if (ec == asio::error::connection_aborted - && !o->enable_connection_aborted_) - { - o->reset(); - o->socket_service_.restart_accept_op(o->socket_, - o->new_socket_, o->protocol_.family(), - o->protocol_.type(), o->protocol_.protocol(), - o->output_buffer(), o->address_length(), o); - p.v = p.p = 0; - return; - } - - // If the socket was successfully accepted, transfer ownership of the - // socket to the peer object. - if (!ec) - { - o->peer_.assign(o->protocol_, - typename Protocol::socket::native_handle_type( - o->new_socket_.get(), peer_endpoint), ec); - if (!ec) - o->new_socket_.release(); - } - - // Pass endpoint back to caller. - if (o->peer_endpoint_) - *o->peer_endpoint_ = peer_endpoint; - } - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::move_binder2 - handler(0, ASIO_MOVE_CAST(Handler)(o->handler_), ec, - ASIO_MOVE_CAST(typename Protocol::socket)(o->peer_)); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - win_iocp_socket_service_base& socket_service_; - socket_type socket_; - socket_holder new_socket_; - typename Protocol::socket peer_; - Protocol protocol_; - typename Protocol::endpoint* peer_endpoint_; - unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2]; - bool enable_connection_aborted_; - Handler handler_; -}; - -#endif // defined(ASIO_HAS_MOVE) - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_ACCEPT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_connect_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_connect_op.hpp deleted file mode 100644 index e0c52dc..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_connect_op.hpp +++ /dev/null @@ -1,127 +0,0 @@ -// -// detail/win_iocp_socket_connect_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_iocp_socket_connect_op_base : public reactor_op -{ -public: - win_iocp_socket_connect_op_base(socket_type socket, func_type complete_func) - : reactor_op(&win_iocp_socket_connect_op_base::do_perform, complete_func), - socket_(socket), - connect_ex_(false) - { - } - - static status do_perform(reactor_op* base) - { - win_iocp_socket_connect_op_base* o( - static_cast(base)); - - return socket_ops::non_blocking_connect( - o->socket_, o->ec_) ? done : not_done; - } - - socket_type socket_; - bool connect_ex_; -}; - -template -class win_iocp_socket_connect_op : public win_iocp_socket_connect_op_base -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_connect_op); - - win_iocp_socket_connect_op(socket_type socket, Handler& handler) - : win_iocp_socket_connect_op_base(socket, - &win_iocp_socket_connect_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t /*bytes_transferred*/) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_socket_connect_op* o( - static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - if (owner) - { - if (o->connect_ex_) - socket_ops::complete_iocp_connect(o->socket_, ec); - else - ec = o->ec_; - } - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(o->handler_, ec); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_CONNECT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_recv_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_recv_op.hpp deleted file mode 100644 index 4159540..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_recv_op.hpp +++ /dev/null @@ -1,117 +0,0 @@ -// -// detail/win_iocp_socket_recv_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_socket_recv_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recv_op); - - win_iocp_socket_recv_op(socket_ops::state_type state, - socket_ops::weak_cancel_token_type cancel_token, - const MutableBufferSequence& buffers, Handler& handler) - : operation(&win_iocp_socket_recv_op::do_complete), - state_(state), - cancel_token_(cancel_token), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t bytes_transferred) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_socket_recv_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - // Check whether buffers are still valid. - if (owner) - { - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - socket_ops::complete_iocp_recv(o->state_, o->cancel_token_, - buffer_sequence_adapter::all_empty(o->buffers_), - ec, bytes_transferred); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - socket_ops::state_type state_; - socket_ops::weak_cancel_token_type cancel_token_; - MutableBufferSequence buffers_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_RECV_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_recvfrom_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_recvfrom_op.hpp deleted file mode 100644 index 843ce5b..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_recvfrom_op.hpp +++ /dev/null @@ -1,125 +0,0 @@ -// -// detail/win_iocp_socket_recvfrom_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_socket_recvfrom_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recvfrom_op); - - win_iocp_socket_recvfrom_op(Endpoint& endpoint, - socket_ops::weak_cancel_token_type cancel_token, - const MutableBufferSequence& buffers, Handler& handler) - : operation(&win_iocp_socket_recvfrom_op::do_complete), - endpoint_(endpoint), - endpoint_size_(static_cast(endpoint.capacity())), - cancel_token_(cancel_token), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - int& endpoint_size() - { - return endpoint_size_; - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t bytes_transferred) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_socket_recvfrom_op* o( - static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - // Check whether buffers are still valid. - if (owner) - { - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - socket_ops::complete_iocp_recvfrom(o->cancel_token_, ec); - - // Record the size of the endpoint returned by the operation. - o->endpoint_.resize(o->endpoint_size_); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Endpoint& endpoint_; - int endpoint_size_; - socket_ops::weak_cancel_token_type cancel_token_; - MutableBufferSequence buffers_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_RECVFROM_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_recvmsg_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_recvmsg_op.hpp deleted file mode 100644 index 78f36b7..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_recvmsg_op.hpp +++ /dev/null @@ -1,118 +0,0 @@ -// -// detail/win_iocp_socket_recvmsg_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_RECVMSG_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_RECVMSG_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" -#include "asio/socket_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_socket_recvmsg_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_recvmsg_op); - - win_iocp_socket_recvmsg_op( - socket_ops::weak_cancel_token_type cancel_token, - const MutableBufferSequence& buffers, - socket_base::message_flags& out_flags, Handler& handler) - : operation(&win_iocp_socket_recvmsg_op::do_complete), - cancel_token_(cancel_token), - buffers_(buffers), - out_flags_(out_flags), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t bytes_transferred) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_socket_recvmsg_op* o( - static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - // Check whether buffers are still valid. - if (owner) - { - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - socket_ops::complete_iocp_recvmsg(o->cancel_token_, ec); - o->out_flags_ = 0; - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - socket_ops::weak_cancel_token_type cancel_token_; - MutableBufferSequence buffers_; - socket_base::message_flags& out_flags_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_RECVMSG_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_send_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_send_op.hpp deleted file mode 100644 index e1c7ab9..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_send_op.hpp +++ /dev/null @@ -1,111 +0,0 @@ -// -// detail/win_iocp_socket_send_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_SEND_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_SEND_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_socket_send_op : public operation -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_socket_send_op); - - win_iocp_socket_send_op(socket_ops::weak_cancel_token_type cancel_token, - const ConstBufferSequence& buffers, Handler& handler) - : operation(&win_iocp_socket_send_op::do_complete), - cancel_token_(cancel_token), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t bytes_transferred) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_socket_send_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - // Check whether buffers are still valid. - if (owner) - { - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - socket_ops::complete_iocp_send(o->cancel_token_, ec); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, ec, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - socket_ops::weak_cancel_token_type cancel_token_; - ConstBufferSequence buffers_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_SEND_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_service.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_service.hpp deleted file mode 100644 index 3f01b4d..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_service.hpp +++ /dev/null @@ -1,599 +0,0 @@ -// -// detail/win_iocp_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/win_iocp_io_context.hpp" -#include "asio/detail/win_iocp_null_buffers_op.hpp" -#include "asio/detail/win_iocp_socket_accept_op.hpp" -#include "asio/detail/win_iocp_socket_connect_op.hpp" -#include "asio/detail/win_iocp_socket_recvfrom_op.hpp" -#include "asio/detail/win_iocp_socket_send_op.hpp" -#include "asio/detail/win_iocp_socket_service_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_socket_service : - public service_base >, - public win_iocp_socket_service_base -{ -public: - // The protocol type. - typedef Protocol protocol_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The native type of a socket. - class native_handle_type - { - public: - native_handle_type(socket_type s) - : socket_(s), - have_remote_endpoint_(false) - { - } - - native_handle_type(socket_type s, const endpoint_type& ep) - : socket_(s), - have_remote_endpoint_(true), - remote_endpoint_(ep) - { - } - - void operator=(socket_type s) - { - socket_ = s; - have_remote_endpoint_ = false; - remote_endpoint_ = endpoint_type(); - } - - operator socket_type() const - { - return socket_; - } - - bool have_remote_endpoint() const - { - return have_remote_endpoint_; - } - - endpoint_type remote_endpoint() const - { - return remote_endpoint_; - } - - private: - socket_type socket_; - bool have_remote_endpoint_; - endpoint_type remote_endpoint_; - }; - - // The implementation type of the socket. - struct implementation_type : - win_iocp_socket_service_base::base_implementation_type - { - // Default constructor. - implementation_type() - : protocol_(endpoint_type().protocol()), - have_remote_endpoint_(false), - remote_endpoint_() - { - } - - // The protocol associated with the socket. - protocol_type protocol_; - - // Whether we have a cached remote endpoint. - bool have_remote_endpoint_; - - // A cached remote endpoint. - endpoint_type remote_endpoint_; - }; - - // Constructor. - win_iocp_socket_service(asio::io_context& io_context) - : service_base >(io_context), - win_iocp_socket_service_base(io_context) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - this->base_shutdown(); - } - - // Move-construct a new socket implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - this->base_move_construct(impl, other_impl); - - impl.protocol_ = other_impl.protocol_; - other_impl.protocol_ = endpoint_type().protocol(); - - impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_; - other_impl.have_remote_endpoint_ = false; - - impl.remote_endpoint_ = other_impl.remote_endpoint_; - other_impl.remote_endpoint_ = endpoint_type(); - } - - // Move-assign from another socket implementation. - void move_assign(implementation_type& impl, - win_iocp_socket_service_base& other_service, - implementation_type& other_impl) - { - this->base_move_assign(impl, other_service, other_impl); - - impl.protocol_ = other_impl.protocol_; - other_impl.protocol_ = endpoint_type().protocol(); - - impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_; - other_impl.have_remote_endpoint_ = false; - - impl.remote_endpoint_ = other_impl.remote_endpoint_; - other_impl.remote_endpoint_ = endpoint_type(); - } - - // Move-construct a new socket implementation from another protocol type. - template - void converting_move_construct(implementation_type& impl, - win_iocp_socket_service&, - typename win_iocp_socket_service< - Protocol1>::implementation_type& other_impl) - { - this->base_move_construct(impl, other_impl); - - impl.protocol_ = protocol_type(other_impl.protocol_); - other_impl.protocol_ = typename Protocol1::endpoint().protocol(); - - impl.have_remote_endpoint_ = other_impl.have_remote_endpoint_; - other_impl.have_remote_endpoint_ = false; - - impl.remote_endpoint_ = other_impl.remote_endpoint_; - other_impl.remote_endpoint_ = typename Protocol1::endpoint(); - } - - // Open a new socket implementation. - asio::error_code open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - if (!do_open(impl, protocol.family(), - protocol.type(), protocol.protocol(), ec)) - { - impl.protocol_ = protocol; - impl.have_remote_endpoint_ = false; - impl.remote_endpoint_ = endpoint_type(); - } - return ec; - } - - // Assign a native socket to a socket implementation. - asio::error_code assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_socket, - asio::error_code& ec) - { - if (!do_assign(impl, protocol.type(), native_socket, ec)) - { - impl.protocol_ = protocol; - impl.have_remote_endpoint_ = native_socket.have_remote_endpoint(); - impl.remote_endpoint_ = native_socket.remote_endpoint(); - } - return ec; - } - - // Get the native socket representation. - native_handle_type native_handle(implementation_type& impl) - { - if (impl.have_remote_endpoint_) - return native_handle_type(impl.socket_, impl.remote_endpoint_); - return native_handle_type(impl.socket_); - } - - // Bind the socket to the specified local endpoint. - asio::error_code bind(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - socket_ops::bind(impl.socket_, endpoint.data(), endpoint.size(), ec); - return ec; - } - - // Set a socket option. - template - asio::error_code set_option(implementation_type& impl, - const Option& option, asio::error_code& ec) - { - socket_ops::setsockopt(impl.socket_, impl.state_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), option.size(impl.protocol_), ec); - return ec; - } - - // Set a socket option. - template - asio::error_code get_option(const implementation_type& impl, - Option& option, asio::error_code& ec) const - { - std::size_t size = option.size(impl.protocol_); - socket_ops::getsockopt(impl.socket_, impl.state_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), &size, ec); - if (!ec) - option.resize(impl.protocol_, size); - return ec; - } - - // Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - endpoint_type endpoint; - std::size_t addr_len = endpoint.capacity(); - if (socket_ops::getsockname(impl.socket_, endpoint.data(), &addr_len, ec)) - return endpoint_type(); - endpoint.resize(addr_len); - return endpoint; - } - - // Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - endpoint_type endpoint = impl.remote_endpoint_; - std::size_t addr_len = endpoint.capacity(); - if (socket_ops::getpeername(impl.socket_, endpoint.data(), - &addr_len, impl.have_remote_endpoint_, ec)) - return endpoint_type(); - endpoint.resize(addr_len); - return endpoint; - } - - // Disable sends or receives on the socket. - asio::error_code shutdown(base_implementation_type& impl, - socket_base::shutdown_type what, asio::error_code& ec) - { - socket_ops::shutdown(impl.socket_, what, ec); - return ec; - } - - // Send a datagram to the specified endpoint. Returns the number of bytes - // sent. - template - size_t send_to(implementation_type& impl, const ConstBufferSequence& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_sendto(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), flags, - destination.data(), destination.size(), ec); - } - - // Wait until data can be sent without blocking. - size_t send_to(implementation_type& impl, const null_buffers&, - const endpoint_type&, socket_base::message_flags, - asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); - - return 0; - } - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send_to(implementation_type& impl, - const ConstBufferSequence& buffers, const endpoint_type& destination, - socket_base::message_flags flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_send_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, buffers, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_send_to")); - - buffer_sequence_adapter bufs(buffers); - - start_send_to_op(impl, bufs.buffers(), bufs.count(), - destination.data(), static_cast(destination.size()), - flags, p.p); - p.v = p.p = 0; - } - - // Start an asynchronous wait until data can be sent without blocking. - template - void async_send_to(implementation_type& impl, const null_buffers&, - const endpoint_type&, socket_base::message_flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_send_to(null_buffers)")); - - start_reactor_op(impl, select_reactor::write_op, p.p); - p.v = p.p = 0; - } - - // Receive a datagram with the endpoint of the sender. Returns the number of - // bytes received. - template - size_t receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - std::size_t addr_len = sender_endpoint.capacity(); - std::size_t bytes_recvd = socket_ops::sync_recvfrom( - impl.socket_, impl.state_, bufs.buffers(), bufs.count(), - flags, sender_endpoint.data(), &addr_len, ec); - - if (!ec) - sender_endpoint.resize(addr_len); - - return bytes_recvd; - } - - // Wait until data can be received without blocking. - size_t receive_from(implementation_type& impl, - const null_buffers&, endpoint_type& sender_endpoint, - socket_base::message_flags, asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - - // Reset endpoint since it can be given no sensible value at this time. - sender_endpoint = endpoint_type(); - - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received and - // the sender_endpoint object must both be valid for the lifetime of the - // asynchronous operation. - template - void async_receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, endpoint_type& sender_endp, - socket_base::message_flags flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_recvfrom_op< - MutableBufferSequence, endpoint_type, Handler> op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(sender_endp, impl.cancel_token_, buffers, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_receive_from")); - - buffer_sequence_adapter bufs(buffers); - - start_receive_from_op(impl, bufs.buffers(), bufs.count(), - sender_endp.data(), flags, &p.p->endpoint_size(), p.p); - p.v = p.p = 0; - } - - // Wait until data can be received without blocking. - template - void async_receive_from(implementation_type& impl, - const null_buffers&, endpoint_type& sender_endpoint, - socket_base::message_flags flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_receive_from(null_buffers)")); - - // Reset endpoint since it can be given no sensible value at this time. - sender_endpoint = endpoint_type(); - - start_null_buffers_receive_op(impl, flags, p.p); - p.v = p.p = 0; - } - - // Accept a new connection. - template - asio::error_code accept(implementation_type& impl, Socket& peer, - endpoint_type* peer_endpoint, asio::error_code& ec) - { - // We cannot accept a socket that is already open. - if (peer.is_open()) - { - ec = asio::error::already_open; - return ec; - } - - std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; - socket_holder new_socket(socket_ops::sync_accept(impl.socket_, - impl.state_, peer_endpoint ? peer_endpoint->data() : 0, - peer_endpoint ? &addr_len : 0, ec)); - - // On success, assign new connection to peer socket object. - if (new_socket.get() != invalid_socket) - { - if (peer_endpoint) - peer_endpoint->resize(addr_len); - peer.assign(impl.protocol_, new_socket.get(), ec); - if (!ec) - new_socket.release(); - } - - return ec; - } - -#if defined(ASIO_HAS_MOVE) - // Accept a new connection. - typename Protocol::socket accept(implementation_type& impl, - io_context* peer_io_context, endpoint_type* peer_endpoint, - asio::error_code& ec) - { - typename Protocol::socket peer( - peer_io_context ? *peer_io_context : io_context_); - - std::size_t addr_len = peer_endpoint ? peer_endpoint->capacity() : 0; - socket_holder new_socket(socket_ops::sync_accept(impl.socket_, - impl.state_, peer_endpoint ? peer_endpoint->data() : 0, - peer_endpoint ? &addr_len : 0, ec)); - - // On success, assign new connection to peer socket object. - if (new_socket.get() != invalid_socket) - { - if (peer_endpoint) - peer_endpoint->resize(addr_len); - peer.assign(impl.protocol_, new_socket.get(), ec); - if (!ec) - new_socket.release(); - } - - return peer; - } -#endif // defined(ASIO_HAS_MOVE) - - // Start an asynchronous accept. The peer and peer_endpoint objects - // must be valid until the accept's handler is invoked. - template - void async_accept(implementation_type& impl, Socket& peer, - endpoint_type* peer_endpoint, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_accept_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - bool enable_connection_aborted = - (impl.state_ & socket_ops::enable_connection_aborted) != 0; - p.p = new (p.v) op(*this, impl.socket_, peer, impl.protocol_, - peer_endpoint, enable_connection_aborted, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_accept")); - - start_accept_op(impl, peer.is_open(), p.p->new_socket(), - impl.protocol_.family(), impl.protocol_.type(), - impl.protocol_.protocol(), p.p->output_buffer(), - p.p->address_length(), p.p); - p.v = p.p = 0; - } - -#if defined(ASIO_HAS_MOVE) - // Start an asynchronous accept. The peer and peer_endpoint objects - // must be valid until the accept's handler is invoked. - template - void async_accept(implementation_type& impl, - asio::io_context* peer_io_context, - endpoint_type* peer_endpoint, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_move_accept_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - bool enable_connection_aborted = - (impl.state_ & socket_ops::enable_connection_aborted) != 0; - p.p = new (p.v) op(*this, impl.socket_, impl.protocol_, - peer_io_context ? *peer_io_context : io_context_, - peer_endpoint, enable_connection_aborted, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_accept")); - - start_accept_op(impl, false, p.p->new_socket(), - impl.protocol_.family(), impl.protocol_.type(), - impl.protocol_.protocol(), p.p->output_buffer(), - p.p->address_length(), p.p); - p.v = p.p = 0; - } -#endif // defined(ASIO_HAS_MOVE) - - // Connect the socket to the specified endpoint. - asio::error_code connect(implementation_type& impl, - const endpoint_type& peer_endpoint, asio::error_code& ec) - { - socket_ops::sync_connect(impl.socket_, - peer_endpoint.data(), peer_endpoint.size(), ec); - return ec; - } - - // Start an asynchronous connect. - template - void async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_connect_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.socket_, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_connect")); - - start_connect_op(impl, impl.protocol_.family(), impl.protocol_.type(), - peer_endpoint.data(), static_cast(peer_endpoint.size()), p.p); - p.v = p.p = 0; - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_socket_service_base.hpp b/scout_sdk/asio/asio/detail/win_iocp_socket_service_base.hpp deleted file mode 100644 index ef1d718..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_socket_service_base.hpp +++ /dev/null @@ -1,591 +0,0 @@ -// -// detail/win_iocp_socket_service_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_BASE_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/operation.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/win_iocp_io_context.hpp" -#include "asio/detail/win_iocp_null_buffers_op.hpp" -#include "asio/detail/win_iocp_socket_connect_op.hpp" -#include "asio/detail/win_iocp_socket_send_op.hpp" -#include "asio/detail/win_iocp_socket_recv_op.hpp" -#include "asio/detail/win_iocp_socket_recvmsg_op.hpp" -#include "asio/detail/win_iocp_wait_op.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_iocp_socket_service_base -{ -public: - // The implementation type of the socket. - struct base_implementation_type - { - // The native socket representation. - socket_type socket_; - - // The current state of the socket. - socket_ops::state_type state_; - - // We use a shared pointer as a cancellation token here to work around the - // broken Windows support for cancellation. MSDN says that when you call - // closesocket any outstanding WSARecv or WSASend operations will complete - // with the error ERROR_OPERATION_ABORTED. In practice they complete with - // ERROR_NETNAME_DELETED, which means you can't tell the difference between - // a local cancellation and the socket being hard-closed by the peer. - socket_ops::shared_cancel_token_type cancel_token_; - - // Per-descriptor data used by the reactor. - select_reactor::per_descriptor_data reactor_data_; - -#if defined(ASIO_ENABLE_CANCELIO) - // The ID of the thread from which it is safe to cancel asynchronous - // operations. 0 means no asynchronous operations have been started yet. - // ~0 means asynchronous operations have been started from more than one - // thread, and cancellation is not supported for the socket. - DWORD safe_cancellation_thread_id_; -#endif // defined(ASIO_ENABLE_CANCELIO) - - // Pointers to adjacent socket implementations in linked list. - base_implementation_type* next_; - base_implementation_type* prev_; - }; - - // Constructor. - ASIO_DECL win_iocp_socket_service_base( - asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void base_shutdown(); - - // Construct a new socket implementation. - ASIO_DECL void construct(base_implementation_type& impl); - - // Move-construct a new socket implementation. - ASIO_DECL void base_move_construct(base_implementation_type& impl, - base_implementation_type& other_impl); - - // Move-assign from another socket implementation. - ASIO_DECL void base_move_assign(base_implementation_type& impl, - win_iocp_socket_service_base& other_service, - base_implementation_type& other_impl); - - // Destroy a socket implementation. - ASIO_DECL void destroy(base_implementation_type& impl); - - // Determine whether the socket is open. - bool is_open(const base_implementation_type& impl) const - { - return impl.socket_ != invalid_socket; - } - - // Destroy a socket implementation. - ASIO_DECL asio::error_code close( - base_implementation_type& impl, asio::error_code& ec); - - // Release ownership of the socket. - ASIO_DECL socket_type release( - base_implementation_type& impl, asio::error_code& ec); - - // Cancel all operations associated with the socket. - ASIO_DECL asio::error_code cancel( - base_implementation_type& impl, asio::error_code& ec); - - // Determine whether the socket is at the out-of-band data mark. - bool at_mark(const base_implementation_type& impl, - asio::error_code& ec) const - { - return socket_ops::sockatmark(impl.socket_, ec); - } - - // Determine the number of bytes available for reading. - std::size_t available(const base_implementation_type& impl, - asio::error_code& ec) const - { - return socket_ops::available(impl.socket_, ec); - } - - // Place the socket into the state where it will listen for new connections. - asio::error_code listen(base_implementation_type& impl, - int backlog, asio::error_code& ec) - { - socket_ops::listen(impl.socket_, backlog, ec); - return ec; - } - - // Perform an IO control command on the socket. - template - asio::error_code io_control(base_implementation_type& impl, - IO_Control_Command& command, asio::error_code& ec) - { - socket_ops::ioctl(impl.socket_, impl.state_, command.name(), - static_cast(command.data()), ec); - return ec; - } - - // Gets the non-blocking mode of the socket. - bool non_blocking(const base_implementation_type& impl) const - { - return (impl.state_ & socket_ops::user_set_non_blocking) != 0; - } - - // Sets the non-blocking mode of the socket. - asio::error_code non_blocking(base_implementation_type& impl, - bool mode, asio::error_code& ec) - { - socket_ops::set_user_non_blocking(impl.socket_, impl.state_, mode, ec); - return ec; - } - - // Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const base_implementation_type& impl) const - { - return (impl.state_ & socket_ops::internal_non_blocking) != 0; - } - - // Sets the non-blocking mode of the native socket implementation. - asio::error_code native_non_blocking(base_implementation_type& impl, - bool mode, asio::error_code& ec) - { - socket_ops::set_internal_non_blocking(impl.socket_, impl.state_, mode, ec); - return ec; - } - - // Wait for the socket to become ready to read, ready to write, or to have - // pending error conditions. - asio::error_code wait(base_implementation_type& impl, - socket_base::wait_type w, asio::error_code& ec) - { - switch (w) - { - case socket_base::wait_read: - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - break; - case socket_base::wait_write: - socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); - break; - case socket_base::wait_error: - socket_ops::poll_error(impl.socket_, impl.state_, -1, ec); - break; - default: - ec = asio::error::invalid_argument; - break; - } - - return ec; - } - - // Asynchronously wait for the socket to become ready to read, ready to - // write, or to have pending error conditions. - template - void async_wait(base_implementation_type& impl, - socket_base::wait_type w, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_wait_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_wait")); - - switch (w) - { - case socket_base::wait_read: - start_null_buffers_receive_op(impl, 0, p.p); - break; - case socket_base::wait_write: - start_reactor_op(impl, select_reactor::write_op, p.p); - break; - case socket_base::wait_error: - start_reactor_op(impl, select_reactor::except_op, p.p); - break; - default: - p.p->ec_ = asio::error::invalid_argument; - iocp_service_.post_immediate_completion(p.p, is_continuation); - break; - } - - p.v = p.p = 0; - } - - // Send the given data to the peer. Returns the number of bytes sent. - template - size_t send(base_implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_send(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); - } - - // Wait until data can be sent without blocking. - size_t send(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_write(impl.socket_, impl.state_, -1, ec); - - return 0; - } - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send(base_implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_send_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, buffers, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_send")); - - buffer_sequence_adapter bufs(buffers); - - start_send_op(impl, bufs.buffers(), bufs.count(), flags, - (impl.state_ & socket_ops::stream_oriented) != 0 && bufs.all_empty(), - p.p); - p.v = p.p = 0; - } - - // Start an asynchronous wait until data can be sent without blocking. - template - void async_send(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_send(null_buffers)")); - - start_reactor_op(impl, select_reactor::write_op, p.p); - p.v = p.p = 0; - } - - // Receive some data from the peer. Returns the number of bytes received. - template - size_t receive(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_recv(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), flags, bufs.all_empty(), ec); - } - - // Wait until data can be received without blocking. - size_t receive(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_recv_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.state_, impl.cancel_token_, buffers, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_receive")); - - buffer_sequence_adapter bufs(buffers); - - start_receive_op(impl, bufs.buffers(), bufs.count(), flags, - (impl.state_ & socket_ops::stream_oriented) != 0 && bufs.all_empty(), - p.p); - p.v = p.p = 0; - } - - // Wait until data can be received without blocking. - template - void async_receive(base_implementation_type& impl, const null_buffers&, - socket_base::message_flags flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_receive(null_buffers)")); - - start_null_buffers_receive_op(impl, flags, p.p); - p.v = p.p = 0; - } - - // Receive some data with associated flags. Returns the number of bytes - // received. - template - size_t receive_with_flags(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, asio::error_code& ec) - { - buffer_sequence_adapter bufs(buffers); - - return socket_ops::sync_recvmsg(impl.socket_, impl.state_, - bufs.buffers(), bufs.count(), in_flags, out_flags, ec); - } - - // Wait until data can be received without blocking. - size_t receive_with_flags(base_implementation_type& impl, - const null_buffers&, socket_base::message_flags, - socket_base::message_flags& out_flags, asio::error_code& ec) - { - // Wait for socket to become ready. - socket_ops::poll_read(impl.socket_, impl.state_, -1, ec); - - // Clear out_flags, since we cannot give it any other sensible value when - // performing a null_buffers operation. - out_flags = 0; - - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive_with_flags(base_implementation_type& impl, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_socket_recvmsg_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, buffers, out_flags, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_receive_with_flags")); - - buffer_sequence_adapter bufs(buffers); - - start_receive_op(impl, bufs.buffers(), bufs.count(), in_flags, false, p.p); - p.v = p.p = 0; - } - - // Wait until data can be received without blocking. - template - void async_receive_with_flags(base_implementation_type& impl, - const null_buffers&, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef win_iocp_null_buffers_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(impl.cancel_token_, handler); - - ASIO_HANDLER_CREATION((io_context_, *p.p, "socket", - &impl, impl.socket_, "async_receive_with_flags(null_buffers)")); - - // Reset out_flags since it can be given no sensible value at this time. - out_flags = 0; - - start_null_buffers_receive_op(impl, in_flags, p.p); - p.v = p.p = 0; - } - - // Helper function to restart an asynchronous accept operation. - ASIO_DECL void restart_accept_op(socket_type s, - socket_holder& new_socket, int family, int type, int protocol, - void* output_buffer, DWORD address_length, operation* op); - -protected: - // Open a new socket implementation. - ASIO_DECL asio::error_code do_open( - base_implementation_type& impl, int family, int type, - int protocol, asio::error_code& ec); - - // Assign a native socket to a socket implementation. - ASIO_DECL asio::error_code do_assign( - base_implementation_type& impl, int type, - socket_type native_socket, asio::error_code& ec); - - // Helper function to start an asynchronous send operation. - ASIO_DECL void start_send_op(base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, - socket_base::message_flags flags, bool noop, operation* op); - - // Helper function to start an asynchronous send_to operation. - ASIO_DECL void start_send_to_op(base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, - const socket_addr_type* addr, int addrlen, - socket_base::message_flags flags, operation* op); - - // Helper function to start an asynchronous receive operation. - ASIO_DECL void start_receive_op(base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, - socket_base::message_flags flags, bool noop, operation* op); - - // Helper function to start an asynchronous null_buffers receive operation. - ASIO_DECL void start_null_buffers_receive_op( - base_implementation_type& impl, - socket_base::message_flags flags, reactor_op* op); - - // Helper function to start an asynchronous receive_from operation. - ASIO_DECL void start_receive_from_op(base_implementation_type& impl, - WSABUF* buffers, std::size_t buffer_count, socket_addr_type* addr, - socket_base::message_flags flags, int* addrlen, operation* op); - - // Helper function to start an asynchronous accept operation. - ASIO_DECL void start_accept_op(base_implementation_type& impl, - bool peer_is_open, socket_holder& new_socket, int family, int type, - int protocol, void* output_buffer, DWORD address_length, operation* op); - - // Start an asynchronous read or write operation using the reactor. - ASIO_DECL void start_reactor_op(base_implementation_type& impl, - int op_type, reactor_op* op); - - // Start the asynchronous connect operation using the reactor. - ASIO_DECL void start_connect_op(base_implementation_type& impl, - int family, int type, const socket_addr_type* remote_addr, - std::size_t remote_addrlen, win_iocp_socket_connect_op_base* op); - - // Helper function to close a socket when the associated object is being - // destroyed. - ASIO_DECL void close_for_destruction(base_implementation_type& impl); - - // Update the ID of the thread from which cancellation is safe. - ASIO_DECL void update_cancellation_thread_id( - base_implementation_type& impl); - - // Helper function to get the reactor. If no reactor has been created yet, a - // new one is obtained from the io_context and a pointer to it is cached in - // this service. - ASIO_DECL select_reactor& get_reactor(); - - // The type of a ConnectEx function pointer, as old SDKs may not provide it. - typedef BOOL (PASCAL *connect_ex_fn)(SOCKET, - const socket_addr_type*, int, void*, DWORD, DWORD*, OVERLAPPED*); - - // Helper function to get the ConnectEx pointer. If no ConnectEx pointer has - // been obtained yet, one is obtained using WSAIoctl and the pointer is - // cached. Returns a null pointer if ConnectEx is not available. - ASIO_DECL connect_ex_fn get_connect_ex( - base_implementation_type& impl, int type); - - // The type of a NtSetInformationFile function pointer. - typedef LONG (NTAPI *nt_set_info_fn)(HANDLE, ULONG_PTR*, void*, ULONG, ULONG); - - // Helper function to get the NtSetInformationFile function pointer. If no - // NtSetInformationFile pointer has been obtained yet, one is obtained using - // GetProcAddress and the pointer is cached. Returns a null pointer if - // NtSetInformationFile is not available. - ASIO_DECL nt_set_info_fn get_nt_set_info(); - - // Helper function to emulate InterlockedCompareExchangePointer functionality - // for: - // - very old Platform SDKs; and - // - platform SDKs where MSVC's /Wp64 option causes spurious warnings. - ASIO_DECL void* interlocked_compare_exchange_pointer( - void** dest, void* exch, void* cmp); - - // Helper function to emulate InterlockedExchangePointer functionality for: - // - very old Platform SDKs; and - // - platform SDKs where MSVC's /Wp64 option causes spurious warnings. - ASIO_DECL void* interlocked_exchange_pointer(void** dest, void* val); - - // The io_context used to obtain the reactor, if required. - asio::io_context& io_context_; - - // The IOCP service used for running asynchronous operations and dispatching - // handlers. - win_iocp_io_context& iocp_service_; - - // The reactor used for performing connect operations. This object is created - // only if needed. - select_reactor* reactor_; - - // Pointer to ConnectEx implementation. - void* connect_ex_; - - // Pointer to NtSetInformationFile implementation. - void* nt_set_info_; - - // Mutex to protect access to the linked list of implementations. - asio::detail::mutex mutex_; - - // The head of a linked list of all implementations. - base_implementation_type* impl_list_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_iocp_socket_service_base.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_BASE_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_thread_info.hpp b/scout_sdk/asio/asio/detail/win_iocp_thread_info.hpp deleted file mode 100644 index 13181e2..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_thread_info.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// detail/win_iocp_thread_info.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_THREAD_INFO_HPP -#define ASIO_DETAIL_WIN_IOCP_THREAD_INFO_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/thread_info_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct win_iocp_thread_info : public thread_info_base -{ -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_IOCP_THREAD_INFO_HPP diff --git a/scout_sdk/asio/asio/detail/win_iocp_wait_op.hpp b/scout_sdk/asio/asio/detail/win_iocp_wait_op.hpp deleted file mode 100644 index 472eea3..0000000 --- a/scout_sdk/asio/asio/detail/win_iocp_wait_op.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// detail/win_iocp_wait_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP -#define ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/reactor_op.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_wait_op : public reactor_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(win_iocp_wait_op); - - win_iocp_wait_op(socket_ops::weak_cancel_token_type cancel_token, - Handler& handler) - : reactor_op(&win_iocp_wait_op::do_perform, - &win_iocp_wait_op::do_complete), - cancel_token_(cancel_token), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static status do_perform(reactor_op*) - { - return done; - } - - static void do_complete(void* owner, operation* base, - const asio::error_code& result_ec, - std::size_t /*bytes_transferred*/) - { - asio::error_code ec(result_ec); - - // Take ownership of the operation object. - win_iocp_wait_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // The reactor may have stored a result in the operation object. - if (o->ec_) - ec = o->ec_; - - // Map non-portable errors to their portable counterparts. - if (ec.value() == ERROR_NETNAME_DELETED) - { - if (o->cancel_token_.expired()) - ec = asio::error::operation_aborted; - else - ec = asio::error::connection_reset; - } - else if (ec.value() == ERROR_PORT_UNREACHABLE) - { - ec = asio::error::connection_refused; - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(o->handler_, ec); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - socket_ops::weak_cancel_token_type cancel_token_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_IOCP) - -#endif // ASIO_DETAIL_WIN_IOCP_WAIT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/win_mutex.hpp b/scout_sdk/asio/asio/detail/win_mutex.hpp deleted file mode 100644 index ce52a2f..0000000 --- a/scout_sdk/asio/asio/detail/win_mutex.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// detail/win_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_MUTEX_HPP -#define ASIO_DETAIL_WIN_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - ASIO_DECL win_mutex(); - - // Destructor. - ~win_mutex() - { - ::DeleteCriticalSection(&crit_section_); - } - - // Lock the mutex. - void lock() - { - ::EnterCriticalSection(&crit_section_); - } - - // Unlock the mutex. - void unlock() - { - ::LeaveCriticalSection(&crit_section_); - } - -private: - // Initialisation must be performed in a separate function to the constructor - // since the compiler does not support the use of structured exceptions and - // C++ exceptions in the same function. - ASIO_DECL int do_init(); - - ::CRITICAL_SECTION crit_section_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_mutex.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_WIN_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/win_object_handle_service.hpp b/scout_sdk/asio/asio/detail/win_object_handle_service.hpp deleted file mode 100644 index 1d8abc9..0000000 --- a/scout_sdk/asio/asio/detail/win_object_handle_service.hpp +++ /dev/null @@ -1,184 +0,0 @@ -// -// detail/win_object_handle_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2011 Boris Schaeling (boris@highscore.de) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_OBJECT_HANDLE_SERVICE_HPP -#define ASIO_DETAIL_WIN_OBJECT_HANDLE_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/wait_handler.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class win_object_handle_service : - public service_base -{ -public: - // The native type of an object handle. - typedef HANDLE native_handle_type; - - // The implementation type of the object handle. - class implementation_type - { - public: - // Default constructor. - implementation_type() - : handle_(INVALID_HANDLE_VALUE), - wait_handle_(INVALID_HANDLE_VALUE), - owner_(0), - next_(0), - prev_(0) - { - } - - private: - // Only this service will have access to the internal values. - friend class win_object_handle_service; - - // The native object handle representation. May be accessed or modified - // without locking the mutex. - native_handle_type handle_; - - // The handle used to unregister the wait operation. The mutex must be - // locked when accessing or modifying this member. - HANDLE wait_handle_; - - // The operations waiting on the object handle. If there is a registered - // wait then the mutex must be locked when accessing or modifying this - // member - op_queue op_queue_; - - // The service instance that owns the object handle implementation. - win_object_handle_service* owner_; - - // Pointers to adjacent handle implementations in linked list. The mutex - // must be locked when accessing or modifying these members. - implementation_type* next_; - implementation_type* prev_; - }; - - // Constructor. - ASIO_DECL win_object_handle_service( - asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Construct a new handle implementation. - ASIO_DECL void construct(implementation_type& impl); - - // Move-construct a new handle implementation. - ASIO_DECL void move_construct(implementation_type& impl, - implementation_type& other_impl); - - // Move-assign from another handle implementation. - ASIO_DECL void move_assign(implementation_type& impl, - win_object_handle_service& other_service, - implementation_type& other_impl); - - // Destroy a handle implementation. - ASIO_DECL void destroy(implementation_type& impl); - - // Assign a native handle to a handle implementation. - ASIO_DECL asio::error_code assign(implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec); - - // Determine whether the handle is open. - bool is_open(const implementation_type& impl) const - { - return impl.handle_ != INVALID_HANDLE_VALUE && impl.handle_ != 0; - } - - // Destroy a handle implementation. - ASIO_DECL asio::error_code close(implementation_type& impl, - asio::error_code& ec); - - // Get the native handle representation. - native_handle_type native_handle(const implementation_type& impl) const - { - return impl.handle_; - } - - // Cancel all operations associated with the handle. - ASIO_DECL asio::error_code cancel(implementation_type& impl, - asio::error_code& ec); - - // Perform a synchronous wait for the object to enter a signalled state. - ASIO_DECL void wait(implementation_type& impl, - asio::error_code& ec); - - /// Start an asynchronous wait. - template - void async_wait(implementation_type& impl, Handler& handler) - { - // Allocate and construct an operation to wrap the handler. - typedef wait_handler op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((io_context_.context(), *p.p, "object_handle", - &impl, reinterpret_cast(impl.wait_handle_), "async_wait")); - - start_wait_op(impl, p.p); - p.v = p.p = 0; - } - -private: - // Helper function to start an asynchronous wait operation. - ASIO_DECL void start_wait_op(implementation_type& impl, wait_op* op); - - // Helper function to register a wait operation. - ASIO_DECL void register_wait_callback( - implementation_type& impl, mutex::scoped_lock& lock); - - // Callback function invoked when the registered wait completes. - static ASIO_DECL VOID CALLBACK wait_callback( - PVOID param, BOOLEAN timeout); - - // The io_context implementation used to post completions. - io_context_impl& io_context_; - - // Mutex to protect access to internal state. - mutex mutex_; - - // The head of a linked list of all implementations. - implementation_type* impl_list_; - - // Flag to indicate that the dispatcher has been shut down. - bool shutdown_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_object_handle_service.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - -#endif // ASIO_DETAIL_WIN_OBJECT_HANDLE_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/win_static_mutex.hpp b/scout_sdk/asio/asio/detail/win_static_mutex.hpp deleted file mode 100644 index b169688..0000000 --- a/scout_sdk/asio/asio/detail/win_static_mutex.hpp +++ /dev/null @@ -1,74 +0,0 @@ -// -// detail/win_static_mutex.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_STATIC_MUTEX_HPP -#define ASIO_DETAIL_WIN_STATIC_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct win_static_mutex -{ - typedef asio::detail::scoped_lock scoped_lock; - - // Initialise the mutex. - ASIO_DECL void init(); - - // Initialisation must be performed in a separate function to the "public" - // init() function since the compiler does not support the use of structured - // exceptions and C++ exceptions in the same function. - ASIO_DECL int do_init(); - - // Lock the mutex. - void lock() - { - ::EnterCriticalSection(&crit_section_); - } - - // Unlock the mutex. - void unlock() - { - ::LeaveCriticalSection(&crit_section_); - } - - bool initialised_; - ::CRITICAL_SECTION crit_section_; -}; - -#if defined(UNDER_CE) -# define ASIO_WIN_STATIC_MUTEX_INIT { false, { 0, 0, 0, 0, 0 } } -#else // defined(UNDER_CE) -# define ASIO_WIN_STATIC_MUTEX_INIT { false, { 0, 0, 0, 0, 0, 0 } } -#endif // defined(UNDER_CE) - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_static_mutex.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_WIN_STATIC_MUTEX_HPP diff --git a/scout_sdk/asio/asio/detail/win_thread.hpp b/scout_sdk/asio/asio/detail/win_thread.hpp deleted file mode 100644 index 8b28a90..0000000 --- a/scout_sdk/asio/asio/detail/win_thread.hpp +++ /dev/null @@ -1,147 +0,0 @@ -// -// detail/win_thread.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_THREAD_HPP -#define ASIO_DETAIL_WIN_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) \ - && !defined(ASIO_WINDOWS_APP) \ - && !defined(UNDER_CE) - -#include -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -ASIO_DECL unsigned int __stdcall win_thread_function(void* arg); - -#if defined(WINVER) && (WINVER < 0x0500) -ASIO_DECL void __stdcall apc_function(ULONG data); -#else -ASIO_DECL void __stdcall apc_function(ULONG_PTR data); -#endif - -template -class win_thread_base -{ -public: - static bool terminate_threads() - { - return ::InterlockedExchangeAdd(&terminate_threads_, 0) != 0; - } - - static void set_terminate_threads(bool b) - { - ::InterlockedExchange(&terminate_threads_, b ? 1 : 0); - } - -private: - static long terminate_threads_; -}; - -template -long win_thread_base::terminate_threads_ = 0; - -class win_thread - : private noncopyable, - public win_thread_base -{ -public: - // Constructor. - template - win_thread(Function f, unsigned int stack_size = 0) - : thread_(0), - exit_event_(0) - { - start_thread(new func(f), stack_size); - } - - // Destructor. - ASIO_DECL ~win_thread(); - - // Wait for the thread to exit. - ASIO_DECL void join(); - - // Get number of CPUs. - ASIO_DECL static std::size_t hardware_concurrency(); - -private: - friend ASIO_DECL unsigned int __stdcall win_thread_function(void* arg); - -#if defined(WINVER) && (WINVER < 0x0500) - friend ASIO_DECL void __stdcall apc_function(ULONG); -#else - friend ASIO_DECL void __stdcall apc_function(ULONG_PTR); -#endif - - class func_base - { - public: - virtual ~func_base() {} - virtual void run() = 0; - ::HANDLE entry_event_; - ::HANDLE exit_event_; - }; - - struct auto_func_base_ptr - { - func_base* ptr; - ~auto_func_base_ptr() { delete ptr; } - }; - - template - class func - : public func_base - { - public: - func(Function f) - : f_(f) - { - } - - virtual void run() - { - f_(); - } - - private: - Function f_; - }; - - ASIO_DECL void start_thread(func_base* arg, unsigned int stack_size); - - ::HANDLE thread_; - ::HANDLE exit_event_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_thread.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS) - // && !defined(ASIO_WINDOWS_APP) - // && !defined(UNDER_CE) - -#endif // ASIO_DETAIL_WIN_THREAD_HPP diff --git a/scout_sdk/asio/asio/detail/win_tss_ptr.hpp b/scout_sdk/asio/asio/detail/win_tss_ptr.hpp deleted file mode 100644 index 4207108..0000000 --- a/scout_sdk/asio/asio/detail/win_tss_ptr.hpp +++ /dev/null @@ -1,79 +0,0 @@ -// -// detail/win_tss_ptr.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_TSS_PTR_HPP -#define ASIO_DETAIL_WIN_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -// Helper function to create thread-specific storage. -ASIO_DECL DWORD win_tss_ptr_create(); - -template -class win_tss_ptr - : private noncopyable -{ -public: - // Constructor. - win_tss_ptr() - : tss_key_(win_tss_ptr_create()) - { - } - - // Destructor. - ~win_tss_ptr() - { - ::TlsFree(tss_key_); - } - - // Get the value. - operator T*() const - { - return static_cast(::TlsGetValue(tss_key_)); - } - - // Set the value. - void operator=(T* value) - { - ::TlsSetValue(tss_key_, value); - } - -private: - // Thread-specific storage to allow unlocked access to determine whether a - // thread is a member of the pool. - DWORD tss_key_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/win_tss_ptr.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS) - -#endif // ASIO_DETAIL_WIN_TSS_PTR_HPP diff --git a/scout_sdk/asio/asio/detail/winapp_thread.hpp b/scout_sdk/asio/asio/detail/winapp_thread.hpp deleted file mode 100644 index 69dcf08..0000000 --- a/scout_sdk/asio/asio/detail/winapp_thread.hpp +++ /dev/null @@ -1,124 +0,0 @@ -// -// detail/winapp_thread.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINAPP_THREAD_HPP -#define ASIO_DETAIL_WINAPP_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) && defined(ASIO_WINDOWS_APP) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -DWORD WINAPI winapp_thread_function(LPVOID arg); - -class winapp_thread - : private noncopyable -{ -public: - // Constructor. - template - winapp_thread(Function f, unsigned int = 0) - { - scoped_ptr arg(new func(f)); - DWORD thread_id = 0; - thread_ = ::CreateThread(0, 0, winapp_thread_function, - arg.get(), 0, &thread_id); - if (!thread_) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "thread"); - } - arg.release(); - } - - // Destructor. - ~winapp_thread() - { - ::CloseHandle(thread_); - } - - // Wait for the thread to exit. - void join() - { - ::WaitForSingleObjectEx(thread_, INFINITE, false); - } - - // Get number of CPUs. - static std::size_t hardware_concurrency() - { - SYSTEM_INFO system_info; - ::GetNativeSystemInfo(&system_info); - return system_info.dwNumberOfProcessors; - } - -private: - friend DWORD WINAPI winapp_thread_function(LPVOID arg); - - class func_base - { - public: - virtual ~func_base() {} - virtual void run() = 0; - }; - - template - class func - : public func_base - { - public: - func(Function f) - : f_(f) - { - } - - virtual void run() - { - f_(); - } - - private: - Function f_; - }; - - ::HANDLE thread_; -}; - -inline DWORD WINAPI winapp_thread_function(LPVOID arg) -{ - scoped_ptr func( - static_cast(arg)); - func->run(); - return 0; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) && defined(ASIO_WINDOWS_APP) - -#endif // ASIO_DETAIL_WINAPP_THREAD_HPP diff --git a/scout_sdk/asio/asio/detail/wince_thread.hpp b/scout_sdk/asio/asio/detail/wince_thread.hpp deleted file mode 100644 index a2863f6..0000000 --- a/scout_sdk/asio/asio/detail/wince_thread.hpp +++ /dev/null @@ -1,124 +0,0 @@ -// -// detail/wince_thread.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINCE_THREAD_HPP -#define ASIO_DETAIL_WINCE_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) && defined(UNDER_CE) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -DWORD WINAPI wince_thread_function(LPVOID arg); - -class wince_thread - : private noncopyable -{ -public: - // Constructor. - template - wince_thread(Function f, unsigned int = 0) - { - scoped_ptr arg(new func(f)); - DWORD thread_id = 0; - thread_ = ::CreateThread(0, 0, wince_thread_function, - arg.get(), 0, &thread_id); - if (!thread_) - { - DWORD last_error = ::GetLastError(); - asio::error_code ec(last_error, - asio::error::get_system_category()); - asio::detail::throw_error(ec, "thread"); - } - arg.release(); - } - - // Destructor. - ~wince_thread() - { - ::CloseHandle(thread_); - } - - // Wait for the thread to exit. - void join() - { - ::WaitForSingleObject(thread_, INFINITE); - } - - // Get number of CPUs. - static std::size_t hardware_concurrency() - { - SYSTEM_INFO system_info; - ::GetSystemInfo(&system_info); - return system_info.dwNumberOfProcessors; - } - -private: - friend DWORD WINAPI wince_thread_function(LPVOID arg); - - class func_base - { - public: - virtual ~func_base() {} - virtual void run() = 0; - }; - - template - class func - : public func_base - { - public: - func(Function f) - : f_(f) - { - } - - virtual void run() - { - f_(); - } - - private: - Function f_; - }; - - ::HANDLE thread_; -}; - -inline DWORD WINAPI wince_thread_function(LPVOID arg) -{ - scoped_ptr func( - static_cast(arg)); - func->run(); - return 0; -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS) && defined(UNDER_CE) - -#endif // ASIO_DETAIL_WINCE_THREAD_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_async_manager.hpp b/scout_sdk/asio/asio/detail/winrt_async_manager.hpp deleted file mode 100644 index e22ad52..0000000 --- a/scout_sdk/asio/asio/detail/winrt_async_manager.hpp +++ /dev/null @@ -1,294 +0,0 @@ -// -// detail/winrt_async_manager.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_ASYNC_MANAGER_HPP -#define ASIO_DETAIL_WINRT_ASYNC_MANAGER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include -#include "asio/detail/atomic_count.hpp" -#include "asio/detail/winrt_async_op.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class winrt_async_manager - : public asio::detail::service_base -{ -public: - // Constructor. - winrt_async_manager(asio::io_context& io_context) - : asio::detail::service_base(io_context), - io_context_(use_service(io_context)), - outstanding_ops_(1) - { - } - - // Destructor. - ~winrt_async_manager() - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - if (--outstanding_ops_ > 0) - { - // Block until last operation is complete. - std::future f = promise_.get_future(); - f.wait(); - } - } - - void sync(Windows::Foundation::IAsyncAction^ action, - asio::error_code& ec) - { - using namespace Windows::Foundation; - using Windows::Foundation::AsyncStatus; - - auto promise = std::make_shared>(); - auto future = promise->get_future(); - - action->Completed = ref new AsyncActionCompletedHandler( - [promise](IAsyncAction^ action, AsyncStatus status) - { - switch (status) - { - case AsyncStatus::Canceled: - promise->set_value(asio::error::operation_aborted); - break; - case AsyncStatus::Error: - case AsyncStatus::Completed: - default: - asio::error_code ec( - action->ErrorCode.Value, - asio::system_category()); - promise->set_value(ec); - break; - } - }); - - ec = future.get(); - } - - template - TResult sync(Windows::Foundation::IAsyncOperation^ operation, - asio::error_code& ec) - { - using namespace Windows::Foundation; - using Windows::Foundation::AsyncStatus; - - auto promise = std::make_shared>(); - auto future = promise->get_future(); - - operation->Completed = ref new AsyncOperationCompletedHandler( - [promise](IAsyncOperation^ operation, AsyncStatus status) - { - switch (status) - { - case AsyncStatus::Canceled: - promise->set_value(asio::error::operation_aborted); - break; - case AsyncStatus::Error: - case AsyncStatus::Completed: - default: - asio::error_code ec( - operation->ErrorCode.Value, - asio::system_category()); - promise->set_value(ec); - break; - } - }); - - ec = future.get(); - return operation->GetResults(); - } - - template - TResult sync( - Windows::Foundation::IAsyncOperationWithProgress< - TResult, TProgress>^ operation, - asio::error_code& ec) - { - using namespace Windows::Foundation; - using Windows::Foundation::AsyncStatus; - - auto promise = std::make_shared>(); - auto future = promise->get_future(); - - operation->Completed - = ref new AsyncOperationWithProgressCompletedHandler( - [promise](IAsyncOperationWithProgress^ operation, - AsyncStatus status) - { - switch (status) - { - case AsyncStatus::Canceled: - promise->set_value(asio::error::operation_aborted); - break; - case AsyncStatus::Started: - break; - case AsyncStatus::Error: - case AsyncStatus::Completed: - default: - asio::error_code ec( - operation->ErrorCode.Value, - asio::system_category()); - promise->set_value(ec); - break; - } - }); - - ec = future.get(); - return operation->GetResults(); - } - - void async(Windows::Foundation::IAsyncAction^ action, - winrt_async_op* handler) - { - using namespace Windows::Foundation; - using Windows::Foundation::AsyncStatus; - - auto on_completed = ref new AsyncActionCompletedHandler( - [this, handler](IAsyncAction^ action, AsyncStatus status) - { - switch (status) - { - case AsyncStatus::Canceled: - handler->ec_ = asio::error::operation_aborted; - break; - case AsyncStatus::Started: - return; - case AsyncStatus::Completed: - case AsyncStatus::Error: - default: - handler->ec_ = asio::error_code( - action->ErrorCode.Value, - asio::system_category()); - break; - } - io_context_.post_deferred_completion(handler); - if (--outstanding_ops_ == 0) - promise_.set_value(); - }); - - io_context_.work_started(); - ++outstanding_ops_; - action->Completed = on_completed; - } - - template - void async(Windows::Foundation::IAsyncOperation^ operation, - winrt_async_op* handler) - { - using namespace Windows::Foundation; - using Windows::Foundation::AsyncStatus; - - auto on_completed = ref new AsyncOperationCompletedHandler( - [this, handler](IAsyncOperation^ operation, AsyncStatus status) - { - switch (status) - { - case AsyncStatus::Canceled: - handler->ec_ = asio::error::operation_aborted; - break; - case AsyncStatus::Started: - return; - case AsyncStatus::Completed: - handler->result_ = operation->GetResults(); - // Fall through. - case AsyncStatus::Error: - default: - handler->ec_ = asio::error_code( - operation->ErrorCode.Value, - asio::system_category()); - break; - } - io_context_.post_deferred_completion(handler); - if (--outstanding_ops_ == 0) - promise_.set_value(); - }); - - io_context_.work_started(); - ++outstanding_ops_; - operation->Completed = on_completed; - } - - template - void async( - Windows::Foundation::IAsyncOperationWithProgress< - TResult, TProgress>^ operation, - winrt_async_op* handler) - { - using namespace Windows::Foundation; - using Windows::Foundation::AsyncStatus; - - auto on_completed - = ref new AsyncOperationWithProgressCompletedHandler( - [this, handler](IAsyncOperationWithProgress< - TResult, TProgress>^ operation, AsyncStatus status) - { - switch (status) - { - case AsyncStatus::Canceled: - handler->ec_ = asio::error::operation_aborted; - break; - case AsyncStatus::Started: - return; - case AsyncStatus::Completed: - handler->result_ = operation->GetResults(); - // Fall through. - case AsyncStatus::Error: - default: - handler->ec_ = asio::error_code( - operation->ErrorCode.Value, - asio::system_category()); - break; - } - io_context_.post_deferred_completion(handler); - if (--outstanding_ops_ == 0) - promise_.set_value(); - }); - - io_context_.work_started(); - ++outstanding_ops_; - operation->Completed = on_completed; - } - -private: - // The io_context implementation used to post completed handlers. - io_context_impl& io_context_; - - // Count of outstanding operations. - atomic_count outstanding_ops_; - - // Used to keep wait for outstanding operations to complete. - std::promise promise_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_ASYNC_MANAGER_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_async_op.hpp b/scout_sdk/asio/asio/detail/winrt_async_op.hpp deleted file mode 100644 index 75891a4..0000000 --- a/scout_sdk/asio/asio/detail/winrt_async_op.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// -// detail/winrt_async_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_ASYNC_OP_HPP -#define ASIO_DETAIL_WINRT_ASYNC_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/operation.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class winrt_async_op - : public operation -{ -public: - // The error code to be passed to the completion handler. - asio::error_code ec_; - - // The result of the operation, to be passed to the completion handler. - TResult result_; - -protected: - winrt_async_op(func_type complete_func) - : operation(complete_func), - result_() - { - } -}; - -template <> -class winrt_async_op - : public operation -{ -public: - // The error code to be passed to the completion handler. - asio::error_code ec_; - -protected: - winrt_async_op(func_type complete_func) - : operation(complete_func) - { - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WINRT_ASYNC_OP_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_resolve_op.hpp b/scout_sdk/asio/asio/detail/winrt_resolve_op.hpp deleted file mode 100644 index 07efd29..0000000 --- a/scout_sdk/asio/asio/detail/winrt_resolve_op.hpp +++ /dev/null @@ -1,118 +0,0 @@ -// -// detail/winrt_resolve_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_RESOLVE_OP_HPP -#define ASIO_DETAIL_WINRT_RESOLVE_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/winrt_async_op.hpp" -#include "asio/ip/basic_resolver_results.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class winrt_resolve_op : - public winrt_async_op< - Windows::Foundation::Collections::IVectorView< - Windows::Networking::EndpointPair^>^> -{ -public: - ASIO_DEFINE_HANDLER_PTR(winrt_resolve_op); - - typedef typename Protocol::endpoint endpoint_type; - typedef asio::ip::basic_resolver_query query_type; - typedef asio::ip::basic_resolver_results results_type; - - winrt_resolve_op(const query_type& query, Handler& handler) - : winrt_async_op< - Windows::Foundation::Collections::IVectorView< - Windows::Networking::EndpointPair^>^>( - &winrt_resolve_op::do_complete), - query_(query), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code&, std::size_t) - { - // Take ownership of the operation object. - winrt_resolve_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - results_type results = results_type(); - if (!o->ec_) - { - try - { - results = results_type::create(o->result_, o->query_.hints(), - o->query_.host_name(), o->query_.service_name()); - } - catch (Platform::Exception^ e) - { - o->ec_ = asio::error_code(e->HResult, - asio::system_category()); - } - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, results); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, "...")); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - query_type query_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_RESOLVE_OP_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_resolver_service.hpp b/scout_sdk/asio/asio/detail/winrt_resolver_service.hpp deleted file mode 100644 index aeb4448..0000000 --- a/scout_sdk/asio/asio/detail/winrt_resolver_service.hpp +++ /dev/null @@ -1,198 +0,0 @@ -// -// detail/winrt_resolver_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_RESOLVER_SERVICE_HPP -#define ASIO_DETAIL_WINRT_RESOLVER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/basic_resolver_results.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/winrt_async_manager.hpp" -#include "asio/detail/winrt_resolve_op.hpp" -#include "asio/detail/winrt_utils.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class winrt_resolver_service : - public service_base > -{ -public: - // The implementation type of the resolver. A cancellation token is used to - // indicate to the asynchronous operation that the operation has been - // cancelled. - typedef socket_ops::shared_cancel_token_type implementation_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The query type. - typedef asio::ip::basic_resolver_query query_type; - - // The results type. - typedef asio::ip::basic_resolver_results results_type; - - // Constructor. - winrt_resolver_service(asio::io_context& io_context) - : service_base >(io_context), - io_context_(use_service(io_context)), - async_manager_(use_service(io_context)) - { - } - - // Destructor. - ~winrt_resolver_service() - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - } - - // Perform any fork-related housekeeping. - void notify_fork(asio::io_context::fork_event) - { - } - - // Construct a new resolver implementation. - void construct(implementation_type&) - { - } - - // Move-construct a new resolver implementation. - void move_construct(implementation_type&, - implementation_type&) - { - } - - // Move-assign from another resolver implementation. - void move_assign(implementation_type&, - winrt_resolver_service&, implementation_type&) - { - } - - // Destroy a resolver implementation. - void destroy(implementation_type&) - { - } - - // Cancel pending asynchronous operations. - void cancel(implementation_type&) - { - } - - // Resolve a query to a list of entries. - results_type resolve(implementation_type&, - const query_type& query, asio::error_code& ec) - { - try - { - using namespace Windows::Networking::Sockets; - auto endpoint_pairs = async_manager_.sync( - DatagramSocket::GetEndpointPairsAsync( - winrt_utils::host_name(query.host_name()), - winrt_utils::string(query.service_name())), ec); - - if (ec) - return results_type(); - - return results_type::create( - endpoint_pairs, query.hints(), - query.host_name(), query.service_name()); - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - return results_type(); - } - } - - // Asynchronously resolve a query to a list of entries. - template - void async_resolve(implementation_type& impl, - const query_type& query, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef winrt_resolve_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(query, handler); - - ASIO_HANDLER_CREATION((io_context_.context(), - *p.p, "resolver", &impl, 0, "async_resolve")); - (void)impl; - - try - { - using namespace Windows::Networking::Sockets; - async_manager_.async(DatagramSocket::GetEndpointPairsAsync( - winrt_utils::host_name(query.host_name()), - winrt_utils::string(query.service_name())), p.p); - p.v = p.p = 0; - } - catch (Platform::Exception^ e) - { - p.p->ec_ = asio::error_code( - e->HResult, asio::system_category()); - io_context_.post_immediate_completion(p.p, is_continuation); - p.v = p.p = 0; - } - } - - // Resolve an endpoint to a list of entries. - results_type resolve(implementation_type&, - const endpoint_type&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return results_type(); - } - - // Asynchronously resolve an endpoint to a list of entries. - template - void async_resolve(implementation_type&, - const endpoint_type&, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const results_type results; - io_context_.get_io_context().post( - detail::bind_handler(handler, ec, results)); - } - -private: - io_context_impl& io_context_; - winrt_async_manager& async_manager_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_RESOLVER_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_socket_connect_op.hpp b/scout_sdk/asio/asio/detail/winrt_socket_connect_op.hpp deleted file mode 100644 index f18b445..0000000 --- a/scout_sdk/asio/asio/detail/winrt_socket_connect_op.hpp +++ /dev/null @@ -1,92 +0,0 @@ -// -// detail/winrt_socket_connect_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_SOCKET_CONNECT_OP_HPP -#define ASIO_DETAIL_WINRT_SOCKET_CONNECT_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/winrt_async_op.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class winrt_socket_connect_op : - public winrt_async_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(winrt_socket_connect_op); - - winrt_socket_connect_op(Handler& handler) - : winrt_async_op(&winrt_socket_connect_op::do_complete), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code&, std::size_t) - { - // Take ownership of the operation object. - winrt_socket_connect_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder1 - handler(o->handler_, o->ec_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_SOCKET_CONNECT_OP_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_socket_recv_op.hpp b/scout_sdk/asio/asio/detail/winrt_socket_recv_op.hpp deleted file mode 100644 index 8f1fcf5..0000000 --- a/scout_sdk/asio/asio/detail/winrt_socket_recv_op.hpp +++ /dev/null @@ -1,112 +0,0 @@ -// -// detail/winrt_socket_recv_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_SOCKET_RECV_OP_HPP -#define ASIO_DETAIL_WINRT_SOCKET_RECV_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/winrt_async_op.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class winrt_socket_recv_op : - public winrt_async_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(winrt_socket_recv_op); - - winrt_socket_recv_op(const MutableBufferSequence& buffers, Handler& handler) - : winrt_async_op( - &winrt_socket_recv_op::do_complete), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code&, std::size_t) - { - // Take ownership of the operation object. - winrt_socket_recv_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - // Check whether buffers are still valid. - if (owner) - { - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - std::size_t bytes_transferred = o->result_ ? o->result_->Length : 0; - if (bytes_transferred == 0 && !o->ec_ && - !buffer_sequence_adapter::all_empty(o->buffers_)) - { - o->ec_ = asio::error::eof; - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, bytes_transferred); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - MutableBufferSequence buffers_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_SOCKET_RECV_OP_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_socket_send_op.hpp b/scout_sdk/asio/asio/detail/winrt_socket_send_op.hpp deleted file mode 100644 index 1148c24..0000000 --- a/scout_sdk/asio/asio/detail/winrt_socket_send_op.hpp +++ /dev/null @@ -1,103 +0,0 @@ -// -// detail/winrt_socket_send_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_SOCKET_SEND_OP_HPP -#define ASIO_DETAIL_WINRT_SOCKET_SEND_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/winrt_async_op.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class winrt_socket_send_op : - public winrt_async_op -{ -public: - ASIO_DEFINE_HANDLER_PTR(winrt_socket_send_op); - - winrt_socket_send_op(const ConstBufferSequence& buffers, Handler& handler) - : winrt_async_op(&winrt_socket_send_op::do_complete), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - handler_work::start(handler_); - } - - static void do_complete(void* owner, operation* base, - const asio::error_code&, std::size_t) - { - // Take ownership of the operation object. - winrt_socket_send_op* o(static_cast(base)); - ptr p = { asio::detail::addressof(o->handler_), o, o }; - handler_work w(o->handler_); - - ASIO_HANDLER_COMPLETION((*o)); - -#if defined(ASIO_ENABLE_BUFFER_DEBUGGING) - // Check whether buffers are still valid. - if (owner) - { - buffer_sequence_adapter::validate(o->buffers_); - } -#endif // defined(ASIO_ENABLE_BUFFER_DEBUGGING) - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. Even if we're not about to make an upcall, a - // sub-object of the handler may be the true owner of the memory associated - // with the handler. Consequently, a local copy of the handler is required - // to ensure that any owning sub-object remains valid until after we have - // deallocated the memory here. - detail::binder2 - handler(o->handler_, o->ec_, o->result_); - p.h = asio::detail::addressof(handler.handler_); - p.reset(); - - // Make the upcall if required. - if (owner) - { - fenced_block b(fenced_block::half); - ASIO_HANDLER_INVOCATION_BEGIN((handler.arg1_, handler.arg2_)); - w.complete(handler, handler.handler_); - ASIO_HANDLER_INVOCATION_END; - } - } - -private: - ConstBufferSequence buffers_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_SOCKET_SEND_OP_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_ssocket_service.hpp b/scout_sdk/asio/asio/detail/winrt_ssocket_service.hpp deleted file mode 100644 index 603724a..0000000 --- a/scout_sdk/asio/asio/detail/winrt_ssocket_service.hpp +++ /dev/null @@ -1,241 +0,0 @@ -// -// detail/winrt_ssocket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_SSOCKET_SERVICE_HPP -#define ASIO_DETAIL_WINRT_SSOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/winrt_socket_connect_op.hpp" -#include "asio/detail/winrt_ssocket_service_base.hpp" -#include "asio/detail/winrt_utils.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class winrt_ssocket_service : - public service_base >, - public winrt_ssocket_service_base -{ -public: - // The protocol type. - typedef Protocol protocol_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The native type of a socket. - typedef Windows::Networking::Sockets::StreamSocket^ native_handle_type; - - // The implementation type of the socket. - struct implementation_type : base_implementation_type - { - // Default constructor. - implementation_type() - : base_implementation_type(), - protocol_(endpoint_type().protocol()) - { - } - - // The protocol associated with the socket. - protocol_type protocol_; - }; - - // Constructor. - winrt_ssocket_service(asio::io_context& io_context) - : service_base >(io_context), - winrt_ssocket_service_base(io_context) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - this->base_shutdown(); - } - - // Move-construct a new socket implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - this->base_move_construct(impl, other_impl); - - impl.protocol_ = other_impl.protocol_; - other_impl.protocol_ = endpoint_type().protocol(); - } - - // Move-assign from another socket implementation. - void move_assign(implementation_type& impl, - winrt_ssocket_service& other_service, - implementation_type& other_impl) - { - this->base_move_assign(impl, other_service, other_impl); - - impl.protocol_ = other_impl.protocol_; - other_impl.protocol_ = endpoint_type().protocol(); - } - - // Move-construct a new socket implementation from another protocol type. - template - void converting_move_construct(implementation_type& impl, - winrt_ssocket_service&, - typename winrt_ssocket_service< - Protocol1>::implementation_type& other_impl) - { - this->base_move_construct(impl, other_impl); - - impl.protocol_ = protocol_type(other_impl.protocol_); - other_impl.protocol_ = typename Protocol1::endpoint().protocol(); - } - - // Open a new socket implementation. - asio::error_code open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - try - { - impl.socket_ = ref new Windows::Networking::Sockets::StreamSocket; - impl.protocol_ = protocol; - ec = asio::error_code(); - } - catch (Platform::Exception^ e) - { - ec = asio::error_code(e->HResult, - asio::system_category()); - } - - return ec; - } - - // Assign a native socket to a socket implementation. - asio::error_code assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_socket, - asio::error_code& ec) - { - if (is_open(impl)) - { - ec = asio::error::already_open; - return ec; - } - - impl.socket_ = native_socket; - impl.protocol_ = protocol; - ec = asio::error_code(); - - return ec; - } - - // Bind the socket to the specified local endpoint. - asio::error_code bind(implementation_type&, - const endpoint_type&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - endpoint_type endpoint; - endpoint.resize(do_get_endpoint(impl, true, - endpoint.data(), endpoint.size(), ec)); - return endpoint; - } - - // Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - endpoint_type endpoint; - endpoint.resize(do_get_endpoint(impl, false, - endpoint.data(), endpoint.size(), ec)); - return endpoint; - } - - // Set a socket option. - template - asio::error_code set_option(implementation_type& impl, - const Option& option, asio::error_code& ec) - { - return do_set_option(impl, option.level(impl.protocol_), - option.name(impl.protocol_), option.data(impl.protocol_), - option.size(impl.protocol_), ec); - } - - // Get a socket option. - template - asio::error_code get_option(const implementation_type& impl, - Option& option, asio::error_code& ec) const - { - std::size_t size = option.size(impl.protocol_); - do_get_option(impl, option.level(impl.protocol_), - option.name(impl.protocol_), - option.data(impl.protocol_), &size, ec); - if (!ec) - option.resize(impl.protocol_, size); - return ec; - } - - // Connect the socket to the specified endpoint. - asio::error_code connect(implementation_type& impl, - const endpoint_type& peer_endpoint, asio::error_code& ec) - { - return do_connect(impl, peer_endpoint.data(), ec); - } - - // Start an asynchronous connect. - template - void async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef winrt_socket_connect_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(handler); - - ASIO_HANDLER_CREATION((io_context_.context(), - *p.p, "socket", &impl, 0, "async_connect")); - - start_connect_op(impl, peer_endpoint.data(), p.p, is_continuation); - p.v = p.p = 0; - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_SSOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_ssocket_service_base.hpp b/scout_sdk/asio/asio/detail/winrt_ssocket_service_base.hpp deleted file mode 100644 index 61328d0..0000000 --- a/scout_sdk/asio/asio/detail/winrt_ssocket_service_base.hpp +++ /dev/null @@ -1,359 +0,0 @@ -// -// detail/winrt_ssocket_service_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_SSOCKET_SERVICE_BASE_HPP -#define ASIO_DETAIL_WINRT_SSOCKET_SERVICE_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/buffer.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/winrt_async_manager.hpp" -#include "asio/detail/winrt_socket_recv_op.hpp" -#include "asio/detail/winrt_socket_send_op.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class winrt_ssocket_service_base -{ -public: - // The native type of a socket. - typedef Windows::Networking::Sockets::StreamSocket^ native_handle_type; - - // The implementation type of the socket. - struct base_implementation_type - { - // Default constructor. - base_implementation_type() - : socket_(nullptr), - next_(0), - prev_(0) - { - } - - // The underlying native socket. - native_handle_type socket_; - - // Pointers to adjacent socket implementations in linked list. - base_implementation_type* next_; - base_implementation_type* prev_; - }; - - // Constructor. - ASIO_DECL winrt_ssocket_service_base( - asio::io_context& io_context); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void base_shutdown(); - - // Construct a new socket implementation. - ASIO_DECL void construct(base_implementation_type&); - - // Move-construct a new socket implementation. - ASIO_DECL void base_move_construct(base_implementation_type& impl, - base_implementation_type& other_impl); - - // Move-assign from another socket implementation. - ASIO_DECL void base_move_assign(base_implementation_type& impl, - winrt_ssocket_service_base& other_service, - base_implementation_type& other_impl); - - // Destroy a socket implementation. - ASIO_DECL void destroy(base_implementation_type& impl); - - // Determine whether the socket is open. - bool is_open(const base_implementation_type& impl) const - { - return impl.socket_ != nullptr; - } - - // Destroy a socket implementation. - ASIO_DECL asio::error_code close( - base_implementation_type& impl, asio::error_code& ec); - - // Release ownership of the socket. - ASIO_DECL native_handle_type release( - base_implementation_type& impl, asio::error_code& ec); - - // Get the native socket representation. - native_handle_type native_handle(base_implementation_type& impl) - { - return impl.socket_; - } - - // Cancel all operations associated with the socket. - asio::error_code cancel(base_implementation_type&, - asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Determine whether the socket is at the out-of-band data mark. - bool at_mark(const base_implementation_type&, - asio::error_code& ec) const - { - ec = asio::error::operation_not_supported; - return false; - } - - // Determine the number of bytes available for reading. - std::size_t available(const base_implementation_type&, - asio::error_code& ec) const - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Perform an IO control command on the socket. - template - asio::error_code io_control(base_implementation_type&, - IO_Control_Command&, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Gets the non-blocking mode of the socket. - bool non_blocking(const base_implementation_type&) const - { - return false; - } - - // Sets the non-blocking mode of the socket. - asio::error_code non_blocking(base_implementation_type&, - bool, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const base_implementation_type&) const - { - return false; - } - - // Sets the non-blocking mode of the native socket implementation. - asio::error_code native_non_blocking(base_implementation_type&, - bool, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Disable sends or receives on the socket. - asio::error_code shutdown(base_implementation_type&, - socket_base::shutdown_type, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return ec; - } - - // Send the given data to the peer. - template - std::size_t send(base_implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return do_send(impl, - buffer_sequence_adapter::first(buffers), flags, ec); - } - - // Wait until data can be sent without blocking. - std::size_t send(base_implementation_type&, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send(base_implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef winrt_socket_send_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(buffers, handler); - - ASIO_HANDLER_CREATION((io_context_.context(), - *p.p, "socket", &impl, 0, "async_send")); - - start_send_op(impl, - buffer_sequence_adapter::first(buffers), - flags, p.p, is_continuation); - p.v = p.p = 0; - } - - // Start an asynchronous wait until data can be sent without blocking. - template - void async_send(base_implementation_type&, const null_buffers&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.get_io_context().post( - detail::bind_handler(handler, ec, bytes_transferred)); - } - - // Receive some data from the peer. Returns the number of bytes received. - template - std::size_t receive(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return do_receive(impl, - buffer_sequence_adapter::first(buffers), flags, ec); - } - - // Wait until data can be received without blocking. - std::size_t receive(base_implementation_type&, const null_buffers&, - socket_base::message_flags, asio::error_code& ec) - { - ec = asio::error::operation_not_supported; - return 0; - } - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive(base_implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, Handler& handler) - { - bool is_continuation = - asio_handler_cont_helpers::is_continuation(handler); - - // Allocate and construct an operation to wrap the handler. - typedef winrt_socket_recv_op op; - typename op::ptr p = { asio::detail::addressof(handler), - op::ptr::allocate(handler), 0 }; - p.p = new (p.v) op(buffers, handler); - - ASIO_HANDLER_CREATION((io_context_.context(), - *p.p, "socket", &impl, 0, "async_receive")); - - start_receive_op(impl, - buffer_sequence_adapter::first(buffers), - flags, p.p, is_continuation); - p.v = p.p = 0; - } - - // Wait until data can be received without blocking. - template - void async_receive(base_implementation_type&, const null_buffers&, - socket_base::message_flags, Handler& handler) - { - asio::error_code ec = asio::error::operation_not_supported; - const std::size_t bytes_transferred = 0; - io_context_.get_io_context().post( - detail::bind_handler(handler, ec, bytes_transferred)); - } - -protected: - // Helper function to obtain endpoints associated with the connection. - ASIO_DECL std::size_t do_get_endpoint( - const base_implementation_type& impl, bool local, - void* addr, std::size_t addr_len, asio::error_code& ec) const; - - // Helper function to set a socket option. - ASIO_DECL asio::error_code do_set_option( - base_implementation_type& impl, - int level, int optname, const void* optval, - std::size_t optlen, asio::error_code& ec); - - // Helper function to get a socket option. - ASIO_DECL void do_get_option( - const base_implementation_type& impl, - int level, int optname, void* optval, - std::size_t* optlen, asio::error_code& ec) const; - - // Helper function to perform a synchronous connect. - ASIO_DECL asio::error_code do_connect( - base_implementation_type& impl, - const void* addr, asio::error_code& ec); - - // Helper function to start an asynchronous connect. - ASIO_DECL void start_connect_op( - base_implementation_type& impl, const void* addr, - winrt_async_op* op, bool is_continuation); - - // Helper function to perform a synchronous send. - ASIO_DECL std::size_t do_send( - base_implementation_type& impl, const asio::const_buffer& data, - socket_base::message_flags flags, asio::error_code& ec); - - // Helper function to start an asynchronous send. - ASIO_DECL void start_send_op(base_implementation_type& impl, - const asio::const_buffer& data, socket_base::message_flags flags, - winrt_async_op* op, bool is_continuation); - - // Helper function to perform a synchronous receive. - ASIO_DECL std::size_t do_receive( - base_implementation_type& impl, const asio::mutable_buffer& data, - socket_base::message_flags flags, asio::error_code& ec); - - // Helper function to start an asynchronous receive. - ASIO_DECL void start_receive_op(base_implementation_type& impl, - const asio::mutable_buffer& data, socket_base::message_flags flags, - winrt_async_op* op, - bool is_continuation); - - // The io_context implementation used for delivering completions. - io_context_impl& io_context_; - - // The manager that keeps track of outstanding operations. - winrt_async_manager& async_manager_; - - // Mutex to protect access to the linked list of implementations. - asio::detail::mutex mutex_; - - // The head of a linked list of all implementations. - base_implementation_type* impl_list_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/winrt_ssocket_service_base.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_SSOCKET_SERVICE_BASE_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_timer_scheduler.hpp b/scout_sdk/asio/asio/detail/winrt_timer_scheduler.hpp deleted file mode 100644 index 5dec7c0..0000000 --- a/scout_sdk/asio/asio/detail/winrt_timer_scheduler.hpp +++ /dev/null @@ -1,137 +0,0 @@ -// -// detail/winrt_timer_scheduler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_TIMER_SCHEDULER_HPP -#define ASIO_DETAIL_WINRT_TIMER_SCHEDULER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include -#include "asio/detail/event.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/op_queue.hpp" -#include "asio/detail/thread.hpp" -#include "asio/detail/timer_queue_base.hpp" -#include "asio/detail/timer_queue_set.hpp" -#include "asio/detail/wait_op.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_HAS_IOCP) -# include "asio/detail/thread.hpp" -#endif // defined(ASIO_HAS_IOCP) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class winrt_timer_scheduler - : public asio::detail::service_base -{ -public: - // Constructor. - ASIO_DECL winrt_timer_scheduler(asio::io_context& io_context); - - // Destructor. - ASIO_DECL ~winrt_timer_scheduler(); - - // Destroy all user-defined handler objects owned by the service. - ASIO_DECL void shutdown(); - - // Recreate internal descriptors following a fork. - ASIO_DECL void notify_fork( - asio::io_context::fork_event fork_ev); - - // Initialise the task. No effect as this class uses its own thread. - ASIO_DECL void init_task(); - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& queue); - - // Remove a timer queue from the reactor. - template - void remove_timer_queue(timer_queue& queue); - - // Schedule a new operation in the given timer queue to expire at the - // specified absolute time. - template - void schedule_timer(timer_queue& queue, - const typename Time_Traits::time_type& time, - typename timer_queue::per_timer_data& timer, wait_op* op); - - // Cancel the timer operations associated with the given token. Returns the - // number of operations that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& queue, - typename timer_queue::per_timer_data& timer, - std::size_t max_cancelled = (std::numeric_limits::max)()); - - // Move the timer operations associated with the given timer. - template - void move_timer(timer_queue& queue, - typename timer_queue::per_timer_data& to, - typename timer_queue::per_timer_data& from); - -private: - // Run the select loop in the thread. - ASIO_DECL void run_thread(); - - // Entry point for the select loop thread. - ASIO_DECL static void call_run_thread(winrt_timer_scheduler* reactor); - - // Helper function to add a new timer queue. - ASIO_DECL void do_add_timer_queue(timer_queue_base& queue); - - // Helper function to remove a timer queue. - ASIO_DECL void do_remove_timer_queue(timer_queue_base& queue); - - // The io_context implementation used to post completions. - io_context_impl& io_context_; - - // Mutex used to protect internal variables. - asio::detail::mutex mutex_; - - // Event used to wake up background thread. - asio::detail::event event_; - - // The timer queues. - timer_queue_set timer_queues_; - - // The background thread that is waiting for timers to expire. - asio::detail::thread* thread_; - - // Does the background thread need to stop. - bool stop_thread_; - - // Whether the service has been shut down. - bool shutdown_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/impl/winrt_timer_scheduler.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/winrt_timer_scheduler.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_TIMER_SCHEDULER_HPP diff --git a/scout_sdk/asio/asio/detail/winrt_utils.hpp b/scout_sdk/asio/asio/detail/winrt_utils.hpp deleted file mode 100644 index 22a2489..0000000 --- a/scout_sdk/asio/asio/detail/winrt_utils.hpp +++ /dev/null @@ -1,106 +0,0 @@ -// -// detail/winrt_utils.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINRT_UTILS_HPP -#define ASIO_DETAIL_WINRT_UTILS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) - -#include -#include -#include -#include -#include -#include -#include -#include "asio/buffer.hpp" -#include "asio/error_code.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/socket_ops.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { -namespace winrt_utils { - -inline Platform::String^ string(const char* from) -{ - std::wstring tmp(from, from + std::strlen(from)); - return ref new Platform::String(tmp.c_str()); -} - -inline Platform::String^ string(const std::string& from) -{ - std::wstring tmp(from.begin(), from.end()); - return ref new Platform::String(tmp.c_str()); -} - -inline std::string string(Platform::String^ from) -{ - std::wstring_convert> converter; - return converter.to_bytes(from->Data()); -} - -inline Platform::String^ string(unsigned short from) -{ - return string(std::to_string(from)); -} - -template -inline Platform::String^ string(const T& from) -{ - return string(from.to_string()); -} - -inline int integer(Platform::String^ from) -{ - return _wtoi(from->Data()); -} - -template -inline Windows::Networking::HostName^ host_name(const T& from) -{ - return ref new Windows::Networking::HostName((string)(from)); -} - -template -inline Windows::Storage::Streams::IBuffer^ buffer_dup( - const ConstBufferSequence& buffers) -{ - using Microsoft::WRL::ComPtr; - using asio::buffer_size; - std::size_t size = buffer_size(buffers); - auto b = ref new Windows::Storage::Streams::Buffer(size); - ComPtr insp = reinterpret_cast(b); - ComPtr bacc; - insp.As(&bacc); - byte* bytes = nullptr; - bacc->Buffer(&bytes); - asio::buffer_copy(asio::buffer(bytes, size), buffers); - b->Length = size; - return b; -} - -} // namespace winrt_utils -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#endif // ASIO_DETAIL_WINRT_UTILS_HPP diff --git a/scout_sdk/asio/asio/detail/winsock_init.hpp b/scout_sdk/asio/asio/detail/winsock_init.hpp deleted file mode 100644 index 9094363..0000000 --- a/scout_sdk/asio/asio/detail/winsock_init.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// -// detail/winsock_init.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINSOCK_INIT_HPP -#define ASIO_DETAIL_WINSOCK_INIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class winsock_init_base -{ -protected: - // Structure to track result of initialisation and number of uses. POD is used - // to ensure that the values are zero-initialised prior to any code being run. - struct data - { - long init_count_; - long result_; - }; - - ASIO_DECL static void startup(data& d, - unsigned char major, unsigned char minor); - - ASIO_DECL static void manual_startup(data& d); - - ASIO_DECL static void cleanup(data& d); - - ASIO_DECL static void manual_cleanup(data& d); - - ASIO_DECL static void throw_on_error(data& d); -}; - -template -class winsock_init : private winsock_init_base -{ -public: - winsock_init(bool allow_throw = true) - { - startup(data_, Major, Minor); - if (allow_throw) - throw_on_error(data_); - } - - winsock_init(const winsock_init&) - { - startup(data_, Major, Minor); - throw_on_error(data_); - } - - ~winsock_init() - { - cleanup(data_); - } - - // This class may be used to indicate that user code will manage Winsock - // initialisation and cleanup. This may be required in the case of a DLL, for - // example, where it is not safe to initialise Winsock from global object - // constructors. - // - // To prevent asio from initialising Winsock, the object must be constructed - // before any Asio's own global objects. With MSVC, this may be accomplished - // by adding the following code to the DLL: - // - // #pragma warning(push) - // #pragma warning(disable:4073) - // #pragma init_seg(lib) - // asio::detail::winsock_init<>::manual manual_winsock_init; - // #pragma warning(pop) - class manual - { - public: - manual() - { - manual_startup(data_); - } - - manual(const manual&) - { - manual_startup(data_); - } - - ~manual() - { - manual_cleanup(data_); - } - }; - -private: - friend class manual; - static data data_; -}; - -template -winsock_init_base::data winsock_init::data_; - -// Static variable to ensure that winsock is initialised before main, and -// therefore before any other threads can get started. -static const winsock_init<>& winsock_init_instance = winsock_init<>(false); - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/detail/impl/winsock_init.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - -#endif // ASIO_DETAIL_WINSOCK_INIT_HPP diff --git a/scout_sdk/asio/asio/detail/work_dispatcher.hpp b/scout_sdk/asio/asio/detail/work_dispatcher.hpp deleted file mode 100644 index 7abce49..0000000 --- a/scout_sdk/asio/asio/detail/work_dispatcher.hpp +++ /dev/null @@ -1,72 +0,0 @@ -// -// detail/work_dispatcher.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WORK_DISPATCHER_HPP -#define ASIO_DETAIL_WORK_DISPATCHER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_executor.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/executor_work_guard.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class work_dispatcher -{ -public: - work_dispatcher(Handler& handler) - : work_((get_associated_executor)(handler)), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - work_dispatcher(const work_dispatcher& other) - : work_(other.work_), - handler_(other.handler_) - { - } - - work_dispatcher(work_dispatcher&& other) - : work_(ASIO_MOVE_CAST(executor_work_guard< - typename associated_executor::type>)(other.work_)), - handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - typename associated_allocator::type alloc( - (get_associated_allocator)(handler_)); - work_.get_executor().dispatch( - ASIO_MOVE_CAST(Handler)(handler_), alloc); - work_.reset(); - } - -private: - executor_work_guard::type> work_; - Handler handler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WORK_DISPATCHER_HPP diff --git a/scout_sdk/asio/asio/detail/wrapped_handler.hpp b/scout_sdk/asio/asio/detail/wrapped_handler.hpp deleted file mode 100644 index 751f0ea..0000000 --- a/scout_sdk/asio/asio/detail/wrapped_handler.hpp +++ /dev/null @@ -1,291 +0,0 @@ -// -// detail/wrapped_handler.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WRAPPED_HANDLER_HPP -#define ASIO_DETAIL_WRAPPED_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -struct is_continuation_delegated -{ - template - bool operator()(Dispatcher&, Handler& handler) const - { - return asio_handler_cont_helpers::is_continuation(handler); - } -}; - -struct is_continuation_if_running -{ - template - bool operator()(Dispatcher& dispatcher, Handler&) const - { - return dispatcher.running_in_this_thread(); - } -}; - -template -class wrapped_handler -{ -public: - typedef void result_type; - - wrapped_handler(Dispatcher dispatcher, Handler& handler) - : dispatcher_(dispatcher), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - wrapped_handler(const wrapped_handler& other) - : dispatcher_(other.dispatcher_), - handler_(other.handler_) - { - } - - wrapped_handler(wrapped_handler&& other) - : dispatcher_(other.dispatcher_), - handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - dispatcher_.dispatch(ASIO_MOVE_CAST(Handler)(handler_)); - } - - void operator()() const - { - dispatcher_.dispatch(handler_); - } - - template - void operator()(const Arg1& arg1) - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1)); - } - - template - void operator()(const Arg1& arg1) const - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2) - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2) const - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) const - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4) - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4) const - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4, const Arg5& arg5) - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4, arg5)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4, const Arg5& arg5) const - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4, arg5)); - } - -//private: - Dispatcher dispatcher_; - Handler handler_; -}; - -template -class rewrapped_handler -{ -public: - explicit rewrapped_handler(Handler& handler, const Context& context) - : context_(context), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - } - - explicit rewrapped_handler(const Handler& handler, const Context& context) - : context_(context), - handler_(handler) - { - } - -#if defined(ASIO_HAS_MOVE) - rewrapped_handler(const rewrapped_handler& other) - : context_(other.context_), - handler_(other.handler_) - { - } - - rewrapped_handler(rewrapped_handler&& other) - : context_(ASIO_MOVE_CAST(Context)(other.context_)), - handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()() - { - handler_(); - } - - void operator()() const - { - handler_(); - } - -//private: - Context context_; - Handler handler_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - wrapped_handler* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - wrapped_handler* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - wrapped_handler* this_handler) -{ - return IsContinuation()(this_handler->dispatcher_, this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - wrapped_handler* this_handler) -{ - this_handler->dispatcher_.dispatch( - rewrapped_handler( - function, this_handler->handler_)); -} - -template -inline void asio_handler_invoke(const Function& function, - wrapped_handler* this_handler) -{ - this_handler->dispatcher_.dispatch( - rewrapped_handler( - function, this_handler->handler_)); -} - -template -inline void* asio_handler_allocate(std::size_t size, - rewrapped_handler* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->context_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - rewrapped_handler* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->context_); -} - -template -inline bool asio_handler_is_continuation( - rewrapped_handler* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->context_); -} - -template -inline void asio_handler_invoke(Function& function, - rewrapped_handler* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->context_); -} - -template -inline void asio_handler_invoke(const Function& function, - rewrapped_handler* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->context_); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WRAPPED_HANDLER_HPP diff --git a/scout_sdk/asio/asio/dispatch.hpp b/scout_sdk/asio/asio/dispatch.hpp deleted file mode 100644 index b8dfd69..0000000 --- a/scout_sdk/asio/asio/dispatch.hpp +++ /dev/null @@ -1,108 +0,0 @@ -// -// dispatch.hpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DISPATCH_HPP -#define ASIO_DISPATCH_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/execution_context.hpp" -#include "asio/is_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Submits a completion token or function object for execution. -/** - * This function submits an object for execution using the object's associated - * executor. The function object is queued for execution, and is never called - * from the current thread prior to returning from dispatch(). - * - * This function has the following effects: - * - * @li Constructs a function object handler of type @c Handler, initialized - * with handler(forward(token)). - * - * @li Constructs an object @c result of type async_result, - * initializing the object as result(handler). - * - * @li Obtains the handler's associated executor object @c ex by performing - * get_associated_executor(handler). - * - * @li Obtains the handler's associated allocator object @c alloc by performing - * get_associated_allocator(handler). - * - * @li Performs ex.dispatch(std::move(handler), alloc). - * - * @li Returns result.get(). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( - ASIO_MOVE_ARG(CompletionToken) token); - -/// Submits a completion token or function object for execution. -/** - * This function submits an object for execution using the specified executor. - * The function object is queued for execution, and is never called from the - * current thread prior to returning from dispatch(). - * - * This function has the following effects: - * - * @li Constructs a function object handler of type @c Handler, initialized - * with handler(forward(token)). - * - * @li Constructs an object @c result of type async_result, - * initializing the object as result(handler). - * - * @li Obtains the handler's associated executor object @c ex1 by performing - * get_associated_executor(handler). - * - * @li Creates a work object @c w by performing make_work(ex1). - * - * @li Obtains the handler's associated allocator object @c alloc by performing - * get_associated_allocator(handler). - * - * @li Constructs a function object @c f with a function call operator that - * performs ex1.dispatch(std::move(handler), alloc) followed by - * w.reset(). - * - * @li Performs Executor(ex).dispatch(std::move(f), alloc). - * - * @li Returns result.get(). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( - const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type* = 0); - -/// Submits a completion token or function object for execution. -/** - * @returns dispatch(ctx.get_executor(), - * forward(token)). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( - ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type* = 0); - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/dispatch.hpp" - -#endif // ASIO_DISPATCH_HPP diff --git a/scout_sdk/asio/asio/error.hpp b/scout_sdk/asio/asio/error.hpp deleted file mode 100644 index 2be9bde..0000000 --- a/scout_sdk/asio/asio/error.hpp +++ /dev/null @@ -1,356 +0,0 @@ -// -// error.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ERROR_HPP -#define ASIO_ERROR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/error_code.hpp" -#include "asio/system_error.hpp" -#if defined(ASIO_WINDOWS) \ - || defined(__CYGWIN__) \ - || defined(ASIO_WINDOWS_RUNTIME) -# include -#else -# include -# include -#endif - -#if defined(GENERATING_DOCUMENTATION) -/// INTERNAL ONLY. -# define ASIO_NATIVE_ERROR(e) implementation_defined -/// INTERNAL ONLY. -# define ASIO_SOCKET_ERROR(e) implementation_defined -/// INTERNAL ONLY. -# define ASIO_NETDB_ERROR(e) implementation_defined -/// INTERNAL ONLY. -# define ASIO_GETADDRINFO_ERROR(e) implementation_defined -/// INTERNAL ONLY. -# define ASIO_WIN_OR_POSIX(e_win, e_posix) implementation_defined -#elif defined(ASIO_WINDOWS_RUNTIME) -# define ASIO_NATIVE_ERROR(e) __HRESULT_FROM_WIN32(e) -# define ASIO_SOCKET_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e) -# define ASIO_NETDB_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e) -# define ASIO_GETADDRINFO_ERROR(e) __HRESULT_FROM_WIN32(WSA ## e) -# define ASIO_WIN_OR_POSIX(e_win, e_posix) e_win -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# define ASIO_NATIVE_ERROR(e) e -# define ASIO_SOCKET_ERROR(e) WSA ## e -# define ASIO_NETDB_ERROR(e) WSA ## e -# define ASIO_GETADDRINFO_ERROR(e) WSA ## e -# define ASIO_WIN_OR_POSIX(e_win, e_posix) e_win -#else -# define ASIO_NATIVE_ERROR(e) e -# define ASIO_SOCKET_ERROR(e) e -# define ASIO_NETDB_ERROR(e) e -# define ASIO_GETADDRINFO_ERROR(e) e -# define ASIO_WIN_OR_POSIX(e_win, e_posix) e_posix -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace error { - -enum basic_errors -{ - /// Permission denied. - access_denied = ASIO_SOCKET_ERROR(EACCES), - - /// Address family not supported by protocol. - address_family_not_supported = ASIO_SOCKET_ERROR(EAFNOSUPPORT), - - /// Address already in use. - address_in_use = ASIO_SOCKET_ERROR(EADDRINUSE), - - /// Transport endpoint is already connected. - already_connected = ASIO_SOCKET_ERROR(EISCONN), - - /// Operation already in progress. - already_started = ASIO_SOCKET_ERROR(EALREADY), - - /// Broken pipe. - broken_pipe = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(ERROR_BROKEN_PIPE), - ASIO_NATIVE_ERROR(EPIPE)), - - /// A connection has been aborted. - connection_aborted = ASIO_SOCKET_ERROR(ECONNABORTED), - - /// Connection refused. - connection_refused = ASIO_SOCKET_ERROR(ECONNREFUSED), - - /// Connection reset by peer. - connection_reset = ASIO_SOCKET_ERROR(ECONNRESET), - - /// Bad file descriptor. - bad_descriptor = ASIO_SOCKET_ERROR(EBADF), - - /// Bad address. - fault = ASIO_SOCKET_ERROR(EFAULT), - - /// No route to host. - host_unreachable = ASIO_SOCKET_ERROR(EHOSTUNREACH), - - /// Operation now in progress. - in_progress = ASIO_SOCKET_ERROR(EINPROGRESS), - - /// Interrupted system call. - interrupted = ASIO_SOCKET_ERROR(EINTR), - - /// Invalid argument. - invalid_argument = ASIO_SOCKET_ERROR(EINVAL), - - /// Message too long. - message_size = ASIO_SOCKET_ERROR(EMSGSIZE), - - /// The name was too long. - name_too_long = ASIO_SOCKET_ERROR(ENAMETOOLONG), - - /// Network is down. - network_down = ASIO_SOCKET_ERROR(ENETDOWN), - - /// Network dropped connection on reset. - network_reset = ASIO_SOCKET_ERROR(ENETRESET), - - /// Network is unreachable. - network_unreachable = ASIO_SOCKET_ERROR(ENETUNREACH), - - /// Too many open files. - no_descriptors = ASIO_SOCKET_ERROR(EMFILE), - - /// No buffer space available. - no_buffer_space = ASIO_SOCKET_ERROR(ENOBUFS), - - /// Cannot allocate memory. - no_memory = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(ERROR_OUTOFMEMORY), - ASIO_NATIVE_ERROR(ENOMEM)), - - /// Operation not permitted. - no_permission = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(ERROR_ACCESS_DENIED), - ASIO_NATIVE_ERROR(EPERM)), - - /// Protocol not available. - no_protocol_option = ASIO_SOCKET_ERROR(ENOPROTOOPT), - - /// No such device. - no_such_device = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(ERROR_BAD_UNIT), - ASIO_NATIVE_ERROR(ENODEV)), - - /// Transport endpoint is not connected. - not_connected = ASIO_SOCKET_ERROR(ENOTCONN), - - /// Socket operation on non-socket. - not_socket = ASIO_SOCKET_ERROR(ENOTSOCK), - - /// Operation cancelled. - operation_aborted = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(ERROR_OPERATION_ABORTED), - ASIO_NATIVE_ERROR(ECANCELED)), - - /// Operation not supported. - operation_not_supported = ASIO_SOCKET_ERROR(EOPNOTSUPP), - - /// Cannot send after transport endpoint shutdown. - shut_down = ASIO_SOCKET_ERROR(ESHUTDOWN), - - /// Connection timed out. - timed_out = ASIO_SOCKET_ERROR(ETIMEDOUT), - - /// Resource temporarily unavailable. - try_again = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(ERROR_RETRY), - ASIO_NATIVE_ERROR(EAGAIN)), - - /// The socket is marked non-blocking and the requested operation would block. - would_block = ASIO_SOCKET_ERROR(EWOULDBLOCK) -}; - -enum netdb_errors -{ - /// Host not found (authoritative). - host_not_found = ASIO_NETDB_ERROR(HOST_NOT_FOUND), - - /// Host not found (non-authoritative). - host_not_found_try_again = ASIO_NETDB_ERROR(TRY_AGAIN), - - /// The query is valid but does not have associated address data. - no_data = ASIO_NETDB_ERROR(NO_DATA), - - /// A non-recoverable error occurred. - no_recovery = ASIO_NETDB_ERROR(NO_RECOVERY) -}; - -enum addrinfo_errors -{ - /// The service is not supported for the given socket type. - service_not_found = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(WSATYPE_NOT_FOUND), - ASIO_GETADDRINFO_ERROR(EAI_SERVICE)), - - /// The socket type is not supported. - socket_type_not_supported = ASIO_WIN_OR_POSIX( - ASIO_NATIVE_ERROR(WSAESOCKTNOSUPPORT), - ASIO_GETADDRINFO_ERROR(EAI_SOCKTYPE)) -}; - -enum misc_errors -{ - /// Already open. - already_open = 1, - - /// End of file or stream. - eof, - - /// Element not found. - not_found, - - /// The descriptor cannot fit into the select system call's fd_set. - fd_set_failure -}; - -inline const asio::error_category& get_system_category() -{ - return asio::system_category(); -} - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -extern ASIO_DECL -const asio::error_category& get_netdb_category(); - -extern ASIO_DECL -const asio::error_category& get_addrinfo_category(); - -#else // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -inline const asio::error_category& get_netdb_category() -{ - return get_system_category(); -} - -inline const asio::error_category& get_addrinfo_category() -{ - return get_system_category(); -} - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -extern ASIO_DECL -const asio::error_category& get_misc_category(); - -static const asio::error_category& - system_category ASIO_UNUSED_VARIABLE - = asio::error::get_system_category(); -static const asio::error_category& - netdb_category ASIO_UNUSED_VARIABLE - = asio::error::get_netdb_category(); -static const asio::error_category& - addrinfo_category ASIO_UNUSED_VARIABLE - = asio::error::get_addrinfo_category(); -static const asio::error_category& - misc_category ASIO_UNUSED_VARIABLE - = asio::error::get_misc_category(); - -} // namespace error -} // namespace asio - -#if defined(ASIO_HAS_STD_SYSTEM_ERROR) -namespace std { - -template<> struct is_error_code_enum -{ - static const bool value = true; -}; - -template<> struct is_error_code_enum -{ - static const bool value = true; -}; - -template<> struct is_error_code_enum -{ - static const bool value = true; -}; - -template<> struct is_error_code_enum -{ - static const bool value = true; -}; - -} // namespace std -#endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -namespace asio { -namespace error { - -inline asio::error_code make_error_code(basic_errors e) -{ - return asio::error_code( - static_cast(e), get_system_category()); -} - -inline asio::error_code make_error_code(netdb_errors e) -{ - return asio::error_code( - static_cast(e), get_netdb_category()); -} - -inline asio::error_code make_error_code(addrinfo_errors e) -{ - return asio::error_code( - static_cast(e), get_addrinfo_category()); -} - -inline asio::error_code make_error_code(misc_errors e) -{ - return asio::error_code( - static_cast(e), get_misc_category()); -} - -} // namespace error -namespace stream_errc { - // Simulates the proposed stream_errc scoped enum. - using error::eof; - using error::not_found; -} // namespace stream_errc -namespace socket_errc { - // Simulates the proposed socket_errc scoped enum. - using error::already_open; - using error::not_found; -} // namespace socket_errc -namespace resolver_errc { - // Simulates the proposed resolver_errc scoped enum. - using error::host_not_found; - const error::netdb_errors try_again = error::host_not_found_try_again; - using error::service_not_found; -} // namespace resolver_errc -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#undef ASIO_NATIVE_ERROR -#undef ASIO_SOCKET_ERROR -#undef ASIO_NETDB_ERROR -#undef ASIO_GETADDRINFO_ERROR -#undef ASIO_WIN_OR_POSIX - -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/error.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_ERROR_HPP diff --git a/scout_sdk/asio/asio/error_code.hpp b/scout_sdk/asio/asio/error_code.hpp deleted file mode 100644 index 7c239e2..0000000 --- a/scout_sdk/asio/asio/error_code.hpp +++ /dev/null @@ -1,202 +0,0 @@ -// -// error_code.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ERROR_CODE_HPP -#define ASIO_ERROR_CODE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_SYSTEM_ERROR) -# include -#else // defined(ASIO_HAS_STD_SYSTEM_ERROR) -# include -# include "asio/detail/noncopyable.hpp" -# if !defined(ASIO_NO_IOSTREAM) -# include -# endif // !defined(ASIO_NO_IOSTREAM) -#endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if defined(ASIO_HAS_STD_SYSTEM_ERROR) - -typedef std::error_category error_category; - -#else // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -/// Base class for all error categories. -class error_category : private noncopyable -{ -public: - /// Destructor. - virtual ~error_category() - { - } - - /// Returns a string naming the error gategory. - virtual const char* name() const = 0; - - /// Returns a string describing the error denoted by @c value. - virtual std::string message(int value) const = 0; - - /// Equality operator to compare two error categories. - bool operator==(const error_category& rhs) const - { - return this == &rhs; - } - - /// Inequality operator to compare two error categories. - bool operator!=(const error_category& rhs) const - { - return !(*this == rhs); - } -}; - -#endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -/// Returns the error category used for the system errors produced by asio. -extern ASIO_DECL const error_category& system_category(); - -#if defined(ASIO_HAS_STD_SYSTEM_ERROR) - -typedef std::error_code error_code; - -#else // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -/// Class to represent an error code value. -class error_code -{ -public: - /// Default constructor. - error_code() - : value_(0), - category_(&system_category()) - { - } - - /// Construct with specific error code and category. - error_code(int v, const error_category& c) - : value_(v), - category_(&c) - { - } - - /// Construct from an error code enum. - template - error_code(ErrorEnum e) - { - *this = make_error_code(e); - } - - /// Clear the error value to the default. - void clear() - { - value_ = 0; - category_ = &system_category(); - } - - /// Assign a new error value. - void assign(int v, const error_category& c) - { - value_ = v; - category_ = &c; - } - - /// Get the error value. - int value() const - { - return value_; - } - - /// Get the error category. - const error_category& category() const - { - return *category_; - } - - /// Get the message associated with the error. - std::string message() const - { - return category_->message(value_); - } - - struct unspecified_bool_type_t - { - }; - - typedef void (*unspecified_bool_type)(unspecified_bool_type_t); - - static void unspecified_bool_true(unspecified_bool_type_t) {} - - /// Operator returns non-null if there is a non-success error code. - operator unspecified_bool_type() const - { - if (value_ == 0) - return 0; - else - return &error_code::unspecified_bool_true; - } - - /// Operator to test if the error represents success. - bool operator!() const - { - return value_ == 0; - } - - /// Equality operator to compare two error objects. - friend bool operator==(const error_code& e1, const error_code& e2) - { - return e1.value_ == e2.value_ && e1.category_ == e2.category_; - } - - /// Inequality operator to compare two error objects. - friend bool operator!=(const error_code& e1, const error_code& e2) - { - return e1.value_ != e2.value_ || e1.category_ != e2.category_; - } - -private: - // The value associated with the error code. - int value_; - - // The category associated with the error code. - const error_category* category_; -}; - -# if !defined(ASIO_NO_IOSTREAM) - -/// Output an error code. -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const error_code& ec) -{ - os << ec.category().name() << ':' << ec.value(); - return os; -} - -# endif // !defined(ASIO_NO_IOSTREAM) - -#endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/error_code.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_ERROR_CODE_HPP diff --git a/scout_sdk/asio/asio/execution_context.hpp b/scout_sdk/asio/asio/execution_context.hpp deleted file mode 100644 index 1476d19..0000000 --- a/scout_sdk/asio/asio/execution_context.hpp +++ /dev/null @@ -1,411 +0,0 @@ -// -// execution_context.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXECUTION_CONTEXT_HPP -#define ASIO_EXECUTION_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/variadic_templates.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -class execution_context; -class io_context; - -#if !defined(GENERATING_DOCUMENTATION) -template Service& use_service(execution_context&); -template Service& use_service(io_context&); -template void add_service(execution_context&, Service*); -template bool has_service(execution_context&); -#endif // !defined(GENERATING_DOCUMENTATION) - -namespace detail { class service_registry; } - -/// A context for function object execution. -/** - * An execution context represents a place where function objects will be - * executed. An @c io_context is an example of an execution context. - * - * @par The execution_context class and services - * - * Class execution_context implements an extensible, type-safe, polymorphic set - * of services, indexed by service type. - * - * Services exist to manage the resources that are shared across an execution - * context. For example, timers may be implemented in terms of a single timer - * queue, and this queue would be stored in a service. - * - * Access to the services of an execution_context is via three function - * templates, use_service(), add_service() and has_service(). - * - * In a call to @c use_service(), the type argument chooses a service, - * making available all members of the named type. If @c Service is not present - * in an execution_context, an object of type @c Service is created and added - * to the execution_context. A C++ program can check if an execution_context - * implements a particular service with the function template @c - * has_service(). - * - * Service objects may be explicitly added to an execution_context using the - * function template @c add_service(). If the @c Service is already - * present, the service_already_exists exception is thrown. If the owner of the - * service is not the same object as the execution_context parameter, the - * invalid_service_owner exception is thrown. - * - * Once a service reference is obtained from an execution_context object by - * calling use_service(), that reference remains usable as long as the owning - * execution_context object exists. - * - * All service implementations have execution_context::service as a public base - * class. Custom services may be implemented by deriving from this class and - * then added to an execution_context using the facilities described above. - * - * @par The execution_context as a base class - * - * Class execution_context may be used only as a base class for concrete - * execution context types. The @c io_context is an example of such a derived - * type. - * - * On destruction, a class that is derived from execution_context must perform - * execution_context::shutdown() followed by - * execution_context::destroy(). - * - * This destruction sequence permits programs to simplify their resource - * management by using @c shared_ptr<>. Where an object's lifetime is tied to - * the lifetime of a connection (or some other sequence of asynchronous - * operations), a @c shared_ptr to the object would be bound into the handlers - * for all asynchronous operations associated with it. This works as follows: - * - * @li When a single connection ends, all associated asynchronous operations - * complete. The corresponding handler objects are destroyed, and all @c - * shared_ptr references to the objects are destroyed. - * - * @li To shut down the whole program, the io_context function stop() is called - * to terminate any run() calls as soon as possible. The io_context destructor - * calls @c shutdown() and @c destroy() to destroy all pending handlers, - * causing all @c shared_ptr references to all connection objects to be - * destroyed. - */ -class execution_context - : private noncopyable -{ -public: - class id; - class service; - -protected: - /// Constructor. - ASIO_DECL execution_context(); - - /// Destructor. - ASIO_DECL ~execution_context(); - - /// Shuts down all services in the context. - /** - * This function is implemented as follows: - * - * @li For each service object @c svc in the execution_context set, in - * reverse order of the beginning of service object lifetime, performs @c - * svc->shutdown(). - */ - ASIO_DECL void shutdown(); - - /// Destroys all services in the context. - /** - * This function is implemented as follows: - * - * @li For each service object @c svc in the execution_context set, in - * reverse order * of the beginning of service object lifetime, performs - * delete static_cast(svc). - */ - ASIO_DECL void destroy(); - -public: - /// Fork-related event notifications. - enum fork_event - { - /// Notify the context that the process is about to fork. - fork_prepare, - - /// Notify the context that the process has forked and is the parent. - fork_parent, - - /// Notify the context that the process has forked and is the child. - fork_child - }; - - /// Notify the execution_context of a fork-related event. - /** - * This function is used to inform the execution_context that the process is - * about to fork, or has just forked. This allows the execution_context, and - * the services it contains, to perform any necessary housekeeping to ensure - * correct operation following a fork. - * - * This function must not be called while any other execution_context - * function, or any function associated with the execution_context's derived - * class, is being called in another thread. It is, however, safe to call - * this function from within a completion handler, provided no other thread - * is accessing the execution_context or its derived class. - * - * @param event A fork-related event. - * - * @throws asio::system_error Thrown on failure. If the notification - * fails the execution_context object should no longer be used and should be - * destroyed. - * - * @par Example - * The following code illustrates how to incorporate the notify_fork() - * function: - * @code my_execution_context.notify_fork(execution_context::fork_prepare); - * if (fork() == 0) - * { - * // This is the child process. - * my_execution_context.notify_fork(execution_context::fork_child); - * } - * else - * { - * // This is the parent process. - * my_execution_context.notify_fork(execution_context::fork_parent); - * } @endcode - * - * @note For each service object @c svc in the execution_context set, - * performs svc->notify_fork();. When processing the fork_prepare - * event, services are visited in reverse order of the beginning of service - * object lifetime. Otherwise, services are visited in order of the beginning - * of service object lifetime. - */ - ASIO_DECL void notify_fork(fork_event event); - - /// Obtain the service object corresponding to the given type. - /** - * This function is used to locate a service object that corresponds to the - * given service type. If there is no existing implementation of the service, - * then the execution_context will create a new instance of the service. - * - * @param e The execution_context object that owns the service. - * - * @return The service interface implementing the specified service type. - * Ownership of the service interface is not transferred to the caller. - */ - template - friend Service& use_service(execution_context& e); - - /// Obtain the service object corresponding to the given type. - /** - * This function is used to locate a service object that corresponds to the - * given service type. If there is no existing implementation of the service, - * then the io_context will create a new instance of the service. - * - * @param ioc The io_context object that owns the service. - * - * @return The service interface implementing the specified service type. - * Ownership of the service interface is not transferred to the caller. - * - * @note This overload is preserved for backwards compatibility with services - * that inherit from io_context::service. - */ - template - friend Service& use_service(io_context& ioc); - -#if defined(GENERATING_DOCUMENTATION) - - /// Creates a service object and adds it to the execution_context. - /** - * This function is used to add a service to the execution_context. - * - * @param e The execution_context object that owns the service. - * - * @param args Zero or more arguments to be passed to the service - * constructor. - * - * @throws asio::service_already_exists Thrown if a service of the - * given type is already present in the execution_context. - */ - template - friend Service& make_service(execution_context& e, Args&&... args); - -#elif defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - friend Service& make_service(execution_context& e, - ASIO_MOVE_ARG(Args)... args); - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - friend Service& make_service(execution_context& e); - -#define ASIO_PRIVATE_MAKE_SERVICE_DEF(n) \ - template \ - friend Service& make_service(execution_context& e, \ - ASIO_VARIADIC_MOVE_PARAMS(n)); \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_MAKE_SERVICE_DEF) -#undef ASIO_PRIVATE_MAKE_SERVICE_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - - /// (Deprecated: Use make_service().) Add a service object to the - /// execution_context. - /** - * This function is used to add a service to the execution_context. - * - * @param e The execution_context object that owns the service. - * - * @param svc The service object. On success, ownership of the service object - * is transferred to the execution_context. When the execution_context object - * is destroyed, it will destroy the service object by performing: @code - * delete static_cast(svc) @endcode - * - * @throws asio::service_already_exists Thrown if a service of the - * given type is already present in the execution_context. - * - * @throws asio::invalid_service_owner Thrown if the service's owning - * execution_context is not the execution_context object specified by the - * @c e parameter. - */ - template - friend void add_service(execution_context& e, Service* svc); - - /// Determine if an execution_context contains a specified service type. - /** - * This function is used to determine whether the execution_context contains a - * service object corresponding to the given service type. - * - * @param e The execution_context object that owns the service. - * - * @return A boolean indicating whether the execution_context contains the - * service. - */ - template - friend bool has_service(execution_context& e); - -private: - // The service registry. - asio::detail::service_registry* service_registry_; -}; - -/// Class used to uniquely identify a service. -class execution_context::id - : private noncopyable -{ -public: - /// Constructor. - id() {} -}; - -/// Base class for all io_context services. -class execution_context::service - : private noncopyable -{ -public: - /// Get the context object that owns the service. - execution_context& context(); - -protected: - /// Constructor. - /** - * @param owner The execution_context object that owns the service. - */ - ASIO_DECL service(execution_context& owner); - - /// Destructor. - ASIO_DECL virtual ~service(); - -private: - /// Destroy all user-defined handler objects owned by the service. - virtual void shutdown() = 0; - - /// Handle notification of a fork-related event to perform any necessary - /// housekeeping. - /** - * This function is not a pure virtual so that services only have to - * implement it if necessary. The default implementation does nothing. - */ - ASIO_DECL virtual void notify_fork( - execution_context::fork_event event); - - friend class asio::detail::service_registry; - struct key - { - key() : type_info_(0), id_(0) {} - const std::type_info* type_info_; - const execution_context::id* id_; - } key_; - - execution_context& owner_; - service* next_; -}; - -/// Exception thrown when trying to add a duplicate service to an -/// execution_context. -class service_already_exists - : public std::logic_error -{ -public: - ASIO_DECL service_already_exists(); -}; - -/// Exception thrown when trying to add a service object to an -/// execution_context where the service has a different owner. -class invalid_service_owner - : public std::logic_error -{ -public: - ASIO_DECL invalid_service_owner(); -}; - -namespace detail { - -// Special derived service id type to keep classes header-file only. -template -class service_id - : public execution_context::id -{ -}; - -// Special service base class to keep classes header-file only. -template -class execution_context_service_base - : public execution_context::service -{ -public: - static service_id id; - - // Constructor. - execution_context_service_base(execution_context& e) - : execution_context::service(e) - { - } -}; - -template -service_id execution_context_service_base::id; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/execution_context.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/execution_context.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_EXECUTION_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/executor.hpp b/scout_sdk/asio/asio/executor.hpp deleted file mode 100644 index e552cfb..0000000 --- a/scout_sdk/asio/asio/executor.hpp +++ /dev/null @@ -1,341 +0,0 @@ -// -// executor.hpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXECUTOR_HPP -#define ASIO_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/cstddef.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Exception thrown when trying to access an empty polymorphic executor. -class bad_executor - : public std::exception -{ -public: - /// Constructor. - ASIO_DECL bad_executor() ASIO_NOEXCEPT; - - /// Obtain message associated with exception. - ASIO_DECL virtual const char* what() const - ASIO_NOEXCEPT_OR_NOTHROW; -}; - -/// Polymorphic wrapper for executors. -class executor -{ -public: - /// Default constructor. - executor() ASIO_NOEXCEPT - : impl_(0) - { - } - - /// Construct from nullptr. - executor(nullptr_t) ASIO_NOEXCEPT - : impl_(0) - { - } - - /// Copy constructor. - executor(const executor& other) ASIO_NOEXCEPT - : impl_(other.clone()) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move constructor. - executor(executor&& other) ASIO_NOEXCEPT - : impl_(other.impl_) - { - other.impl_ = 0; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Construct a polymorphic wrapper for the specified executor. - template - executor(Executor e); - - /// Allocator-aware constructor to create a polymorphic wrapper for the - /// specified executor. - template - executor(allocator_arg_t, const Allocator& a, Executor e); - - /// Destructor. - ~executor() - { - destroy(); - } - - /// Assignment operator. - executor& operator=(const executor& other) ASIO_NOEXCEPT - { - destroy(); - impl_ = other.clone(); - return *this; - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - // Move assignment operator. - executor& operator=(executor&& other) ASIO_NOEXCEPT - { - destroy(); - impl_ = other.impl_; - other.impl_ = 0; - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Assignment operator for nullptr_t. - executor& operator=(nullptr_t) ASIO_NOEXCEPT - { - destroy(); - impl_ = 0; - return *this; - } - - /// Assignment operator to create a polymorphic wrapper for the specified - /// executor. - template - executor& operator=(ASIO_MOVE_ARG(Executor) e) ASIO_NOEXCEPT - { - executor tmp(ASIO_MOVE_CAST(Executor)(e)); - destroy(); - impl_ = tmp.impl_; - tmp.impl_ = 0; - return *this; - } - - /// Obtain the underlying execution context. - execution_context& context() const ASIO_NOEXCEPT - { - return get_impl()->context(); - } - - /// Inform the executor that it has some outstanding work to do. - void on_work_started() const ASIO_NOEXCEPT - { - get_impl()->on_work_started(); - } - - /// Inform the executor that some work is no longer outstanding. - void on_work_finished() const ASIO_NOEXCEPT - { - get_impl()->on_work_finished(); - } - - /// Request the executor to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object is executed according to the rules of the - * target executor object. - * - * @param f The function object to be called. The executor will make a copy - * of the handler object as required. The function signature of the function - * object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the executor to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object is executed according to the rules of the - * target executor object. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the executor to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object is executed according to the rules of the - * target executor object. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - struct unspecified_bool_type_t {}; - typedef void (*unspecified_bool_type)(unspecified_bool_type_t); - static void unspecified_bool_true(unspecified_bool_type_t) {} - - /// Operator to test if the executor contains a valid target. - operator unspecified_bool_type() const ASIO_NOEXCEPT - { - return impl_ ? &executor::unspecified_bool_true : 0; - } - - /// Obtain type information for the target executor object. - /** - * @returns If @c *this has a target type of type @c T, typeid(T); - * otherwise, typeid(void). - */ -#if !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) - const std::type_info& target_type() const ASIO_NOEXCEPT - { - return impl_ ? impl_->target_type() : typeid(void); - } -#else // !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) - const void* target_type() const ASIO_NOEXCEPT - { - return impl_ ? impl_->target_type() : 0; - } -#endif // !defined(ASIO_NO_TYPEID) || defined(GENERATING_DOCUMENTATION) - - /// Obtain a pointer to the target executor object. - /** - * @returns If target_type() == typeid(T), a pointer to the stored - * executor target; otherwise, a null pointer. - */ - template - Executor* target() ASIO_NOEXCEPT; - - /// Obtain a pointer to the target executor object. - /** - * @returns If target_type() == typeid(T), a pointer to the stored - * executor target; otherwise, a null pointer. - */ - template - const Executor* target() const ASIO_NOEXCEPT; - - /// Compare two executors for equality. - friend bool operator==(const executor& a, - const executor& b) ASIO_NOEXCEPT - { - if (a.impl_ == b.impl_) - return true; - if (!a.impl_ || !b.impl_) - return false; - return a.impl_->equals(b.impl_); - } - - /// Compare two executors for inequality. - friend bool operator!=(const executor& a, - const executor& b) ASIO_NOEXCEPT - { - return !(a == b); - } - -private: -#if !defined(GENERATING_DOCUMENTATION) - class function; - template class impl; - -#if !defined(ASIO_NO_TYPEID) - typedef const std::type_info& type_id_result_type; -#else // !defined(ASIO_NO_TYPEID) - typedef const void* type_id_result_type; -#endif // !defined(ASIO_NO_TYPEID) - - template - static type_id_result_type type_id() - { -#if !defined(ASIO_NO_TYPEID) - return typeid(T); -#else // !defined(ASIO_NO_TYPEID) - static int unique_id; - return &unique_id; -#endif // !defined(ASIO_NO_TYPEID) - } - - // Base class for all polymorphic executor implementations. - class impl_base - { - public: - virtual impl_base* clone() const ASIO_NOEXCEPT = 0; - virtual void destroy() ASIO_NOEXCEPT = 0; - virtual execution_context& context() ASIO_NOEXCEPT = 0; - virtual void on_work_started() ASIO_NOEXCEPT = 0; - virtual void on_work_finished() ASIO_NOEXCEPT = 0; - virtual void dispatch(ASIO_MOVE_ARG(function)) = 0; - virtual void post(ASIO_MOVE_ARG(function)) = 0; - virtual void defer(ASIO_MOVE_ARG(function)) = 0; - virtual type_id_result_type target_type() const ASIO_NOEXCEPT = 0; - virtual void* target() ASIO_NOEXCEPT = 0; - virtual const void* target() const ASIO_NOEXCEPT = 0; - virtual bool equals(const impl_base* e) const ASIO_NOEXCEPT = 0; - - protected: - impl_base(bool fast_dispatch) : fast_dispatch_(fast_dispatch) {} - virtual ~impl_base() {} - - private: - friend class executor; - const bool fast_dispatch_; - }; - - // Helper function to check and return the implementation pointer. - impl_base* get_impl() const - { - if (!impl_) - { - bad_executor ex; - asio::detail::throw_exception(ex); - } - return impl_; - } - - // Helper function to clone another implementation. - impl_base* clone() const ASIO_NOEXCEPT - { - return impl_ ? impl_->clone() : 0; - } - - // Helper function to destroy an implementation. - void destroy() ASIO_NOEXCEPT - { - if (impl_) - impl_->destroy(); - } - - impl_base* impl_; -#endif // !defined(GENERATING_DOCUMENTATION) -}; - -} // namespace asio - -ASIO_USES_ALLOCATOR(asio::executor) - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/executor.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/executor.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/executor_work_guard.hpp b/scout_sdk/asio/asio/executor_work_guard.hpp deleted file mode 100644 index 1875f54..0000000 --- a/scout_sdk/asio/asio/executor_work_guard.hpp +++ /dev/null @@ -1,170 +0,0 @@ -// -// executor_work_guard.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXECUTOR_WORK_GUARD_HPP -#define ASIO_EXECUTOR_WORK_GUARD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/is_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// An object of type @c executor_work_guard controls ownership of executor work -/// within a scope. -template -class executor_work_guard -{ -public: - /// The underlying executor type. - typedef Executor executor_type; - - /// Constructs a @c executor_work_guard object for the specified executor. - /** - * Stores a copy of @c e and calls on_work_started() on it. - */ - explicit executor_work_guard(const executor_type& e) ASIO_NOEXCEPT - : executor_(e), - owns_(true) - { - executor_.on_work_started(); - } - - /// Copy constructor. - executor_work_guard(const executor_work_guard& other) ASIO_NOEXCEPT - : executor_(other.executor_), - owns_(other.owns_) - { - if (owns_) - executor_.on_work_started(); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move constructor. - executor_work_guard(executor_work_guard&& other) - : executor_(ASIO_MOVE_CAST(Executor)(other.executor_)), - owns_(other.owns_) - { - other.owns_ = false; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destructor. - /** - * Unless the object has already been reset, or is in a moved-from state, - * calls on_work_finished() on the stored executor. - */ - ~executor_work_guard() - { - if (owns_) - executor_.on_work_finished(); - } - - /// Obtain the associated executor. - executor_type get_executor() const ASIO_NOEXCEPT - { - return executor_; - } - - /// Whether the executor_work_guard object owns some outstanding work. - bool owns_work() const ASIO_NOEXCEPT - { - return owns_; - } - - /// Indicate that the work is no longer outstanding. - /* - * Unless the object has already been reset, or is in a moved-from state, - * calls on_work_finished() on the stored executor. - */ - void reset() ASIO_NOEXCEPT - { - if (owns_) - { - executor_.on_work_finished(); - owns_ = false; - } - } - -private: - // Disallow assignment. - executor_work_guard& operator=(const executor_work_guard&); - - executor_type executor_; - bool owns_; -}; - -/// Create an @ref executor_work_guard object. -template -inline executor_work_guard make_work_guard(const Executor& ex, - typename enable_if::value>::type* = 0) -{ - return executor_work_guard(ex); -} - -/// Create an @ref executor_work_guard object. -template -inline executor_work_guard -make_work_guard(ExecutionContext& ctx, - typename enable_if< - is_convertible::value>::type* = 0) -{ - return executor_work_guard( - ctx.get_executor()); -} - -/// Create an @ref executor_work_guard object. -template -inline executor_work_guard::type> -make_work_guard(const T& t, - typename enable_if::value && - !is_convertible::value>::type* = 0) -{ - return executor_work_guard::type>( - associated_executor::get(t)); -} - -/// Create an @ref executor_work_guard object. -template -inline executor_work_guard::type> -make_work_guard(const T& t, const Executor& ex, - typename enable_if::value>::type* = 0) -{ - return executor_work_guard::type>( - associated_executor::get(t, ex)); -} - -/// Create an @ref executor_work_guard object. -template -inline executor_work_guard::type> -make_work_guard(const T& t, ExecutionContext& ctx, - typename enable_if::value && - !is_convertible::value && - is_convertible::value>::type* = 0) -{ - return executor_work_guard::type>( - associated_executor::get( - t, ctx.get_executor())); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_EXECUTOR_WORK_GUARD_HPP diff --git a/scout_sdk/asio/asio/experimental.hpp b/scout_sdk/asio/asio/experimental.hpp deleted file mode 100644 index 5765c37..0000000 --- a/scout_sdk/asio/asio/experimental.hpp +++ /dev/null @@ -1,22 +0,0 @@ -// -// experimental.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2017 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXPERIMENTAL_HPP -#define ASIO_EXPERIMENTAL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/experimental/co_spawn.hpp" -#include "asio/experimental/detached.hpp" -#include "asio/experimental/redirect_error.hpp" - -#endif // ASIO_EXPERIMENTAL_HPP diff --git a/scout_sdk/asio/asio/experimental/co_spawn.hpp b/scout_sdk/asio/asio/experimental/co_spawn.hpp deleted file mode 100644 index cbf5bc5..0000000 --- a/scout_sdk/asio/asio/experimental/co_spawn.hpp +++ /dev/null @@ -1,226 +0,0 @@ -// -// experimental/co_spawn.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXPERIMENTAL_CO_SPAWN_HPP -#define ASIO_EXPERIMENTAL_CO_SPAWN_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/executor.hpp" -#include "asio/strand.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace experimental { -namespace detail { - -using std::experimental::coroutine_handle; - -template class awaiter; -template class awaitee_base; -template class awaitee; -template class await_handler_base; -template -auto co_spawn(const Executor& ex, F&& f, CompletionToken&& token); - -} // namespace detail - -namespace this_coro { - -/// Awaitable type that returns a completion token for the current coroutine. -struct token_t {}; - -/// Awaitable object that returns a completion token for the current coroutine. -constexpr inline token_t token() { return {}; } - -/// Awaitable type that returns the executor of the current coroutine. -struct executor_t {}; - -/// Awaitable object that returns the executor of the current coroutine. -constexpr inline executor_t executor() { return {}; } - -} // namespace this_coro - -/// A completion token that represents the currently executing coroutine. -/** - * The await_token class is used to represent the currently executing - * coroutine. An await_token may be passed as a handler to an asynchronous - * operation. For example: - * - * @code awaitable my_coroutine() - * { - * await_token token = co_await this_coro::token(); - * ... - * std::size_t n = co_await my_socket.async_read_some(buffer, token); - * ... - * } @endcode - * - * The initiating function (async_read_some in the above example) suspends the - * current coroutine. The coroutine is resumed when the asynchronous operation - * completes, and the result of the operation is returned. - */ -template -class await_token -{ -public: - /// The associated executor type. - typedef Executor executor_type; - - /// Copy constructor. - await_token(const await_token& other) noexcept - : awaiter_(other.awaiter_) - { - } - - /// Move constructor. - await_token(await_token&& other) noexcept - : awaiter_(std::exchange(other.awaiter_, nullptr)) - { - } - - /// Get the associated executor. - executor_type get_executor() const noexcept - { - return awaiter_->get_executor(); - } - -private: - // No assignment allowed. - await_token& operator=(const await_token&) = delete; - - template friend class detail::awaitee_base; - template friend class detail::await_handler_base; - - // Private constructor used by awaitee_base. - explicit await_token(detail::awaiter* a) - : awaiter_(a) - { - } - - detail::awaiter* awaiter_; -}; - -/// The return type of a coroutine or asynchronous operation. -template > -class awaitable -{ -public: - /// The type of the awaited value. - typedef T value_type; - - /// The executor type that will be used for the coroutine. - typedef Executor executor_type; - - /// Move constructor. - awaitable(awaitable&& other) noexcept - : awaitee_(std::exchange(other.awaitee_, nullptr)) - { - } - - /// Destructor - ~awaitable() - { - if (awaitee_) - { - detail::coroutine_handle< - detail::awaitee>::from_promise( - *awaitee_).destroy(); - } - } - -#if !defined(GENERATING_DOCUMENTATION) - - // Support for co_await keyword. - bool await_ready() const noexcept - { - return awaitee_->ready(); - } - - // Support for co_await keyword. - void await_suspend(detail::coroutine_handle> h) - { - awaitee_->attach_caller(h); - } - - // Support for co_await keyword. - template - void await_suspend(detail::coroutine_handle> h) - { - awaitee_->attach_caller(h); - } - - // Support for co_await keyword. - T await_resume() - { - return awaitee_->get(); - } - -#endif // !defined(GENERATING_DOCUMENTATION) - -private: - template friend class detail::awaitee; - template friend class detail::await_handler_base; - - // Not copy constructible or copy assignable. - awaitable(const awaitable&) = delete; - awaitable& operator=(const awaitable&) = delete; - - // Construct the awaitable from a coroutine's promise object. - explicit awaitable(detail::awaitee* a) : awaitee_(a) {} - - detail::awaitee* awaitee_; -}; - -/// Spawn a new thread of execution. -template ::value>::type> -inline auto co_spawn(const Executor& ex, F&& f, CompletionToken&& token) -{ - return detail::co_spawn(ex, std::forward(f), - std::forward(token)); -} - -/// Spawn a new thread of execution. -template ::value>::type> -inline auto co_spawn(ExecutionContext& ctx, F&& f, CompletionToken&& token) -{ - return detail::co_spawn(ctx.get_executor(), std::forward(f), - std::forward(token)); -} - -/// Spawn a new thread of execution. -template -inline auto co_spawn(const await_token& parent, - F&& f, CompletionToken&& token) -{ - return detail::co_spawn(parent.get_executor(), std::forward(f), - std::forward(token)); -} - -} // namespace experimental -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/experimental/impl/co_spawn.hpp" - -#endif // defined(ASIO_HAS_CO_AWAIT) || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_EXPERIMENTAL_CO_SPAWN_HPP diff --git a/scout_sdk/asio/asio/experimental/detached.hpp b/scout_sdk/asio/asio/experimental/detached.hpp deleted file mode 100644 index d484f18..0000000 --- a/scout_sdk/asio/asio/experimental/detached.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// -// experimental/detached.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXPERIMENTAL_DETACHED_HPP -#define ASIO_EXPERIMENTAL_DETACHED_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace experimental { - -/// Class used to specify that an asynchronous operation is detached. -/** - - * The detached_t class is used to indicate that an asynchronous operation is - * detached. That is, there is no completion handler waiting for the - * operation's result. A detached_t object may be passed as a handler to an - * asynchronous operation, typically using the special value - * @c asio::experimental::detached. For example: - - * @code my_socket.async_send(my_buffer, asio::experimental::detached); - * @endcode - */ -class detached_t -{ -public: - /// Constructor. - ASIO_CONSTEXPR detached_t() - { - } -}; - -/// A special value, similar to std::nothrow. -/** - * See the documentation for asio::experimental::detached_t for a usage - * example. - */ -#if defined(ASIO_HAS_CONSTEXPR) || defined(GENERATING_DOCUMENTATION) -constexpr detached_t detached; -#elif defined(ASIO_MSVC) -__declspec(selectany) detached_t detached; -#endif - -} // namespace experimental -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/experimental/impl/detached.hpp" - -#endif // ASIO_EXPERIMENTAL_DETACHED_HPP diff --git a/scout_sdk/asio/asio/experimental/impl/co_spawn.hpp b/scout_sdk/asio/asio/experimental/impl/co_spawn.hpp deleted file mode 100644 index 8263eff..0000000 --- a/scout_sdk/asio/asio/experimental/impl/co_spawn.hpp +++ /dev/null @@ -1,876 +0,0 @@ -// -// experimental/impl/co_spawn.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXPERIMENTAL_IMPL_CO_SPAWN_HPP -#define ASIO_EXPERIMENTAL_IMPL_CO_SPAWN_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include -#include -#include -#include "asio/async_result.hpp" -#include "asio/detail/thread_context.hpp" -#include "asio/detail/thread_info_base.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/dispatch.hpp" -#include "asio/post.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace experimental { -namespace detail { - -// Promise object for coroutine at top of thread-of-execution "stack". -template -class awaiter -{ -public: - struct deleter - { - void operator()(awaiter* a) - { - if (a) - a->release(); - } - }; - - typedef std::unique_ptr ptr; - - typedef Executor executor_type; - - ~awaiter() - { - if (has_executor_) - static_cast(static_cast(executor_))->~Executor(); - } - - void set_executor(const Executor& ex) - { - new (&executor_) Executor(ex); - has_executor_ = true; - } - - executor_type get_executor() const noexcept - { - return *static_cast(static_cast(executor_)); - } - - awaiter* get_return_object() - { - return this; - } - - auto initial_suspend() - { - return std::experimental::suspend_always(); - } - - auto final_suspend() - { - return std::experimental::suspend_always(); - } - - void return_void() - { - } - - awaiter* add_ref() - { - ++ref_count_; - return this; - } - - void release() - { - if (--ref_count_ == 0) - coroutine_handle::from_promise(*this).destroy(); - } - - void unhandled_exception() - { - pending_exception_ = std::current_exception(); - } - - void rethrow_unhandled_exception() - { - if (pending_exception_) - { - std::exception_ptr ex = std::exchange(pending_exception_, nullptr); - std::rethrow_exception(ex); - } - } - -private: - std::size_t ref_count_ = 0; - std::exception_ptr pending_exception_ = nullptr; - alignas(Executor) unsigned char executor_[sizeof(Executor)]; - bool has_executor_ = false; -}; - -// Base promise for coroutines further down the thread-of-execution "stack". -template -class awaitee_base -{ -public: -#if !defined(ASIO_DISABLE_AWAITEE_RECYCLING) - void* operator new(std::size_t size) - { - return asio::detail::thread_info_base::allocate( - asio::detail::thread_info_base::awaitee_tag(), - asio::detail::thread_context::thread_call_stack::top(), - size); - } - - void operator delete(void* pointer, std::size_t size) - { - asio::detail::thread_info_base::deallocate( - asio::detail::thread_info_base::awaitee_tag(), - asio::detail::thread_context::thread_call_stack::top(), - pointer, size); - } -#endif // !defined(ASIO_DISABLE_AWAITEE_RECYCLING) - - auto initial_suspend() - { - return std::experimental::suspend_never(); - } - - struct final_suspender - { - awaitee_base* this_; - - bool await_ready() const noexcept - { - return false; - } - - void await_suspend(coroutine_handle) - { - this_->wake_caller(); - } - - void await_resume() const noexcept - { - } - }; - - auto final_suspend() - { - return final_suspender{this}; - } - - void set_except(std::exception_ptr e) - { - pending_exception_ = e; - } - - void unhandled_exception() - { - set_except(std::current_exception()); - } - - void rethrow_exception() - { - if (pending_exception_) - { - std::exception_ptr ex = std::exchange(pending_exception_, nullptr); - std::rethrow_exception(ex); - } - } - - awaiter* top() - { - return awaiter_; - } - - coroutine_handle caller() - { - return caller_; - } - - bool ready() const - { - return ready_; - } - - void wake_caller() - { - if (caller_) - caller_.resume(); - else - ready_ = true; - } - - class awaitable_executor - { - public: - explicit awaitable_executor(awaitee_base* a) - : this_(a) - { - } - - bool await_ready() const noexcept - { - return this_->awaiter_ != nullptr; - } - - template - void await_suspend(coroutine_handle> h) noexcept - { - this_->resume_on_attach_ = h; - } - - Executor await_resume() - { - return this_->awaiter_->get_executor(); - } - - private: - awaitee_base* this_; - }; - - awaitable_executor await_transform(this_coro::executor_t) noexcept - { - return awaitable_executor(this); - } - - class awaitable_token - { - public: - explicit awaitable_token(awaitee_base* a) - : this_(a) - { - } - - bool await_ready() const noexcept - { - return this_->awaiter_ != nullptr; - } - - template - void await_suspend(coroutine_handle> h) noexcept - { - this_->resume_on_attach_ = h; - } - - await_token await_resume() - { - return await_token(this_->awaiter_); - } - - private: - awaitee_base* this_; - }; - - awaitable_token await_transform(this_coro::token_t) noexcept - { - return awaitable_token(this); - } - - template - awaitable await_transform(awaitable& t) const - { - return std::move(t); - } - - template - awaitable await_transform(awaitable&& t) const - { - return std::move(t); - } - - std::experimental::suspend_always await_transform( - std::experimental::suspend_always) const - { - return std::experimental::suspend_always(); - } - - void attach_caller(coroutine_handle> h) - { - this->caller_ = h; - this->attach_callees(&h.promise()); - } - - template - void attach_caller(coroutine_handle> h) - { - this->caller_ = h; - if (h.promise().awaiter_) - this->attach_callees(h.promise().awaiter_); - else - h.promise().unattached_callee_ = this; - } - - void attach_callees(awaiter* a) - { - for (awaitee_base* curr = this; curr != nullptr; - curr = std::exchange(curr->unattached_callee_, nullptr)) - { - curr->awaiter_ = a; - if (curr->resume_on_attach_) - return std::exchange(curr->resume_on_attach_, nullptr).resume(); - } - } - -protected: - awaiter* awaiter_ = nullptr; - coroutine_handle caller_ = nullptr; - awaitee_base* unattached_callee_ = nullptr; - std::exception_ptr pending_exception_ = nullptr; - coroutine_handle resume_on_attach_ = nullptr; - bool ready_ = false; -}; - -// Promise object for coroutines further down the thread-of-execution "stack". -template -class awaitee - : public awaitee_base -{ -public: - awaitee() - { - } - - awaitee(awaitee&& other) noexcept - : awaitee_base(std::move(other)) - { - } - - ~awaitee() - { - if (has_result_) - static_cast(static_cast(result_))->~T(); - } - - awaitable get_return_object() - { - return awaitable(this); - }; - - template - void return_value(U&& u) - { - new (&result_) T(std::forward(u)); - has_result_ = true; - } - - T get() - { - this->caller_ = nullptr; - this->rethrow_exception(); - return std::move(*static_cast(static_cast(result_))); - } - -private: - alignas(T) unsigned char result_[sizeof(T)]; - bool has_result_ = false; -}; - -// Promise object for coroutines further down the thread-of-execution "stack". -template -class awaitee - : public awaitee_base -{ -public: - awaitable get_return_object() - { - return awaitable(this); - }; - - void return_void() - { - } - - void get() - { - this->caller_ = nullptr; - this->rethrow_exception(); - } -}; - -template -class awaiter_task -{ -public: - typedef Executor executor_type; - - awaiter_task(awaiter* a) - : awaiter_(a->add_ref()) - { - } - - awaiter_task(awaiter_task&& other) noexcept - : awaiter_(std::exchange(other.awaiter_, nullptr)) - { - } - - ~awaiter_task() - { - if (awaiter_) - { - // Coroutine "stack unwinding" must be performed through the executor. - executor_type ex(awaiter_->get_executor()); - (post)(ex, - [a = std::move(awaiter_)]() mutable - { - typename awaiter::ptr(std::move(a)); - }); - } - } - - executor_type get_executor() const noexcept - { - return awaiter_->get_executor(); - } - -protected: - typename awaiter::ptr awaiter_; -}; - -template -class co_spawn_handler : public awaiter_task -{ -public: - using awaiter_task::awaiter_task; - - void operator()() - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - coroutine_handle>::from_promise(*ptr.get()).resume(); - } -}; - -template -class await_handler_base : public awaiter_task -{ -public: - typedef awaitable awaitable_type; - - await_handler_base(await_token token) - : awaiter_task(token.awaiter_), - awaitee_(nullptr) - { - } - - await_handler_base(await_handler_base&& other) noexcept - : awaiter_task(std::move(other)), - awaitee_(std::exchange(other.awaitee_, nullptr)) - { - } - - void attach_awaitee(const awaitable& a) - { - awaitee_ = a.awaitee_; - } - -protected: - awaitee* awaitee_; -}; - -template class await_handler; - -template -class await_handler - : public await_handler_base -{ -public: - using await_handler_base::await_handler_base; - - void operator()() - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - this->awaitee_->return_void(); - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base -{ -public: - typedef void return_type; - - using await_handler_base::await_handler_base; - - void operator()(const asio::error_code& ec) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - if (ec) - { - this->awaitee_->set_except( - std::make_exception_ptr(asio::system_error(ec))); - } - else - this->awaitee_->return_void(); - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base -{ -public: - using await_handler_base::await_handler_base; - - void operator()(std::exception_ptr ex) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - if (ex) - this->awaitee_->set_except(ex); - else - this->awaitee_->return_void(); - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base -{ -public: - using await_handler_base::await_handler_base; - - template - void operator()(Arg&& arg) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - this->awaitee_->return_value(std::forward(arg)); - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base -{ -public: - using await_handler_base::await_handler_base; - - template - void operator()(const asio::error_code& ec, Arg&& arg) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - if (ec) - { - this->awaitee_->set_except( - std::make_exception_ptr(asio::system_error(ec))); - } - else - this->awaitee_->return_value(std::forward(arg)); - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base -{ -public: - using await_handler_base::await_handler_base; - - template - void operator()(std::exception_ptr ex, Arg&& arg) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - if (ex) - this->awaitee_->set_except(ex); - else - this->awaitee_->return_value(std::forward(arg)); - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base> -{ -public: - using await_handler_base>::await_handler_base; - - template - void operator()(Args&&... args) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - this->awaitee_->return_value( - std::forward_as_tuple(std::forward(args)...)); - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base> -{ -public: - using await_handler_base>::await_handler_base; - - template - void operator()(const asio::error_code& ec, Args&&... args) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - if (ec) - { - this->awaitee_->set_except( - std::make_exception_ptr(asio::system_error(ec))); - } - else - { - this->awaitee_->return_value( - std::forward_as_tuple(std::forward(args)...)); - } - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -class await_handler - : public await_handler_base> -{ -public: - using await_handler_base>::await_handler_base; - - template - void operator()(std::exception_ptr ex, Args&&... args) - { - typename awaiter::ptr ptr(std::move(this->awaiter_)); - if (ex) - this->awaitee_->set_except(ex); - else - { - this->awaitee_->return_value( - std::forward_as_tuple(std::forward(args)...)); - } - this->awaitee_->wake_caller(); - ptr->rethrow_unhandled_exception(); - } -}; - -template -struct awaitable_signature; - -template -struct awaitable_signature> -{ - typedef void type(std::exception_ptr, T); -}; - -template -struct awaitable_signature> -{ - typedef void type(std::exception_ptr); -}; - -template -awaiter* co_spawn_entry_point(awaitable*, - executor_work_guard work_guard, F f, Handler handler) -{ - bool done = false; - - try - { - T t = co_await f(); - - done = true; - - (dispatch)(work_guard.get_executor(), - [handler = std::move(handler), t = std::move(t)]() mutable - { - handler(std::exception_ptr(), std::move(t)); - }); - } - catch (...) - { - if (done) - throw; - - (dispatch)(work_guard.get_executor(), - [handler = std::move(handler), e = std::current_exception()]() mutable - { - handler(e, T()); - }); - } -} - -template -awaiter* co_spawn_entry_point(awaitable*, - executor_work_guard work_guard, F f, Handler handler) -{ - std::exception_ptr e = nullptr; - - try - { - co_await f(); - } - catch (...) - { - e = std::current_exception(); - } - - (dispatch)(work_guard.get_executor(), - [handler = std::move(handler), e]() mutable - { - handler(e); - }); -} - -template -auto co_spawn(const Executor& ex, F&& f, CompletionToken&& token) -{ - typedef typename result_of::type awaitable_type; - typedef typename awaitable_type::executor_type executor_type; - typedef typename awaitable_signature::type signature_type; - - async_completion completion(token); - - executor_type ex2(ex); - auto work_guard = make_work_guard(completion.completion_handler, ex2); - - auto* a = (co_spawn_entry_point)( - static_cast(nullptr), std::move(work_guard), - std::forward(f), std::move(completion.completion_handler)); - - a->set_executor(ex2); - (post)(co_spawn_handler(a)); - - return completion.result.get(); -} - -#if defined(_MSC_VER) -# pragma warning(push) -# pragma warning(disable:4033) -#endif // defined(_MSC_VER) - -#if defined(_MSC_VER) -template T dummy_return() -{ - return std::move(*static_cast(nullptr)); -} - -template <> -inline void dummy_return() -{ -} -#endif // defined(_MSC_VER) - -template -inline Awaitable make_dummy_awaitable() -{ - for (;;) co_await std::experimental::suspend_always(); -#if defined(_MSC_VER) - co_return dummy_return(); -#endif // defined(_MSC_VER) -} - -#if defined(_MSC_VER) -# pragma warning(pop) -#endif // defined(_MSC_VER) - -} // namespace detail -} // namespace experimental - -template -class async_result, R(Args...)> -{ -public: - typedef experimental::detail::await_handler< - Executor, typename decay::type...> completion_handler_type; - - typedef typename experimental::detail::await_handler< - Executor, Args...>::awaitable_type return_type; - - async_result(completion_handler_type& h) - : awaitable_(experimental::detail::make_dummy_awaitable()) - { - h.attach_awaitee(awaitable_); - } - - return_type get() - { - return std::move(awaitable_); - } - -private: - return_type awaitable_; -}; - -#if !defined(ASIO_NO_DEPRECATED) - -template -struct handler_type, R(Args...)> -{ - typedef experimental::detail::await_handler< - Executor, typename decay::type...> type; -}; - -template -class async_result> -{ -public: - typedef typename experimental::detail::await_handler< - Executor, Args...>::awaitable_type type; - - async_result(experimental::detail::await_handler& h) - : awaitable_(experimental::detail::make_dummy_awaitable()) - { - h.attach_awaitee(awaitable_); - } - - type get() - { - return std::move(awaitable_); - } - -private: - type awaitable_; -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -} // namespace asio - -namespace std { namespace experimental { - -template -struct coroutine_traits< - asio::experimental::detail::awaiter*, Args...> -{ - typedef asio::experimental::detail::awaiter promise_type; -}; - -template -struct coroutine_traits< - asio::experimental::awaitable, Args...> -{ - typedef asio::experimental::detail::awaitee promise_type; -}; - -}} // namespace std::experimental - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_EXPERIMENTAL_IMPL_CO_SPAWN_HPP diff --git a/scout_sdk/asio/asio/experimental/impl/detached.hpp b/scout_sdk/asio/asio/experimental/impl/detached.hpp deleted file mode 100644 index 6ce8887..0000000 --- a/scout_sdk/asio/asio/experimental/impl/detached.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// experimental/impl/detached.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXPERIMENTAL_IMPL_DETACHED_HPP -#define ASIO_EXPERIMENTAL_IMPL_DETACHED_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/async_result.hpp" -#include "asio/detail/variadic_templates.hpp" -#include "asio/handler_type.hpp" -#include "asio/system_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace experimental { -namespace detail { - - // Class to adapt a detached_t as a completion handler. - class detached_handler - { - public: - detached_handler(detached_t) - { - } - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - void operator()(Args...) - { - } - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - - void operator()() - { - } - -#define ASIO_PRIVATE_DETACHED_DEF(n) \ - template \ - void operator()(ASIO_VARIADIC_BYVAL_PARAMS(n)) \ - { \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_DETACHED_DEF) -#undef ASIO_PRIVATE_DETACHED_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - }; - -} // namespace detail -} // namespace experimental - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct async_result -{ - typedef asio::experimental::detail::detached_handler - completion_handler_type; - - typedef void return_type; - - explicit async_result(completion_handler_type&) - { - } - - void get() - { - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_EXPERIMENTAL_IMPL_DETACHED_HPP diff --git a/scout_sdk/asio/asio/experimental/impl/redirect_error.hpp b/scout_sdk/asio/asio/experimental/impl/redirect_error.hpp deleted file mode 100644 index d3b97fa..0000000 --- a/scout_sdk/asio/asio/experimental/impl/redirect_error.hpp +++ /dev/null @@ -1,294 +0,0 @@ -// -// experimental/impl/redirect_error.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXPERIMENTAL_IMPL_REDIRECT_ERROR_HPP -#define ASIO_EXPERIMENTAL_IMPL_REDIRECT_ERROR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_executor.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/async_result.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/detail/variadic_templates.hpp" -#include "asio/handler_type.hpp" -#include "asio/system_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace experimental { -namespace detail { - -// Class to adapt a redirect_error_t as a completion handler. -template -class redirect_error_handler -{ -public: - template - redirect_error_handler(redirect_error_t e) - : ec_(e.ec_), - handler_(ASIO_MOVE_CAST(CompletionToken)(e.token_)) - { - } - - void operator()() - { - handler_(); - } - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - typename enable_if< - !is_same::type, asio::error_code>::value - >::type - operator()(ASIO_MOVE_ARG(Arg) arg, ASIO_MOVE_ARG(Args)... args) - { - handler_(ASIO_MOVE_CAST(Arg)(arg), - ASIO_MOVE_CAST(Args)(args)...); - } - - template - void operator()(const asio::error_code& ec, - ASIO_MOVE_ARG(Args)... args) - { - ec_ = ec; - handler_(ASIO_MOVE_CAST(Args)(args)...); - } - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - typename enable_if< - !is_same::type, asio::error_code>::value - >::type - operator()(ASIO_MOVE_ARG(Arg) arg) - { - handler_(ASIO_MOVE_CAST(Arg)(arg)); - } - - void operator()(const asio::error_code& ec) - { - ec_ = ec; - handler_(); - } - -#define ASIO_PRIVATE_REDIRECT_ERROR_DEF(n) \ - template \ - typename enable_if< \ - !is_same::type, asio::error_code>::value \ - >::type \ - operator()(ASIO_MOVE_ARG(Arg) arg, ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - handler_(ASIO_MOVE_CAST(Arg)(arg), \ - ASIO_VARIADIC_MOVE_ARGS(n)); \ - } \ - \ - template \ - void operator()(const asio::error_code& ec, \ - ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - ec_ = ec; \ - handler_(ASIO_VARIADIC_MOVE_ARGS(n)); \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_REDIRECT_ERROR_DEF) -#undef ASIO_PRIVATE_REDIRECT_ERROR_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -//private: - asio::error_code& ec_; - Handler handler_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - redirect_error_handler* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - redirect_error_handler* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - redirect_error_handler* this_handler) -{ - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - redirect_error_handler* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - redirect_error_handler* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -struct redirect_error_signature -{ - typedef Signature type; -}; - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -struct redirect_error_signature -{ - typedef R type(Args...); -}; - -template -struct redirect_error_signature -{ - typedef R type(Args...); -}; - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -struct redirect_error_signature -{ - typedef R type(); -}; - -template -struct redirect_error_signature -{ - typedef R type(); -}; - -#define ASIO_PRIVATE_REDIRECT_ERROR_DEF(n) \ - template \ - struct redirect_error_signature< \ - R(asio::error_code, ASIO_VARIADIC_TARGS(n))> \ - { \ - typedef R type(ASIO_VARIADIC_TARGS(n)); \ - }; \ - \ - template \ - struct redirect_error_signature< \ - R(const asio::error_code&, ASIO_VARIADIC_TARGS(n))> \ - { \ - typedef R type(ASIO_VARIADIC_TARGS(n)); \ - }; \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_REDIRECT_ERROR_DEF) -#undef ASIO_PRIVATE_REDIRECT_ERROR_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -} // namespace detail -} // namespace experimental - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct async_result, Signature> - : async_result::type> -{ - typedef experimental::detail::redirect_error_handler< - typename async_result::type> - ::completion_handler_type> completion_handler_type; - - explicit async_result(completion_handler_type& h) - : async_result::type>(h.handler_) - { - } -}; - -#if !defined(ASIO_NO_DEPRECATED) - -template -struct handler_type, Signature> -{ - typedef experimental::detail::redirect_error_handler< - typename async_result::type> - ::completion_handler_type> type; -}; - -template -struct async_result > - : async_result -{ - explicit async_result( - experimental::detail::redirect_error_handler& h) - : async_result(h.handler_) - { - } -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -struct associated_executor< - experimental::detail::redirect_error_handler, Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const experimental::detail::redirect_error_handler& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -template -struct associated_allocator< - experimental::detail::redirect_error_handler, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const experimental::detail::redirect_error_handler& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_EXPERIMENTAL_IMPL_REDIRECT_ERROR_HPP diff --git a/scout_sdk/asio/asio/experimental/redirect_error.hpp b/scout_sdk/asio/asio/experimental/redirect_error.hpp deleted file mode 100644 index 30e81cf..0000000 --- a/scout_sdk/asio/asio/experimental/redirect_error.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// experimental/redirect_error.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_EXPERIMENTAL_REDIRECT_ERROR_HPP -#define ASIO_EXPERIMENTAL_REDIRECT_ERROR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error_code.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace experimental { - -/// Completion token type used to specify that an error produced by an -/// asynchronous operation is captured to an error_code variable. -/** - * The redirect_error_t class is used to indicate that any error_code produced - * by an asynchronous operation is captured to a specified variable. - */ -template -class redirect_error_t -{ -public: - /// Constructor. - template - redirect_error_t(ASIO_MOVE_ARG(T) completion_token, - asio::error_code& ec) - : token_(ASIO_MOVE_CAST(T)(completion_token)), - ec_(ec) - { - } - -//private: - CompletionToken token_; - asio::error_code& ec_; -}; - -/// Create a completion token to capture error_code values to a variable. -template -inline redirect_error_t::type> redirect_error( - CompletionToken&& completion_token, asio::error_code& ec) -{ - return redirect_error_t::type>( - ASIO_MOVE_CAST(CompletionToken)(completion_token), ec); -} - -} // namespace experimental -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/experimental/impl/redirect_error.hpp" - -#endif // ASIO_EXPERIMENTAL_REDIRECT_ERROR_HPP diff --git a/scout_sdk/asio/asio/generic/basic_endpoint.hpp b/scout_sdk/asio/asio/generic/basic_endpoint.hpp deleted file mode 100644 index 73aa151..0000000 --- a/scout_sdk/asio/asio/generic/basic_endpoint.hpp +++ /dev/null @@ -1,193 +0,0 @@ -// -// generic/basic_endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_GENERIC_BASIC_ENDPOINT_HPP -#define ASIO_GENERIC_BASIC_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/generic/detail/endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace generic { - -/// Describes an endpoint for any socket type. -/** - * The asio::generic::basic_endpoint class template describes an endpoint - * that may be associated with any socket type. - * - * @note The socket types sockaddr type must be able to fit into a - * @c sockaddr_storage structure. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Endpoint. - */ -template -class basic_endpoint -{ -public: - /// The protocol type associated with the endpoint. - typedef Protocol protocol_type; - - /// The type of the endpoint structure. This type is dependent on the - /// underlying implementation of the socket layer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined data_type; -#else - typedef asio::detail::socket_addr_type data_type; -#endif - - /// Default constructor. - basic_endpoint() - { - } - - /// Construct an endpoint from the specified socket address. - basic_endpoint(const void* socket_address, - std::size_t socket_address_size, int socket_protocol = 0) - : impl_(socket_address, socket_address_size, socket_protocol) - { - } - - /// Construct an endpoint from the specific endpoint type. - template - basic_endpoint(const Endpoint& endpoint) - : impl_(endpoint.data(), endpoint.size(), endpoint.protocol().protocol()) - { - } - - /// Copy constructor. - basic_endpoint(const basic_endpoint& other) - : impl_(other.impl_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - basic_endpoint(basic_endpoint&& other) - : impl_(other.impl_) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from another endpoint. - basic_endpoint& operator=(const basic_endpoint& other) - { - impl_ = other.impl_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move-assign from another endpoint. - basic_endpoint& operator=(basic_endpoint&& other) - { - impl_ = other.impl_; - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// The protocol associated with the endpoint. - protocol_type protocol() const - { - return protocol_type(impl_.family(), impl_.protocol()); - } - - /// Get the underlying endpoint in the native type. - data_type* data() - { - return impl_.data(); - } - - /// Get the underlying endpoint in the native type. - const data_type* data() const - { - return impl_.data(); - } - - /// Get the underlying size of the endpoint in the native type. - std::size_t size() const - { - return impl_.size(); - } - - /// Set the underlying size of the endpoint in the native type. - void resize(std::size_t new_size) - { - impl_.resize(new_size); - } - - /// Get the capacity of the endpoint in the native type. - std::size_t capacity() const - { - return impl_.capacity(); - } - - /// Compare two endpoints for equality. - friend bool operator==(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.impl_ == e2.impl_; - } - - /// Compare two endpoints for inequality. - friend bool operator!=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e1.impl_ == e2.impl_); - } - - /// Compare endpoints for ordering. - friend bool operator<(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.impl_ < e2.impl_; - } - - /// Compare endpoints for ordering. - friend bool operator>(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e2.impl_ < e1.impl_; - } - - /// Compare endpoints for ordering. - friend bool operator<=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e2 < e1); - } - - /// Compare endpoints for ordering. - friend bool operator>=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e1 < e2); - } - -private: - // The underlying generic endpoint. - asio::generic::detail::endpoint impl_; -}; - -} // namespace generic -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_GENERIC_BASIC_ENDPOINT_HPP diff --git a/scout_sdk/asio/asio/generic/datagram_protocol.hpp b/scout_sdk/asio/asio/generic/datagram_protocol.hpp deleted file mode 100644 index 8678ad8..0000000 --- a/scout_sdk/asio/asio/generic/datagram_protocol.hpp +++ /dev/null @@ -1,123 +0,0 @@ -// -// generic/datagram_protocol.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_GENERIC_DATAGRAM_PROTOCOL_HPP -#define ASIO_GENERIC_DATAGRAM_PROTOCOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/basic_datagram_socket.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/generic/basic_endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace generic { - -/// Encapsulates the flags needed for a generic datagram-oriented socket. -/** - * The asio::generic::datagram_protocol class contains flags necessary - * for datagram-oriented sockets of any address family and protocol. - * - * @par Examples - * Constructing using a native address family and socket protocol: - * @code datagram_protocol p(AF_INET, IPPROTO_UDP); @endcode - * Constructing from a specific protocol type: - * @code datagram_protocol p(asio::ip::udp::v4()); @endcode - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class datagram_protocol -{ -public: - /// Construct a protocol object for a specific address family and protocol. - datagram_protocol(int address_family, int socket_protocol) - : family_(address_family), - protocol_(socket_protocol) - { - } - - /// Construct a generic protocol object from a specific protocol. - /** - * @throws @c bad_cast Thrown if the source protocol is not datagram-oriented. - */ - template - datagram_protocol(const Protocol& source_protocol) - : family_(source_protocol.family()), - protocol_(source_protocol.protocol()) - { - if (source_protocol.type() != type()) - { - std::bad_cast ex; - asio::detail::throw_exception(ex); - } - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return ASIO_OS_DEF(SOCK_DGRAM); - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return protocol_; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// Compare two protocols for equality. - friend bool operator==(const datagram_protocol& p1, - const datagram_protocol& p2) - { - return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; - } - - /// Compare two protocols for inequality. - friend bool operator!=(const datagram_protocol& p1, - const datagram_protocol& p2) - { - return !(p1 == p2); - } - - /// The type of an endpoint. - typedef basic_endpoint endpoint; - - /// The generic socket type. - typedef basic_datagram_socket socket; - -private: - int family_; - int protocol_; -}; - -} // namespace generic -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_GENERIC_DATAGRAM_PROTOCOL_HPP diff --git a/scout_sdk/asio/asio/generic/detail/endpoint.hpp b/scout_sdk/asio/asio/generic/detail/endpoint.hpp deleted file mode 100644 index 190beb1..0000000 --- a/scout_sdk/asio/asio/generic/detail/endpoint.hpp +++ /dev/null @@ -1,133 +0,0 @@ -// -// generic/detail/endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_GENERIC_DETAIL_ENDPOINT_HPP -#define ASIO_GENERIC_DETAIL_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace generic { -namespace detail { - -// Helper class for implementing a generic socket endpoint. -class endpoint -{ -public: - // Default constructor. - ASIO_DECL endpoint(); - - // Construct an endpoint from the specified raw bytes. - ASIO_DECL endpoint(const void* sock_addr, - std::size_t sock_addr_size, int sock_protocol); - - // Copy constructor. - endpoint(const endpoint& other) - : data_(other.data_), - size_(other.size_), - protocol_(other.protocol_) - { - } - - // Assign from another endpoint. - endpoint& operator=(const endpoint& other) - { - data_ = other.data_; - size_ = other.size_; - protocol_ = other.protocol_; - return *this; - } - - // Get the address family associated with the endpoint. - int family() const - { - return data_.base.sa_family; - } - - // Get the socket protocol associated with the endpoint. - int protocol() const - { - return protocol_; - } - - // Get the underlying endpoint in the native type. - asio::detail::socket_addr_type* data() - { - return &data_.base; - } - - // Get the underlying endpoint in the native type. - const asio::detail::socket_addr_type* data() const - { - return &data_.base; - } - - // Get the underlying size of the endpoint in the native type. - std::size_t size() const - { - return size_; - } - - // Set the underlying size of the endpoint in the native type. - ASIO_DECL void resize(std::size_t size); - - // Get the capacity of the endpoint in the native type. - std::size_t capacity() const - { - return sizeof(asio::detail::sockaddr_storage_type); - } - - // Compare two endpoints for equality. - ASIO_DECL friend bool operator==( - const endpoint& e1, const endpoint& e2); - - // Compare endpoints for ordering. - ASIO_DECL friend bool operator<( - const endpoint& e1, const endpoint& e2); - -private: - // The underlying socket address. - union data_union - { - asio::detail::socket_addr_type base; - asio::detail::sockaddr_storage_type generic; - } data_; - - // The length of the socket address stored in the endpoint. - std::size_t size_; - - // The socket protocol associated with the endpoint. - int protocol_; - - // Initialise with a specified memory. - ASIO_DECL void init(const void* sock_addr, - std::size_t sock_addr_size, int sock_protocol); -}; - -} // namespace detail -} // namespace generic -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/generic/detail/impl/endpoint.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_GENERIC_DETAIL_ENDPOINT_HPP diff --git a/scout_sdk/asio/asio/generic/detail/impl/endpoint.ipp b/scout_sdk/asio/asio/generic/detail/impl/endpoint.ipp deleted file mode 100644 index 227ffe1..0000000 --- a/scout_sdk/asio/asio/generic/detail/impl/endpoint.ipp +++ /dev/null @@ -1,110 +0,0 @@ -// -// generic/detail/impl/endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP -#define ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/error.hpp" -#include "asio/generic/detail/endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace generic { -namespace detail { - -endpoint::endpoint() -{ - init(0, 0, 0); -} - -endpoint::endpoint(const void* sock_addr, - std::size_t sock_addr_size, int sock_protocol) -{ - init(sock_addr, sock_addr_size, sock_protocol); -} - -void endpoint::resize(std::size_t new_size) -{ - if (new_size > sizeof(asio::detail::sockaddr_storage_type)) - { - asio::error_code ec(asio::error::invalid_argument); - asio::detail::throw_error(ec); - } - else - { - size_ = new_size; - protocol_ = 0; - } -} - -bool operator==(const endpoint& e1, const endpoint& e2) -{ - using namespace std; // For memcmp. - return e1.size() == e2.size() && memcmp(e1.data(), e2.data(), e1.size()) == 0; -} - -bool operator<(const endpoint& e1, const endpoint& e2) -{ - if (e1.protocol() < e2.protocol()) - return true; - - if (e1.protocol() > e2.protocol()) - return false; - - using namespace std; // For memcmp. - std::size_t compare_size = e1.size() < e2.size() ? e1.size() : e2.size(); - int compare_result = memcmp(e1.data(), e2.data(), compare_size); - - if (compare_result < 0) - return true; - - if (compare_result > 0) - return false; - - return e1.size() < e2.size(); -} - -void endpoint::init(const void* sock_addr, - std::size_t sock_addr_size, int sock_protocol) -{ - if (sock_addr_size > sizeof(asio::detail::sockaddr_storage_type)) - { - asio::error_code ec(asio::error::invalid_argument); - asio::detail::throw_error(ec); - } - - using namespace std; // For memset and memcpy. - memset(&data_.generic, 0, sizeof(asio::detail::sockaddr_storage_type)); - if (sock_addr_size > 0) - memcpy(&data_.generic, sock_addr, sock_addr_size); - - size_ = sock_addr_size; - protocol_ = sock_protocol; -} - -} // namespace detail -} // namespace generic -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP diff --git a/scout_sdk/asio/asio/generic/raw_protocol.hpp b/scout_sdk/asio/asio/generic/raw_protocol.hpp deleted file mode 100644 index b83dca6..0000000 --- a/scout_sdk/asio/asio/generic/raw_protocol.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// generic/raw_protocol.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_GENERIC_RAW_PROTOCOL_HPP -#define ASIO_GENERIC_RAW_PROTOCOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/basic_raw_socket.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/generic/basic_endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace generic { - -/// Encapsulates the flags needed for a generic raw socket. -/** - * The asio::generic::raw_protocol class contains flags necessary for - * raw sockets of any address family and protocol. - * - * @par Examples - * Constructing using a native address family and socket protocol: - * @code raw_protocol p(AF_INET, IPPROTO_ICMP); @endcode - * Constructing from a specific protocol type: - * @code raw_protocol p(asio::ip::icmp::v4()); @endcode - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class raw_protocol -{ -public: - /// Construct a protocol object for a specific address family and protocol. - raw_protocol(int address_family, int socket_protocol) - : family_(address_family), - protocol_(socket_protocol) - { - } - - /// Construct a generic protocol object from a specific protocol. - /** - * @throws @c bad_cast Thrown if the source protocol is not raw-oriented. - */ - template - raw_protocol(const Protocol& source_protocol) - : family_(source_protocol.family()), - protocol_(source_protocol.protocol()) - { - if (source_protocol.type() != type()) - { - std::bad_cast ex; - asio::detail::throw_exception(ex); - } - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return ASIO_OS_DEF(SOCK_RAW); - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return protocol_; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// Compare two protocols for equality. - friend bool operator==(const raw_protocol& p1, const raw_protocol& p2) - { - return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; - } - - /// Compare two protocols for inequality. - friend bool operator!=(const raw_protocol& p1, const raw_protocol& p2) - { - return !(p1 == p2); - } - - /// The type of an endpoint. - typedef basic_endpoint endpoint; - - /// The generic socket type. - typedef basic_raw_socket socket; - -private: - int family_; - int protocol_; -}; - -} // namespace generic -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_GENERIC_RAW_PROTOCOL_HPP diff --git a/scout_sdk/asio/asio/generic/seq_packet_protocol.hpp b/scout_sdk/asio/asio/generic/seq_packet_protocol.hpp deleted file mode 100644 index f92a4c8..0000000 --- a/scout_sdk/asio/asio/generic/seq_packet_protocol.hpp +++ /dev/null @@ -1,122 +0,0 @@ -// -// generic/seq_packet_protocol.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_GENERIC_SEQ_PACKET_PROTOCOL_HPP -#define ASIO_GENERIC_SEQ_PACKET_PROTOCOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/basic_seq_packet_socket.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/generic/basic_endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace generic { - -/// Encapsulates the flags needed for a generic sequenced packet socket. -/** - * The asio::generic::seq_packet_protocol class contains flags necessary - * for seq_packet-oriented sockets of any address family and protocol. - * - * @par Examples - * Constructing using a native address family and socket protocol: - * @code seq_packet_protocol p(AF_INET, IPPROTO_SCTP); @endcode - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class seq_packet_protocol -{ -public: - /// Construct a protocol object for a specific address family and protocol. - seq_packet_protocol(int address_family, int socket_protocol) - : family_(address_family), - protocol_(socket_protocol) - { - } - - /// Construct a generic protocol object from a specific protocol. - /** - * @throws @c bad_cast Thrown if the source protocol is not based around - * sequenced packets. - */ - template - seq_packet_protocol(const Protocol& source_protocol) - : family_(source_protocol.family()), - protocol_(source_protocol.protocol()) - { - if (source_protocol.type() != type()) - { - std::bad_cast ex; - asio::detail::throw_exception(ex); - } - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return ASIO_OS_DEF(SOCK_SEQPACKET); - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return protocol_; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// Compare two protocols for equality. - friend bool operator==(const seq_packet_protocol& p1, - const seq_packet_protocol& p2) - { - return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; - } - - /// Compare two protocols for inequality. - friend bool operator!=(const seq_packet_protocol& p1, - const seq_packet_protocol& p2) - { - return !(p1 == p2); - } - - /// The type of an endpoint. - typedef basic_endpoint endpoint; - - /// The generic socket type. - typedef basic_seq_packet_socket socket; - -private: - int family_; - int protocol_; -}; - -} // namespace generic -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_GENERIC_SEQ_PACKET_PROTOCOL_HPP diff --git a/scout_sdk/asio/asio/generic/stream_protocol.hpp b/scout_sdk/asio/asio/generic/stream_protocol.hpp deleted file mode 100644 index 8349f25..0000000 --- a/scout_sdk/asio/asio/generic/stream_protocol.hpp +++ /dev/null @@ -1,127 +0,0 @@ -// -// generic/stream_protocol.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_GENERIC_STREAM_PROTOCOL_HPP -#define ASIO_GENERIC_STREAM_PROTOCOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/basic_socket_iostream.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/generic/basic_endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace generic { - -/// Encapsulates the flags needed for a generic stream-oriented socket. -/** - * The asio::generic::stream_protocol class contains flags necessary for - * stream-oriented sockets of any address family and protocol. - * - * @par Examples - * Constructing using a native address family and socket protocol: - * @code stream_protocol p(AF_INET, IPPROTO_TCP); @endcode - * Constructing from a specific protocol type: - * @code stream_protocol p(asio::ip::tcp::v4()); @endcode - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class stream_protocol -{ -public: - /// Construct a protocol object for a specific address family and protocol. - stream_protocol(int address_family, int socket_protocol) - : family_(address_family), - protocol_(socket_protocol) - { - } - - /// Construct a generic protocol object from a specific protocol. - /** - * @throws @c bad_cast Thrown if the source protocol is not stream-oriented. - */ - template - stream_protocol(const Protocol& source_protocol) - : family_(source_protocol.family()), - protocol_(source_protocol.protocol()) - { - if (source_protocol.type() != type()) - { - std::bad_cast ex; - asio::detail::throw_exception(ex); - } - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return ASIO_OS_DEF(SOCK_STREAM); - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return protocol_; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// Compare two protocols for equality. - friend bool operator==(const stream_protocol& p1, const stream_protocol& p2) - { - return p1.family_ == p2.family_ && p1.protocol_ == p2.protocol_; - } - - /// Compare two protocols for inequality. - friend bool operator!=(const stream_protocol& p1, const stream_protocol& p2) - { - return !(p1 == p2); - } - - /// The type of an endpoint. - typedef basic_endpoint endpoint; - - /// The generic socket type. - typedef basic_stream_socket socket; - -#if !defined(ASIO_NO_IOSTREAM) - /// The generic socket iostream type. - typedef basic_socket_iostream iostream; -#endif // !defined(ASIO_NO_IOSTREAM) - -private: - int family_; - int protocol_; -}; - -} // namespace generic -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_GENERIC_STREAM_PROTOCOL_HPP diff --git a/scout_sdk/asio/asio/handler_alloc_hook.hpp b/scout_sdk/asio/asio/handler_alloc_hook.hpp deleted file mode 100644 index d7fe2b0..0000000 --- a/scout_sdk/asio/asio/handler_alloc_hook.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// -// handler_alloc_hook.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HANDLER_ALLOC_HOOK_HPP -#define ASIO_HANDLER_ALLOC_HOOK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default allocation function for handlers. -/** - * Asynchronous operations may need to allocate temporary objects. Since - * asynchronous operations have a handler function object, these temporary - * objects can be said to be associated with the handler. - * - * Implement asio_handler_allocate and asio_handler_deallocate for your own - * handlers to provide custom allocation for these temporary objects. - * - * The default implementation of these allocation hooks uses ::operator - * new and ::operator delete. - * - * @note All temporary objects associated with a handler will be deallocated - * before the upcall to the handler is performed. This allows the same memory to - * be reused for a subsequent asynchronous operation initiated by the handler. - * - * @par Example - * @code - * class my_handler; - * - * void* asio_handler_allocate(std::size_t size, my_handler* context) - * { - * return ::operator new(size); - * } - * - * void asio_handler_deallocate(void* pointer, std::size_t size, - * my_handler* context) - * { - * ::operator delete(pointer); - * } - * @endcode - */ -ASIO_DECL void* asio_handler_allocate( - std::size_t size, ...); - -/// Default deallocation function for handlers. -/** - * Implement asio_handler_allocate and asio_handler_deallocate for your own - * handlers to provide custom allocation for the associated temporary objects. - * - * The default implementation of these allocation hooks uses ::operator - * new and ::operator delete. - * - * @sa asio_handler_allocate. - */ -ASIO_DECL void asio_handler_deallocate( - void* pointer, std::size_t size, ...); - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/handler_alloc_hook.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_HANDLER_ALLOC_HOOK_HPP diff --git a/scout_sdk/asio/asio/handler_continuation_hook.hpp b/scout_sdk/asio/asio/handler_continuation_hook.hpp deleted file mode 100644 index d41d105..0000000 --- a/scout_sdk/asio/asio/handler_continuation_hook.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// handler_continuation_hook.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HANDLER_CONTINUATION_HOOK_HPP -#define ASIO_HANDLER_CONTINUATION_HOOK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default continuation function for handlers. -/** - * Asynchronous operations may represent a continuation of the asynchronous - * control flow associated with the current handler. The implementation can use - * this knowledge to optimise scheduling of the handler. - * - * Implement asio_handler_is_continuation for your own handlers to indicate - * when a handler represents a continuation. - * - * The default implementation of the continuation hook returns false. - * - * @par Example - * @code - * class my_handler; - * - * bool asio_handler_is_continuation(my_handler* context) - * { - * return true; - * } - * @endcode - */ -inline bool asio_handler_is_continuation(...) -{ - return false; -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_HANDLER_CONTINUATION_HOOK_HPP diff --git a/scout_sdk/asio/asio/handler_invoke_hook.hpp b/scout_sdk/asio/asio/handler_invoke_hook.hpp deleted file mode 100644 index ee618e5..0000000 --- a/scout_sdk/asio/asio/handler_invoke_hook.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// handler_invoke_hook.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HANDLER_INVOKE_HOOK_HPP -#define ASIO_HANDLER_INVOKE_HOOK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/** @defgroup asio_handler_invoke asio::asio_handler_invoke - * - * @brief Default invoke function for handlers. - * - * Completion handlers for asynchronous operations are invoked by the - * io_context associated with the corresponding object (e.g. a socket or - * deadline_timer). Certain guarantees are made on when the handler may be - * invoked, in particular that a handler can only be invoked from a thread that - * is currently calling @c run() on the corresponding io_context object. - * Handlers may subsequently be invoked through other objects (such as - * io_context::strand objects) that provide additional guarantees. - * - * When asynchronous operations are composed from other asynchronous - * operations, all intermediate handlers should be invoked using the same - * method as the final handler. This is required to ensure that user-defined - * objects are not accessed in a way that may violate the guarantees. This - * hooking function ensures that the invoked method used for the final handler - * is accessible at each intermediate step. - * - * Implement asio_handler_invoke for your own handlers to specify a custom - * invocation strategy. - * - * This default implementation invokes the function object like so: - * @code function(); @endcode - * If necessary, the default implementation makes a copy of the function object - * so that the non-const operator() can be used. - * - * @par Example - * @code - * class my_handler; - * - * template - * void asio_handler_invoke(Function function, my_handler* context) - * { - * context->strand_.dispatch(function); - * } - * @endcode - */ -/*@{*/ - -/// Default handler invocation hook used for non-const function objects. -template -inline void asio_handler_invoke(Function& function, ...) -{ - function(); -} - -/// Default handler invocation hook used for const function objects. -template -inline void asio_handler_invoke(const Function& function, ...) -{ - Function tmp(function); - tmp(); -} - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_HANDLER_INVOKE_HOOK_HPP diff --git a/scout_sdk/asio/asio/handler_type.hpp b/scout_sdk/asio/asio/handler_type.hpp deleted file mode 100644 index bc0d305..0000000 --- a/scout_sdk/asio/asio/handler_type.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// handler_type.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HANDLER_TYPE_HPP -#define ASIO_HANDLER_TYPE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// (Deprecated: Use two-parameter version of async_result.) Default handler -/// type traits provided for all completion token types. -/** - * The handler_type traits class is used for determining the concrete handler - * type to be used for an asynchronous operation. It allows the handler type to - * be determined at the point where the specific completion handler signature - * is known. - * - * This template may be specialised for user-defined completion token types. - */ -template -struct handler_type -{ - /// The handler type for the specific signature. - typedef typename conditional< - is_same::type>::value, - decay, - handler_type::type, Signature> - >::type::type type; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_HANDLER_TYPE_HPP diff --git a/scout_sdk/asio/asio/high_resolution_timer.hpp b/scout_sdk/asio/asio/high_resolution_timer.hpp deleted file mode 100644 index 0549cc2..0000000 --- a/scout_sdk/asio/asio/high_resolution_timer.hpp +++ /dev/null @@ -1,44 +0,0 @@ -// -// high_resolution_timer.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HIGH_RESOLUTION_TIMER_HPP -#define ASIO_HIGH_RESOLUTION_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_waitable_timer.hpp" -#include "asio/detail/chrono.hpp" - -namespace asio { - -/// Typedef for a timer based on the high resolution clock. -/** - * This typedef uses the C++11 @c <chrono> standard library facility, if - * available. Otherwise, it may use the Boost.Chrono library. To explicitly - * utilise Boost.Chrono, use the basic_waitable_timer template directly: - * @code - * typedef basic_waitable_timer timer; - * @endcode - */ -typedef basic_waitable_timer< - chrono::high_resolution_clock> - high_resolution_timer; - -} // namespace asio - -#endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_HIGH_RESOLUTION_TIMER_HPP diff --git a/scout_sdk/asio/asio/impl/buffered_read_stream.hpp b/scout_sdk/asio/asio/impl/buffered_read_stream.hpp deleted file mode 100644 index e0ed20e..0000000 --- a/scout_sdk/asio/asio/impl/buffered_read_stream.hpp +++ /dev/null @@ -1,429 +0,0 @@ -// -// impl/buffered_read_stream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_BUFFERED_READ_STREAM_HPP -#define ASIO_IMPL_BUFFERED_READ_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -std::size_t buffered_read_stream::fill() -{ - detail::buffer_resize_guard - resize_guard(storage_); - std::size_t previous_size = storage_.size(); - storage_.resize(storage_.capacity()); - storage_.resize(previous_size + next_layer_.read_some(buffer( - storage_.data() + previous_size, - storage_.size() - previous_size))); - resize_guard.commit(); - return storage_.size() - previous_size; -} - -template -std::size_t buffered_read_stream::fill(asio::error_code& ec) -{ - detail::buffer_resize_guard - resize_guard(storage_); - std::size_t previous_size = storage_.size(); - storage_.resize(storage_.capacity()); - storage_.resize(previous_size + next_layer_.read_some(buffer( - storage_.data() + previous_size, - storage_.size() - previous_size), - ec)); - resize_guard.commit(); - return storage_.size() - previous_size; -} - -namespace detail -{ - template - class buffered_fill_handler - { - public: - buffered_fill_handler(detail::buffered_stream_storage& storage, - std::size_t previous_size, ReadHandler& handler) - : storage_(storage), - previous_size_(previous_size), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - buffered_fill_handler(const buffered_fill_handler& other) - : storage_(other.storage_), - previous_size_(other.previous_size_), - handler_(other.handler_) - { - } - - buffered_fill_handler(buffered_fill_handler&& other) - : storage_(other.storage_), - previous_size_(other.previous_size_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - const std::size_t bytes_transferred) - { - storage_.resize(previous_size_ + bytes_transferred); - handler_(ec, bytes_transferred); - } - - //private: - detail::buffered_stream_storage& storage_; - std::size_t previous_size_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - buffered_fill_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - buffered_fill_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - buffered_fill_handler* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - buffered_fill_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - buffered_fill_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::buffered_fill_handler, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const detail::buffered_fill_handler& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::buffered_fill_handler, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const detail::buffered_fill_handler& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -buffered_read_stream::async_fill( - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - std::size_t previous_size = storage_.size(); - storage_.resize(storage_.capacity()); - next_layer_.async_read_some( - buffer( - storage_.data() + previous_size, - storage_.size() - previous_size), - detail::buffered_fill_handler( - storage_, previous_size, init.completion_handler)); - - return init.result.get(); -} - -template -template -std::size_t buffered_read_stream::read_some( - const MutableBufferSequence& buffers) -{ - using asio::buffer_size; - if (buffer_size(buffers) == 0) - return 0; - - if (storage_.empty()) - this->fill(); - - return this->copy(buffers); -} - -template -template -std::size_t buffered_read_stream::read_some( - const MutableBufferSequence& buffers, asio::error_code& ec) -{ - ec = asio::error_code(); - - using asio::buffer_size; - if (buffer_size(buffers) == 0) - return 0; - - if (storage_.empty() && !this->fill(ec)) - return 0; - - return this->copy(buffers); -} - -namespace detail -{ - template - class buffered_read_some_handler - { - public: - buffered_read_some_handler(detail::buffered_stream_storage& storage, - const MutableBufferSequence& buffers, ReadHandler& handler) - : storage_(storage), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - buffered_read_some_handler(const buffered_read_some_handler& other) - : storage_(other.storage_), - buffers_(other.buffers_), - handler_(other.handler_) - { - } - - buffered_read_some_handler(buffered_read_some_handler&& other) - : storage_(other.storage_), - buffers_(other.buffers_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, std::size_t) - { - if (ec || storage_.empty()) - { - const std::size_t length = 0; - handler_(ec, length); - } - else - { - const std::size_t bytes_copied = asio::buffer_copy( - buffers_, storage_.data(), storage_.size()); - storage_.consume(bytes_copied); - handler_(ec, bytes_copied); - } - } - - //private: - detail::buffered_stream_storage& storage_; - MutableBufferSequence buffers_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - buffered_read_some_handler< - MutableBufferSequence, ReadHandler>* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - buffered_read_some_handler< - MutableBufferSequence, ReadHandler>* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - buffered_read_some_handler< - MutableBufferSequence, ReadHandler>* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - buffered_read_some_handler< - MutableBufferSequence, ReadHandler>* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - buffered_read_some_handler< - MutableBufferSequence, ReadHandler>* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::buffered_read_some_handler, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::buffered_read_some_handler< - MutableBufferSequence, ReadHandler>& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::buffered_read_some_handler, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::buffered_read_some_handler< - MutableBufferSequence, ReadHandler>& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -buffered_read_stream::async_read_some( - const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - using asio::buffer_size; - if (buffer_size(buffers) == 0 || !storage_.empty()) - { - next_layer_.async_read_some(ASIO_MUTABLE_BUFFER(0, 0), - detail::buffered_read_some_handler< - MutableBufferSequence, ASIO_HANDLER_TYPE( - ReadHandler, void (asio::error_code, std::size_t))>( - storage_, buffers, init.completion_handler)); - } - else - { - this->async_fill(detail::buffered_read_some_handler< - MutableBufferSequence, ASIO_HANDLER_TYPE( - ReadHandler, void (asio::error_code, std::size_t))>( - storage_, buffers, init.completion_handler)); - } - - return init.result.get(); -} - -template -template -std::size_t buffered_read_stream::peek( - const MutableBufferSequence& buffers) -{ - if (storage_.empty()) - this->fill(); - return this->peek_copy(buffers); -} - -template -template -std::size_t buffered_read_stream::peek( - const MutableBufferSequence& buffers, asio::error_code& ec) -{ - ec = asio::error_code(); - if (storage_.empty() && !this->fill(ec)) - return 0; - return this->peek_copy(buffers); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_BUFFERED_READ_STREAM_HPP diff --git a/scout_sdk/asio/asio/impl/buffered_write_stream.hpp b/scout_sdk/asio/asio/impl/buffered_write_stream.hpp deleted file mode 100644 index bc2d823..0000000 --- a/scout_sdk/asio/asio/impl/buffered_write_stream.hpp +++ /dev/null @@ -1,411 +0,0 @@ -// -// impl/buffered_write_stream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP -#define ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -std::size_t buffered_write_stream::flush() -{ - std::size_t bytes_written = write(next_layer_, - buffer(storage_.data(), storage_.size())); - storage_.consume(bytes_written); - return bytes_written; -} - -template -std::size_t buffered_write_stream::flush(asio::error_code& ec) -{ - std::size_t bytes_written = write(next_layer_, - buffer(storage_.data(), storage_.size()), - transfer_all(), ec); - storage_.consume(bytes_written); - return bytes_written; -} - -namespace detail -{ - template - class buffered_flush_handler - { - public: - buffered_flush_handler(detail::buffered_stream_storage& storage, - WriteHandler& handler) - : storage_(storage), - handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - buffered_flush_handler(const buffered_flush_handler& other) - : storage_(other.storage_), - handler_(other.handler_) - { - } - - buffered_flush_handler(buffered_flush_handler&& other) - : storage_(other.storage_), - handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - const std::size_t bytes_written) - { - storage_.consume(bytes_written); - handler_(ec, bytes_written); - } - - //private: - detail::buffered_stream_storage& storage_; - WriteHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - buffered_flush_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - buffered_flush_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - buffered_flush_handler* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - buffered_flush_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - buffered_flush_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::buffered_flush_handler, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const detail::buffered_flush_handler& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::buffered_flush_handler, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const detail::buffered_flush_handler& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -buffered_write_stream::async_flush( - ASIO_MOVE_ARG(WriteHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - async_write(next_layer_, buffer(storage_.data(), storage_.size()), - detail::buffered_flush_handler( - storage_, init.completion_handler)); - - return init.result.get(); -} - -template -template -std::size_t buffered_write_stream::write_some( - const ConstBufferSequence& buffers) -{ - using asio::buffer_size; - if (buffer_size(buffers) == 0) - return 0; - - if (storage_.size() == storage_.capacity()) - this->flush(); - - return this->copy(buffers); -} - -template -template -std::size_t buffered_write_stream::write_some( - const ConstBufferSequence& buffers, asio::error_code& ec) -{ - ec = asio::error_code(); - - using asio::buffer_size; - if (buffer_size(buffers) == 0) - return 0; - - if (storage_.size() == storage_.capacity() && !flush(ec)) - return 0; - - return this->copy(buffers); -} - -namespace detail -{ - template - class buffered_write_some_handler - { - public: - buffered_write_some_handler(detail::buffered_stream_storage& storage, - const ConstBufferSequence& buffers, WriteHandler& handler) - : storage_(storage), - buffers_(buffers), - handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - buffered_write_some_handler(const buffered_write_some_handler& other) - : storage_(other.storage_), - buffers_(other.buffers_), - handler_(other.handler_) - { - } - - buffered_write_some_handler(buffered_write_some_handler&& other) - : storage_(other.storage_), - buffers_(other.buffers_), - handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, std::size_t) - { - if (ec) - { - const std::size_t length = 0; - handler_(ec, length); - } - else - { - using asio::buffer_size; - std::size_t orig_size = storage_.size(); - std::size_t space_avail = storage_.capacity() - orig_size; - std::size_t bytes_avail = buffer_size(buffers_); - std::size_t length = bytes_avail < space_avail - ? bytes_avail : space_avail; - storage_.resize(orig_size + length); - const std::size_t bytes_copied = asio::buffer_copy( - storage_.data() + orig_size, buffers_, length); - handler_(ec, bytes_copied); - } - } - - //private: - detail::buffered_stream_storage& storage_; - ConstBufferSequence buffers_; - WriteHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - buffered_write_some_handler< - ConstBufferSequence, WriteHandler>* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - buffered_write_some_handler< - ConstBufferSequence, WriteHandler>* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - buffered_write_some_handler< - ConstBufferSequence, WriteHandler>* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - buffered_write_some_handler< - ConstBufferSequence, WriteHandler>* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - buffered_write_some_handler< - ConstBufferSequence, WriteHandler>* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::buffered_write_some_handler, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::buffered_write_some_handler< - ConstBufferSequence, WriteHandler>& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::buffered_write_some_handler, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::buffered_write_some_handler< - ConstBufferSequence, WriteHandler>& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -buffered_write_stream::async_write_some( - const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - using asio::buffer_size; - if (buffer_size(buffers) == 0 - || storage_.size() < storage_.capacity()) - { - next_layer_.async_write_some(ASIO_CONST_BUFFER(0, 0), - detail::buffered_write_some_handler< - ConstBufferSequence, ASIO_HANDLER_TYPE( - WriteHandler, void (asio::error_code, std::size_t))>( - storage_, buffers, init.completion_handler)); - } - else - { - this->async_flush(detail::buffered_write_some_handler< - ConstBufferSequence, ASIO_HANDLER_TYPE( - WriteHandler, void (asio::error_code, std::size_t))>( - storage_, buffers, init.completion_handler)); - } - - return init.result.get(); -} - -template -template -std::size_t buffered_write_stream::copy( - const ConstBufferSequence& buffers) -{ - using asio::buffer_size; - std::size_t orig_size = storage_.size(); - std::size_t space_avail = storage_.capacity() - orig_size; - std::size_t bytes_avail = buffer_size(buffers); - std::size_t length = bytes_avail < space_avail ? bytes_avail : space_avail; - storage_.resize(orig_size + length); - return asio::buffer_copy( - storage_.data() + orig_size, buffers, length); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_BUFFERED_WRITE_STREAM_HPP diff --git a/scout_sdk/asio/asio/impl/connect.hpp b/scout_sdk/asio/asio/impl/connect.hpp deleted file mode 100644 index bff1913..0000000 --- a/scout_sdk/asio/asio/impl/connect.hpp +++ /dev/null @@ -1,860 +0,0 @@ -// -// impl/connect.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_CONNECT_HPP -#define ASIO_IMPL_CONNECT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/post.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - struct default_connect_condition - { - template - bool operator()(const asio::error_code&, const Endpoint&) - { - return true; - } - }; - - template - inline typename Protocol::endpoint deref_connect_result( - Iterator iter, asio::error_code& ec) - { - return ec ? typename Protocol::endpoint() : *iter; - } - - template - struct legacy_connect_condition_helper : T - { - typedef char (*fallback_func_type)(...); - operator fallback_func_type() const; - }; - - template - struct legacy_connect_condition_helper - { - R operator()(Arg1, Arg2) const; - char operator()(...) const; - }; - - template - struct is_legacy_connect_condition - { - static char asio_connect_condition_check(char); - static char (&asio_connect_condition_check(Iterator))[2]; - - static const bool value = - sizeof(asio_connect_condition_check( - (*static_cast*>(0))( - *static_cast(0), - *static_cast(0)))) != 1; - }; - - template - inline Iterator call_connect_condition(ConnectCondition& connect_condition, - const asio::error_code& ec, Iterator next, Iterator end, - typename enable_if::value>::type* = 0) - { - if (next != end) - return connect_condition(ec, next); - return end; - } - - template - inline Iterator call_connect_condition(ConnectCondition& connect_condition, - const asio::error_code& ec, Iterator next, Iterator end, - typename enable_if::value>::type* = 0) - { - for (;next != end; ++next) - if (connect_condition(ec, *next)) - return next; - return end; - } -} - -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, - typename enable_if::value>::type*) -{ - asio::error_code ec; - typename Protocol::endpoint result = connect(s, endpoints, ec); - asio::detail::throw_error(ec, "connect"); - return result; -} - -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, asio::error_code& ec, - typename enable_if::value>::type*) -{ - return detail::deref_connect_result( - connect(s, endpoints.begin(), endpoints.end(), - detail::default_connect_condition(), ec), ec); -} - -#if !defined(ASIO_NO_DEPRECATED) -template -Iterator connect(basic_socket& s, Iterator begin, - typename enable_if::value>::type*) -{ - asio::error_code ec; - Iterator result = connect(s, begin, ec); - asio::detail::throw_error(ec, "connect"); - return result; -} - -template -inline Iterator connect(basic_socket& s, - Iterator begin, asio::error_code& ec, - typename enable_if::value>::type*) -{ - return connect(s, begin, Iterator(), detail::default_connect_condition(), ec); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -template -Iterator connect(basic_socket& s, - Iterator begin, Iterator end) -{ - asio::error_code ec; - Iterator result = connect(s, begin, end, ec); - asio::detail::throw_error(ec, "connect"); - return result; -} - -template -inline Iterator connect(basic_socket& s, - Iterator begin, Iterator end, asio::error_code& ec) -{ - return connect(s, begin, end, detail::default_connect_condition(), ec); -} - -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, ConnectCondition connect_condition, - typename enable_if::value>::type*) -{ - asio::error_code ec; - typename Protocol::endpoint result = connect( - s, endpoints, connect_condition, ec); - asio::detail::throw_error(ec, "connect"); - return result; -} - -template -typename Protocol::endpoint connect( - basic_socket& s, - const EndpointSequence& endpoints, ConnectCondition connect_condition, - asio::error_code& ec, - typename enable_if::value>::type*) -{ - return detail::deref_connect_result( - connect(s, endpoints.begin(), endpoints.end(), - connect_condition, ec), ec); -} - -#if !defined(ASIO_NO_DEPRECATED) -template -Iterator connect(basic_socket& s, - Iterator begin, ConnectCondition connect_condition, - typename enable_if::value>::type*) -{ - asio::error_code ec; - Iterator result = connect(s, begin, connect_condition, ec); - asio::detail::throw_error(ec, "connect"); - return result; -} - -template -inline Iterator connect(basic_socket& s, - Iterator begin, ConnectCondition connect_condition, - asio::error_code& ec, - typename enable_if::value>::type*) -{ - return connect(s, begin, Iterator(), connect_condition, ec); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -template -Iterator connect(basic_socket& s, - Iterator begin, Iterator end, ConnectCondition connect_condition) -{ - asio::error_code ec; - Iterator result = connect(s, begin, end, connect_condition, ec); - asio::detail::throw_error(ec, "connect"); - return result; -} - -template -Iterator connect(basic_socket& s, - Iterator begin, Iterator end, ConnectCondition connect_condition, - asio::error_code& ec) -{ - ec = asio::error_code(); - - for (Iterator iter = begin; iter != end; ++iter) - { - iter = (detail::call_connect_condition(connect_condition, ec, iter, end)); - if (iter != end) - { - s.close(ec); - s.connect(*iter, ec); - if (!ec) - return iter; - } - else - break; - } - - if (!ec) - ec = asio::error::not_found; - - return end; -} - -namespace detail -{ - // Enable the empty base class optimisation for the connect condition. - template - class base_from_connect_condition - { - protected: - explicit base_from_connect_condition( - const ConnectCondition& connect_condition) - : connect_condition_(connect_condition) - { - } - - template - void check_condition(const asio::error_code& ec, - Iterator& iter, Iterator& end) - { - iter = detail::call_connect_condition(connect_condition_, ec, iter, end); - } - - private: - ConnectCondition connect_condition_; - }; - - // The default_connect_condition implementation is essentially a no-op. This - // template specialisation lets us eliminate all costs associated with it. - template <> - class base_from_connect_condition - { - protected: - explicit base_from_connect_condition(const default_connect_condition&) - { - } - - template - void check_condition(const asio::error_code&, Iterator&, Iterator&) - { - } - }; - - template - class range_connect_op : base_from_connect_condition - { - public: - range_connect_op(basic_socket& sock, - const EndpointSequence& endpoints, - const ConnectCondition& connect_condition, - RangeConnectHandler& handler) - : base_from_connect_condition(connect_condition), - socket_(sock), - endpoints_(endpoints), - index_(0), - start_(0), - handler_(ASIO_MOVE_CAST(RangeConnectHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - range_connect_op(const range_connect_op& other) - : base_from_connect_condition(other), - socket_(other.socket_), - endpoints_(other.endpoints_), - index_(other.index_), - start_(other.start_), - handler_(other.handler_) - { - } - - range_connect_op(range_connect_op&& other) - : base_from_connect_condition(other), - socket_(other.socket_), - endpoints_(other.endpoints_), - index_(other.index_), - start_(other.start_), - handler_(ASIO_MOVE_CAST(RangeConnectHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(asio::error_code ec, int start = 0) - { - typename EndpointSequence::const_iterator begin = endpoints_.begin(); - typename EndpointSequence::const_iterator iter = begin; - std::advance(iter, index_); - typename EndpointSequence::const_iterator end = endpoints_.end(); - - switch (start_ = start) - { - case 1: - for (;;) - { - this->check_condition(ec, iter, end); - index_ = std::distance(begin, iter); - - if (iter != end) - { - socket_.close(ec); - socket_.async_connect(*iter, - ASIO_MOVE_CAST(range_connect_op)(*this)); - return; - } - - if (start) - { - ec = asio::error::not_found; - asio::post(socket_.get_executor(), - detail::bind_handler( - ASIO_MOVE_CAST(range_connect_op)(*this), ec)); - return; - } - - default: - - if (iter == end) - break; - - if (!socket_.is_open()) - { - ec = asio::error::operation_aborted; - break; - } - - if (!ec) - break; - - ++iter; - ++index_; - } - - handler_(static_cast(ec), - static_cast( - ec || iter == end ? typename Protocol::endpoint() : *iter)); - } - } - - //private: - basic_socket& socket_; - EndpointSequence endpoints_; - std::size_t index_; - int start_; - RangeConnectHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - range_connect_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - range_connect_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - range_connect_op* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - range_connect_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - range_connect_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - class iterator_connect_op : base_from_connect_condition - { - public: - iterator_connect_op(basic_socket& sock, - const Iterator& begin, const Iterator& end, - const ConnectCondition& connect_condition, - IteratorConnectHandler& handler) - : base_from_connect_condition(connect_condition), - socket_(sock), - iter_(begin), - end_(end), - start_(0), - handler_(ASIO_MOVE_CAST(IteratorConnectHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - iterator_connect_op(const iterator_connect_op& other) - : base_from_connect_condition(other), - socket_(other.socket_), - iter_(other.iter_), - end_(other.end_), - start_(other.start_), - handler_(other.handler_) - { - } - - iterator_connect_op(iterator_connect_op&& other) - : base_from_connect_condition(other), - socket_(other.socket_), - iter_(other.iter_), - end_(other.end_), - start_(other.start_), - handler_(ASIO_MOVE_CAST(IteratorConnectHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(asio::error_code ec, int start = 0) - { - switch (start_ = start) - { - case 1: - for (;;) - { - this->check_condition(ec, iter_, end_); - - if (iter_ != end_) - { - socket_.close(ec); - socket_.async_connect(*iter_, - ASIO_MOVE_CAST(iterator_connect_op)(*this)); - return; - } - - if (start) - { - ec = asio::error::not_found; - asio::post(socket_.get_executor(), - detail::bind_handler( - ASIO_MOVE_CAST(iterator_connect_op)(*this), ec)); - return; - } - - default: - - if (iter_ == end_) - break; - - if (!socket_.is_open()) - { - ec = asio::error::operation_aborted; - break; - } - - if (!ec) - break; - - ++iter_; - } - - handler_(static_cast(ec), - static_cast(iter_)); - } - } - - //private: - basic_socket& socket_; - Iterator iter_; - Iterator end_; - int start_; - IteratorConnectHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - iterator_connect_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - iterator_connect_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - iterator_connect_op* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - iterator_connect_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - iterator_connect_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::range_connect_op, - Allocator> -{ - typedef typename associated_allocator< - RangeConnectHandler, Allocator>::type type; - - static type get( - const detail::range_connect_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::range_connect_op, - Executor> -{ - typedef typename associated_executor< - RangeConnectHandler, Executor>::type type; - - static type get( - const detail::range_connect_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -template -struct associated_allocator< - detail::iterator_connect_op, - Allocator> -{ - typedef typename associated_allocator< - IteratorConnectHandler, Allocator>::type type; - - static type get( - const detail::iterator_connect_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::iterator_connect_op, - Executor> -{ - typedef typename associated_executor< - IteratorConnectHandler, Executor>::type type; - - static type get( - const detail::iterator_connect_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, - void (asio::error_code, typename Protocol::endpoint)) -async_connect(basic_socket& s, - const EndpointSequence& endpoints, - ASIO_MOVE_ARG(RangeConnectHandler) handler, - typename enable_if::value>::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a RangeConnectHandler. - ASIO_RANGE_CONNECT_HANDLER_CHECK( - RangeConnectHandler, handler, typename Protocol::endpoint) type_check; - - async_completion - init(handler); - - detail::range_connect_op(s, - endpoints, detail::default_connect_condition(), - init.completion_handler)(asio::error_code(), 1); - - return init.result.get(); -} - -#if !defined(ASIO_NO_DEPRECATED) -template -inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, - Iterator begin, ASIO_MOVE_ARG(IteratorConnectHandler) handler, - typename enable_if::value>::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a IteratorConnectHandler. - ASIO_ITERATOR_CONNECT_HANDLER_CHECK( - IteratorConnectHandler, handler, Iterator) type_check; - - async_completion init(handler); - - detail::iterator_connect_op(s, - begin, Iterator(), detail::default_connect_condition(), - init.completion_handler)(asio::error_code(), 1); - - return init.result.get(); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -template -inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, - Iterator begin, Iterator end, - ASIO_MOVE_ARG(IteratorConnectHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a IteratorConnectHandler. - ASIO_ITERATOR_CONNECT_HANDLER_CHECK( - IteratorConnectHandler, handler, Iterator) type_check; - - async_completion init(handler); - - detail::iterator_connect_op(s, - begin, end, detail::default_connect_condition(), - init.completion_handler)(asio::error_code(), 1); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(RangeConnectHandler, - void (asio::error_code, typename Protocol::endpoint)) -async_connect(basic_socket& s, - const EndpointSequence& endpoints, ConnectCondition connect_condition, - ASIO_MOVE_ARG(RangeConnectHandler) handler, - typename enable_if::value>::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a RangeConnectHandler. - ASIO_RANGE_CONNECT_HANDLER_CHECK( - RangeConnectHandler, handler, typename Protocol::endpoint) type_check; - - async_completion - init(handler); - - detail::range_connect_op(s, - endpoints, connect_condition, init.completion_handler)( - asio::error_code(), 1); - - return init.result.get(); -} - -#if !defined(ASIO_NO_DEPRECATED) -template -inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, - Iterator begin, ConnectCondition connect_condition, - ASIO_MOVE_ARG(IteratorConnectHandler) handler, - typename enable_if::value>::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a IteratorConnectHandler. - ASIO_ITERATOR_CONNECT_HANDLER_CHECK( - IteratorConnectHandler, handler, Iterator) type_check; - - async_completion init(handler); - - detail::iterator_connect_op(s, - begin, Iterator(), connect_condition, init.completion_handler)( - asio::error_code(), 1); - - return init.result.get(); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -template -inline ASIO_INITFN_RESULT_TYPE(IteratorConnectHandler, - void (asio::error_code, Iterator)) -async_connect(basic_socket& s, - Iterator begin, Iterator end, ConnectCondition connect_condition, - ASIO_MOVE_ARG(IteratorConnectHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a IteratorConnectHandler. - ASIO_ITERATOR_CONNECT_HANDLER_CHECK( - IteratorConnectHandler, handler, Iterator) type_check; - - async_completion init(handler); - - detail::iterator_connect_op(s, - begin, end, connect_condition, init.completion_handler)( - asio::error_code(), 1); - - return init.result.get(); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_CONNECT_HPP diff --git a/scout_sdk/asio/asio/impl/defer.hpp b/scout_sdk/asio/asio/impl/defer.hpp deleted file mode 100644 index a27df0f..0000000 --- a/scout_sdk/asio/asio/impl/defer.hpp +++ /dev/null @@ -1,77 +0,0 @@ -// -// impl/defer.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_DEFER_HPP -#define ASIO_IMPL_DEFER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/work_dispatcher.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - ASIO_MOVE_ARG(CompletionToken) token) -{ - typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; - - async_completion init(token); - - typename associated_executor::type ex( - (get_associated_executor)(init.completion_handler)); - - typename associated_allocator::type alloc( - (get_associated_allocator)(init.completion_handler)); - - ex.defer(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc); - - return init.result.get(); -} - -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type*) -{ - typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; - - async_completion init(token); - - typename associated_allocator::type alloc( - (get_associated_allocator)(init.completion_handler)); - - ex.defer(detail::work_dispatcher(init.completion_handler), alloc); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) defer( - ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type*) -{ - return (defer)(ctx.get_executor(), - ASIO_MOVE_CAST(CompletionToken)(token)); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_DEFER_HPP diff --git a/scout_sdk/asio/asio/impl/dispatch.hpp b/scout_sdk/asio/asio/impl/dispatch.hpp deleted file mode 100644 index 4e11c6b..0000000 --- a/scout_sdk/asio/asio/impl/dispatch.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// impl/dispatch.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_DISPATCH_HPP -#define ASIO_IMPL_DISPATCH_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/work_dispatcher.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( - ASIO_MOVE_ARG(CompletionToken) token) -{ - typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; - - async_completion init(token); - - typename associated_executor::type ex( - (get_associated_executor)(init.completion_handler)); - - typename associated_allocator::type alloc( - (get_associated_allocator)(init.completion_handler)); - - ex.dispatch(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc); - - return init.result.get(); -} - -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( - const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type*) -{ - typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; - - async_completion init(token); - - typename associated_allocator::type alloc( - (get_associated_allocator)(init.completion_handler)); - - ex.dispatch(detail::work_dispatcher( - init.completion_handler), alloc); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) dispatch( - ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type*) -{ - return (dispatch)(ctx.get_executor(), - ASIO_MOVE_CAST(CompletionToken)(token)); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_DISPATCH_HPP diff --git a/scout_sdk/asio/asio/impl/error.ipp b/scout_sdk/asio/asio/impl/error.ipp deleted file mode 100644 index 6b1f33a..0000000 --- a/scout_sdk/asio/asio/impl/error.ipp +++ /dev/null @@ -1,128 +0,0 @@ -// -// impl/error.ipp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_ERROR_IPP -#define ASIO_IMPL_ERROR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace error { - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -namespace detail { - -class netdb_category : public asio::error_category -{ -public: - const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT - { - return "asio.netdb"; - } - - std::string message(int value) const - { - if (value == error::host_not_found) - return "Host not found (authoritative)"; - if (value == error::host_not_found_try_again) - return "Host not found (non-authoritative), try again later"; - if (value == error::no_data) - return "The query is valid, but it does not have associated data"; - if (value == error::no_recovery) - return "A non-recoverable error occurred during database lookup"; - return "asio.netdb error"; - } -}; - -} // namespace detail - -const asio::error_category& get_netdb_category() -{ - static detail::netdb_category instance; - return instance; -} - -namespace detail { - -class addrinfo_category : public asio::error_category -{ -public: - const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT - { - return "asio.addrinfo"; - } - - std::string message(int value) const - { - if (value == error::service_not_found) - return "Service not found"; - if (value == error::socket_type_not_supported) - return "Socket type not supported"; - return "asio.addrinfo error"; - } -}; - -} // namespace detail - -const asio::error_category& get_addrinfo_category() -{ - static detail::addrinfo_category instance; - return instance; -} - -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -namespace detail { - -class misc_category : public asio::error_category -{ -public: - const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT - { - return "asio.misc"; - } - - std::string message(int value) const - { - if (value == error::already_open) - return "Already open"; - if (value == error::eof) - return "End of file"; - if (value == error::not_found) - return "Element not found"; - if (value == error::fd_set_failure) - return "The descriptor does not fit into the select call's fd_set"; - return "asio.misc error"; - } -}; - -} // namespace detail - -const asio::error_category& get_misc_category() -{ - static detail::misc_category instance; - return instance; -} - -} // namespace error -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_ERROR_IPP diff --git a/scout_sdk/asio/asio/impl/error_code.ipp b/scout_sdk/asio/asio/impl/error_code.ipp deleted file mode 100644 index 0c8a827..0000000 --- a/scout_sdk/asio/asio/impl/error_code.ipp +++ /dev/null @@ -1,206 +0,0 @@ -// -// impl/error_code.ipp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_ERROR_CODE_IPP -#define ASIO_IMPL_ERROR_CODE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# include -#elif defined(ASIO_WINDOWS_RUNTIME) -# include -#else -# include -# include -# include -#endif -#include "asio/detail/local_free_on_block_exit.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/error_code.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -class system_category : public error_category -{ -public: - const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT - { - return "asio.system"; - } - - std::string message(int value) const - { -#if defined(ASIO_WINDOWS_RUNTIME) || defined(ASIO_WINDOWS_APP) - std::wstring wmsg(128, wchar_t()); - for (;;) - { - DWORD wlength = ::FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), - &wmsg[0], static_cast(wmsg.size()), 0); - if (wlength == 0 && ::GetLastError() == ERROR_INSUFFICIENT_BUFFER) - { - wmsg.resize(wmsg.size() + wmsg.size() / 2); - continue; - } - if (wlength && wmsg[wlength - 1] == '\n') - --wlength; - if (wlength && wmsg[wlength - 1] == '\r') - --wlength; - if (wlength) - { - std::string msg(wlength * 2, char()); - int length = ::WideCharToMultiByte(CP_ACP, 0, - wmsg.c_str(), static_cast(wlength), - &msg[0], static_cast(wlength * 2), 0, 0); - if (length <= 0) - return "asio.system error"; - msg.resize(static_cast(length)); - return msg; - } - else - return "asio.system error"; - } -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) - char* msg = 0; - DWORD length = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*)&msg, 0, 0); - detail::local_free_on_block_exit local_free_obj(msg); - if (length && msg[length - 1] == '\n') - msg[--length] = '\0'; - if (length && msg[length - 1] == '\r') - msg[--length] = '\0'; - if (length) - return msg; - else - return "asio.system error"; -#else // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__) -#if !defined(__sun) - if (value == ECANCELED) - return "Operation aborted."; -#endif // !defined(__sun) -#if defined(__sun) || defined(__QNX__) || defined(__SYMBIAN32__) - using namespace std; - return strerror(value); -#else - char buf[256] = ""; - using namespace std; - return strerror_result(strerror_r(value, buf, sizeof(buf)), buf); -#endif -#endif // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__) - } - -#if defined(ASIO_HAS_STD_ERROR_CODE) - std::error_condition default_error_condition( - int ev) const ASIO_ERROR_CATEGORY_NOEXCEPT - { - switch (ev) - { - case access_denied: - return std::errc::permission_denied; - case address_family_not_supported: - return std::errc::address_family_not_supported; - case address_in_use: - return std::errc::address_in_use; - case already_connected: - return std::errc::already_connected; - case already_started: - return std::errc::connection_already_in_progress; - case broken_pipe: - return std::errc::broken_pipe; - case connection_aborted: - return std::errc::connection_aborted; - case connection_refused: - return std::errc::connection_refused; - case connection_reset: - return std::errc::connection_reset; - case bad_descriptor: - return std::errc::bad_file_descriptor; - case fault: - return std::errc::bad_address; - case host_unreachable: - return std::errc::host_unreachable; - case in_progress: - return std::errc::operation_in_progress; - case interrupted: - return std::errc::interrupted; - case invalid_argument: - return std::errc::invalid_argument; - case message_size: - return std::errc::message_size; - case name_too_long: - return std::errc::filename_too_long; - case network_down: - return std::errc::network_down; - case network_reset: - return std::errc::network_reset; - case network_unreachable: - return std::errc::network_unreachable; - case no_descriptors: - return std::errc::too_many_files_open; - case no_buffer_space: - return std::errc::no_buffer_space; - case no_memory: - return std::errc::not_enough_memory; - case no_permission: - return std::errc::operation_not_permitted; - case no_protocol_option: - return std::errc::no_protocol_option; - case no_such_device: - return std::errc::no_such_device; - case not_connected: - return std::errc::not_connected; - case not_socket: - return std::errc::not_a_socket; - case operation_aborted: - return std::errc::operation_canceled; - case operation_not_supported: - return std::errc::operation_not_supported; - case shut_down: - return std::make_error_condition(ev, *this); - case timed_out: - return std::errc::timed_out; - case try_again: - return std::errc::resource_unavailable_try_again; - case would_block: - return std::errc::operation_would_block; - default: - return std::make_error_condition(ev, *this); - } -#endif // defined(ASIO_HAS_STD_ERROR_CODE) - -private: - // Helper function to adapt the result from glibc's variant of strerror_r. - static const char* strerror_result(int, const char* s) { return s; } - static const char* strerror_result(const char* s, const char*) { return s; } -}; - -} // namespace detail - -const error_category& system_category() -{ - static detail::system_category instance; - return instance; -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_ERROR_CODE_IPP diff --git a/scout_sdk/asio/asio/impl/execution_context.hpp b/scout_sdk/asio/asio/impl/execution_context.hpp deleted file mode 100644 index 3d1e457..0000000 --- a/scout_sdk/asio/asio/impl/execution_context.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// -// impl/execution_context.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_EXECUTION_CONTEXT_HPP -#define ASIO_IMPL_EXECUTION_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/detail/service_registry.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -inline Service& use_service(execution_context& e) -{ - // Check that Service meets the necessary type requirements. - (void)static_cast(static_cast(0)); - - return e.service_registry_->template use_service(); -} - -#if !defined(GENERATING_DOCUMENTATION) -# if defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -Service& make_service(execution_context& e, ASIO_MOVE_ARG(Args)... args) -{ - detail::scoped_ptr svc( - new Service(e, ASIO_MOVE_CAST(Args)(args)...)); - e.service_registry_->template add_service(svc.get()); - Service& result = *svc; - svc.release(); - return result; -} - -# else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -Service& make_service(execution_context& e) -{ - detail::scoped_ptr svc(new Service(e)); - e.service_registry_->template add_service(svc.get()); - Service& result = *svc; - svc.release(); - return result; -} - -#define ASIO_PRIVATE_MAKE_SERVICE_DEF(n) \ - template \ - Service& make_service(execution_context& e, \ - ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - detail::scoped_ptr svc( \ - new Service(e, ASIO_VARIADIC_MOVE_ARGS(n))); \ - e.service_registry_->template add_service(svc.get()); \ - Service& result = *svc; \ - svc.release(); \ - return result; \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_MAKE_SERVICE_DEF) -#undef ASIO_PRIVATE_MAKE_SERVICE_DEF - -# endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline void add_service(execution_context& e, Service* svc) -{ - // Check that Service meets the necessary type requirements. - (void)static_cast(static_cast(0)); - - e.service_registry_->template add_service(svc); -} - -template -inline bool has_service(execution_context& e) -{ - // Check that Service meets the necessary type requirements. - (void)static_cast(static_cast(0)); - - return e.service_registry_->template has_service(); -} - -inline execution_context& execution_context::service::context() -{ - return owner_; -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_EXECUTION_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/impl/execution_context.ipp b/scout_sdk/asio/asio/impl/execution_context.ipp deleted file mode 100644 index c2b3b21..0000000 --- a/scout_sdk/asio/asio/impl/execution_context.ipp +++ /dev/null @@ -1,82 +0,0 @@ -// -// impl/execution_context.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_EXECUTION_CONTEXT_IPP -#define ASIO_IMPL_EXECUTION_CONTEXT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/execution_context.hpp" -#include "asio/detail/service_registry.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -execution_context::execution_context() - : service_registry_(new asio::detail::service_registry(*this)) -{ -} - -execution_context::~execution_context() -{ - shutdown(); - destroy(); - delete service_registry_; -} - -void execution_context::shutdown() -{ - service_registry_->shutdown_services(); -} - -void execution_context::destroy() -{ - service_registry_->destroy_services(); -} - -void execution_context::notify_fork( - asio::execution_context::fork_event event) -{ - service_registry_->notify_fork(event); -} - -execution_context::service::service(execution_context& owner) - : owner_(owner), - next_(0) -{ -} - -execution_context::service::~service() -{ -} - -void execution_context::service::notify_fork(execution_context::fork_event) -{ -} - -service_already_exists::service_already_exists() - : std::logic_error("Service already exists.") -{ -} - -invalid_service_owner::invalid_service_owner() - : std::logic_error("Invalid service owner.") -{ -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_EXECUTION_CONTEXT_IPP diff --git a/scout_sdk/asio/asio/impl/executor.hpp b/scout_sdk/asio/asio/impl/executor.hpp deleted file mode 100644 index 0fcf5f5..0000000 --- a/scout_sdk/asio/asio/impl/executor.hpp +++ /dev/null @@ -1,386 +0,0 @@ -// -// impl/executor.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_EXECUTOR_HPP -#define ASIO_IMPL_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/atomic_count.hpp" -#include "asio/detail/executor_op.hpp" -#include "asio/detail/global.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/recycling_allocator.hpp" -#include "asio/executor.hpp" -#include "asio/system_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if !defined(GENERATING_DOCUMENTATION) - -#if defined(ASIO_HAS_MOVE) - -// Lightweight, move-only function object wrapper. -class executor::function -{ -public: - template - explicit function(F f, const Alloc& a) - { - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - op_ = new (p.v) op(ASIO_MOVE_CAST(F)(f), a); - p.v = 0; - } - - function(function&& other) - : op_(other.op_) - { - other.op_ = 0; - } - - ~function() - { - if (op_) - op_->destroy(); - } - - void operator()() - { - if (op_) - { - detail::scheduler_operation* op = op_; - op_ = 0; - op->complete(this, asio::error_code(), 0); - } - } - -private: - detail::scheduler_operation* op_; -}; - -#else // defined(ASIO_HAS_MOVE) - -// Not so lightweight, copyable function object wrapper. -class executor::function -{ -public: - template - explicit function(const F& f, const Alloc&) - : impl_(new impl(f)) - { - } - - void operator()() - { - impl_->invoke_(impl_.get()); - } - -private: - // Base class for polymorphic function implementations. - struct impl_base - { - void (*invoke_)(impl_base*); - }; - - // Polymorphic function implementation. - template - struct impl : impl_base - { - impl(const F& f) - : function_(f) - { - invoke_ = &function::invoke; - } - - F function_; - }; - - // Helper to invoke a function. - template - static void invoke(impl_base* i) - { - static_cast*>(i)->function_(); - } - - detail::shared_ptr impl_; -}; - -#endif // defined(ASIO_HAS_MOVE) - -// Default polymorphic allocator implementation. -template -class executor::impl - : public executor::impl_base -{ -public: - typedef ASIO_REBIND_ALLOC(Allocator, impl) allocator_type; - - static impl_base* create(const Executor& e, Allocator a = Allocator()) - { - raw_mem mem(a); - impl* p = new (mem.ptr_) impl(e, a); - mem.ptr_ = 0; - return p; - } - - impl(const Executor& e, const Allocator& a) ASIO_NOEXCEPT - : impl_base(false), - ref_count_(1), - executor_(e), - allocator_(a) - { - } - - impl_base* clone() const ASIO_NOEXCEPT - { - ++ref_count_; - return const_cast(static_cast(this)); - } - - void destroy() ASIO_NOEXCEPT - { - if (--ref_count_ == 0) - { - allocator_type alloc(allocator_); - impl* p = this; - p->~impl(); - alloc.deallocate(p, 1); - } - } - - void on_work_started() ASIO_NOEXCEPT - { - executor_.on_work_started(); - } - - void on_work_finished() ASIO_NOEXCEPT - { - executor_.on_work_finished(); - } - - execution_context& context() ASIO_NOEXCEPT - { - return executor_.context(); - } - - void dispatch(ASIO_MOVE_ARG(function) f) - { - executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_); - } - - void post(ASIO_MOVE_ARG(function) f) - { - executor_.post(ASIO_MOVE_CAST(function)(f), allocator_); - } - - void defer(ASIO_MOVE_ARG(function) f) - { - executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_); - } - - type_id_result_type target_type() const ASIO_NOEXCEPT - { - return type_id(); - } - - void* target() ASIO_NOEXCEPT - { - return &executor_; - } - - const void* target() const ASIO_NOEXCEPT - { - return &executor_; - } - - bool equals(const impl_base* e) const ASIO_NOEXCEPT - { - if (this == e) - return true; - if (target_type() != e->target_type()) - return false; - return executor_ == *static_cast(e->target()); - } - -private: - mutable detail::atomic_count ref_count_; - Executor executor_; - Allocator allocator_; - - struct raw_mem - { - allocator_type allocator_; - impl* ptr_; - - explicit raw_mem(const Allocator& a) - : allocator_(a), - ptr_(allocator_.allocate(1)) - { - } - - ~raw_mem() - { - if (ptr_) - allocator_.deallocate(ptr_, 1); - } - - private: - // Disallow copying and assignment. - raw_mem(const raw_mem&); - raw_mem operator=(const raw_mem&); - }; -}; - -// Polymorphic allocator specialisation for system_executor. -template -class executor::impl - : public executor::impl_base -{ -public: - static impl_base* create(const system_executor&, - const Allocator& = Allocator()) - { - return &detail::global > >(); - } - - impl() - : impl_base(true) - { - } - - impl_base* clone() const ASIO_NOEXCEPT - { - return const_cast(static_cast(this)); - } - - void destroy() ASIO_NOEXCEPT - { - } - - void on_work_started() ASIO_NOEXCEPT - { - executor_.on_work_started(); - } - - void on_work_finished() ASIO_NOEXCEPT - { - executor_.on_work_finished(); - } - - execution_context& context() ASIO_NOEXCEPT - { - return executor_.context(); - } - - void dispatch(ASIO_MOVE_ARG(function) f) - { - executor_.dispatch(ASIO_MOVE_CAST(function)(f), allocator_); - } - - void post(ASIO_MOVE_ARG(function) f) - { - executor_.post(ASIO_MOVE_CAST(function)(f), allocator_); - } - - void defer(ASIO_MOVE_ARG(function) f) - { - executor_.defer(ASIO_MOVE_CAST(function)(f), allocator_); - } - - type_id_result_type target_type() const ASIO_NOEXCEPT - { - return type_id(); - } - - void* target() ASIO_NOEXCEPT - { - return &executor_; - } - - const void* target() const ASIO_NOEXCEPT - { - return &executor_; - } - - bool equals(const impl_base* e) const ASIO_NOEXCEPT - { - return this == e; - } - -private: - system_executor executor_; - Allocator allocator_; -}; - -template -executor::executor(Executor e) - : impl_(impl >::create(e)) -{ -} - -template -executor::executor(allocator_arg_t, const Allocator& a, Executor e) - : impl_(impl::create(e, a)) -{ -} - -template -void executor::dispatch(ASIO_MOVE_ARG(Function) f, - const Allocator& a) const -{ - impl_base* i = get_impl(); - if (i->fast_dispatch_) - system_executor().dispatch(ASIO_MOVE_CAST(Function)(f), a); - else - i->dispatch(function(ASIO_MOVE_CAST(Function)(f), a)); -} - -template -void executor::post(ASIO_MOVE_ARG(Function) f, - const Allocator& a) const -{ - get_impl()->post(function(ASIO_MOVE_CAST(Function)(f), a)); -} - -template -void executor::defer(ASIO_MOVE_ARG(Function) f, - const Allocator& a) const -{ - get_impl()->defer(function(ASIO_MOVE_CAST(Function)(f), a)); -} - -template -Executor* executor::target() ASIO_NOEXCEPT -{ - return impl_ && impl_->target_type() == type_id() - ? static_cast(impl_->target()) : 0; -} - -template -const Executor* executor::target() const ASIO_NOEXCEPT -{ - return impl_ && impl_->target_type() == type_id() - ? static_cast(impl_->target()) : 0; -} - -#endif // !defined(GENERATING_DOCUMENTATION) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/impl/executor.ipp b/scout_sdk/asio/asio/impl/executor.ipp deleted file mode 100644 index 4bd0dc5..0000000 --- a/scout_sdk/asio/asio/impl/executor.ipp +++ /dev/null @@ -1,38 +0,0 @@ -// -// impl/executor.ipp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_EXECUTOR_IPP -#define ASIO_IMPL_EXECUTOR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -bad_executor::bad_executor() ASIO_NOEXCEPT -{ -} - -const char* bad_executor::what() const ASIO_NOEXCEPT_OR_NOTHROW -{ - return "bad executor"; -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_EXECUTOR_IPP diff --git a/scout_sdk/asio/asio/impl/handler_alloc_hook.ipp b/scout_sdk/asio/asio/impl/handler_alloc_hook.ipp deleted file mode 100644 index 909ddac..0000000 --- a/scout_sdk/asio/asio/impl/handler_alloc_hook.ipp +++ /dev/null @@ -1,52 +0,0 @@ -// -// impl/handler_alloc_hook.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP -#define ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/thread_context.hpp" -#include "asio/detail/thread_info_base.hpp" -#include "asio/handler_alloc_hook.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -void* asio_handler_allocate(std::size_t size, ...) -{ -#if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) - return detail::thread_info_base::allocate( - detail::thread_context::thread_call_stack::top(), size); -#else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) - return ::operator new(size); -#endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) -} - -void asio_handler_deallocate(void* pointer, std::size_t size, ...) -{ -#if !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) - detail::thread_info_base::deallocate( - detail::thread_context::thread_call_stack::top(), pointer, size); -#else // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) - (void)size; - ::operator delete(pointer); -#endif // !defined(ASIO_DISABLE_SMALL_BLOCK_RECYCLING) -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_HANDLER_ALLOC_HOOK_IPP diff --git a/scout_sdk/asio/asio/impl/io_context.hpp b/scout_sdk/asio/asio/impl/io_context.hpp deleted file mode 100644 index eaf580d..0000000 --- a/scout_sdk/asio/asio/impl/io_context.hpp +++ /dev/null @@ -1,343 +0,0 @@ -// -// impl/io_context.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_IO_CONTEXT_HPP -#define ASIO_IMPL_IO_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/completion_handler.hpp" -#include "asio/detail/executor_op.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/recycling_allocator.hpp" -#include "asio/detail/service_registry.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -inline Service& use_service(io_context& ioc) -{ - // Check that Service meets the necessary type requirements. - (void)static_cast(static_cast(0)); - (void)static_cast(&Service::id); - - return ioc.service_registry_->template use_service(ioc); -} - -template <> -inline detail::io_context_impl& use_service( - io_context& ioc) -{ - return ioc.impl_; -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_io_context.hpp" -#else -# include "asio/detail/scheduler.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -inline io_context::executor_type -io_context::get_executor() ASIO_NOEXCEPT -{ - return executor_type(*this); -} - -#if defined(ASIO_HAS_CHRONO) - -template -std::size_t io_context::run_for( - const chrono::duration& rel_time) -{ - return this->run_until(chrono::steady_clock::now() + rel_time); -} - -template -std::size_t io_context::run_until( - const chrono::time_point& abs_time) -{ - std::size_t n = 0; - while (this->run_one_until(abs_time)) - if (n != (std::numeric_limits::max)()) - ++n; - return n; -} - -template -std::size_t io_context::run_one_for( - const chrono::duration& rel_time) -{ - return this->run_one_until(chrono::steady_clock::now() + rel_time); -} - -template -std::size_t io_context::run_one_until( - const chrono::time_point& abs_time) -{ - typename Clock::time_point now = Clock::now(); - while (now < abs_time) - { - typename Clock::duration rel_time = abs_time - now; - if (rel_time > chrono::seconds(1)) - rel_time = chrono::seconds(1); - - asio::error_code ec; - std::size_t s = impl_.wait_one( - static_cast(chrono::duration_cast< - chrono::microseconds>(rel_time).count()), ec); - asio::detail::throw_error(ec); - - if (s || impl_.stopped()) - return s; - - now = Clock::now(); - } - - return 0; -} - -#endif // defined(ASIO_HAS_CHRONO) - -#if !defined(ASIO_NO_DEPRECATED) - -inline void io_context::reset() -{ - restart(); -} - -template -ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) -io_context::dispatch(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a LegacyCompletionHandler. - ASIO_LEGACY_COMPLETION_HANDLER_CHECK( - LegacyCompletionHandler, handler) type_check; - - async_completion init(handler); - - if (impl_.can_dispatch()) - { - detail::fenced_block b(detail::fenced_block::full); - asio_handler_invoke_helpers::invoke( - init.completion_handler, init.completion_handler); - } - else - { - // Allocate and construct an operation to wrap the handler. - typedef detail::completion_handler< - typename handler_type::type> op; - typename op::ptr p = { detail::addressof(init.completion_handler), - op::ptr::allocate(init.completion_handler), 0 }; - p.p = new (p.v) op(init.completion_handler); - - ASIO_HANDLER_CREATION((*this, *p.p, - "io_context", this, 0, "dispatch")); - - impl_.do_dispatch(p.p); - p.v = p.p = 0; - } - - return init.result.get(); -} - -template -ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) -io_context::post(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a LegacyCompletionHandler. - ASIO_LEGACY_COMPLETION_HANDLER_CHECK( - LegacyCompletionHandler, handler) type_check; - - async_completion init(handler); - - bool is_continuation = - asio_handler_cont_helpers::is_continuation(init.completion_handler); - - // Allocate and construct an operation to wrap the handler. - typedef detail::completion_handler< - typename handler_type::type> op; - typename op::ptr p = { detail::addressof(init.completion_handler), - op::ptr::allocate(init.completion_handler), 0 }; - p.p = new (p.v) op(init.completion_handler); - - ASIO_HANDLER_CREATION((*this, *p.p, - "io_context", this, 0, "post")); - - impl_.post_immediate_completion(p.p, is_continuation); - p.v = p.p = 0; - - return init.result.get(); -} - -template -#if defined(GENERATING_DOCUMENTATION) -unspecified -#else -inline detail::wrapped_handler -#endif -io_context::wrap(Handler handler) -{ - return detail::wrapped_handler(*this, handler); -} - -#endif // !defined(ASIO_NO_DEPRECATED) - -inline io_context& -io_context::executor_type::context() const ASIO_NOEXCEPT -{ - return io_context_; -} - -inline void -io_context::executor_type::on_work_started() const ASIO_NOEXCEPT -{ - io_context_.impl_.work_started(); -} - -inline void -io_context::executor_type::on_work_finished() const ASIO_NOEXCEPT -{ - io_context_.impl_.work_finished(); -} - -template -void io_context::executor_type::dispatch( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - // Invoke immediately if we are already inside the thread pool. - if (io_context_.impl_.can_dispatch()) - { - // Make a local, non-const copy of the function. - function_type tmp(ASIO_MOVE_CAST(Function)(f)); - - detail::fenced_block b(detail::fenced_block::full); - asio_handler_invoke_helpers::invoke(tmp, tmp); - return; - } - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((this->context(), *p.p, - "io_context", &this->context(), 0, "post")); - - io_context_.impl_.post_immediate_completion(p.p, false); - p.v = p.p = 0; -} - -template -void io_context::executor_type::post( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((this->context(), *p.p, - "io_context", &this->context(), 0, "post")); - - io_context_.impl_.post_immediate_completion(p.p, false); - p.v = p.p = 0; -} - -template -void io_context::executor_type::defer( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((this->context(), *p.p, - "io_context", &this->context(), 0, "defer")); - - io_context_.impl_.post_immediate_completion(p.p, true); - p.v = p.p = 0; -} - -inline bool -io_context::executor_type::running_in_this_thread() const ASIO_NOEXCEPT -{ - return io_context_.impl_.can_dispatch(); -} - -#if !defined(ASIO_NO_DEPRECATED) -inline io_context::work::work(asio::io_context& io_context) - : io_context_impl_(io_context.impl_) -{ - io_context_impl_.work_started(); -} - -inline io_context::work::work(const work& other) - : io_context_impl_(other.io_context_impl_) -{ - io_context_impl_.work_started(); -} - -inline io_context::work::~work() -{ - io_context_impl_.work_finished(); -} - -inline asio::io_context& io_context::work::get_io_context() -{ - return static_cast(io_context_impl_.context()); -} - -inline asio::io_context& io_context::work::get_io_service() -{ - return static_cast(io_context_impl_.context()); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -inline asio::io_context& io_context::service::get_io_context() -{ - return static_cast(context()); -} - -#if !defined(ASIO_NO_DEPRECATED) -inline asio::io_context& io_context::service::get_io_service() -{ - return static_cast(context()); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_IO_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/impl/io_context.ipp b/scout_sdk/asio/asio/impl/io_context.ipp deleted file mode 100644 index 7eb467d..0000000 --- a/scout_sdk/asio/asio/impl/io_context.ipp +++ /dev/null @@ -1,174 +0,0 @@ -// -// impl/io_context.ipp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_IO_CONTEXT_IPP -#define ASIO_IMPL_IO_CONTEXT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/concurrency_hint.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/scoped_ptr.hpp" -#include "asio/detail/service_registry.hpp" -#include "asio/detail/throw_error.hpp" - -#if defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_io_context.hpp" -#else -# include "asio/detail/scheduler.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -io_context::io_context() - : impl_(add_impl(new impl_type(*this, ASIO_CONCURRENCY_HINT_DEFAULT))) -{ -} - -io_context::io_context(int concurrency_hint) - : impl_(add_impl(new impl_type(*this, concurrency_hint == 1 - ? ASIO_CONCURRENCY_HINT_1 : concurrency_hint))) -{ -} - -io_context::impl_type& io_context::add_impl(io_context::impl_type* impl) -{ - asio::detail::scoped_ptr scoped_impl(impl); - asio::add_service(*this, scoped_impl.get()); - return *scoped_impl.release(); -} - -io_context::~io_context() -{ -} - -io_context::count_type io_context::run() -{ - asio::error_code ec; - count_type s = impl_.run(ec); - asio::detail::throw_error(ec); - return s; -} - -#if !defined(ASIO_NO_DEPRECATED) -io_context::count_type io_context::run(asio::error_code& ec) -{ - return impl_.run(ec); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -io_context::count_type io_context::run_one() -{ - asio::error_code ec; - count_type s = impl_.run_one(ec); - asio::detail::throw_error(ec); - return s; -} - -#if !defined(ASIO_NO_DEPRECATED) -io_context::count_type io_context::run_one(asio::error_code& ec) -{ - return impl_.run_one(ec); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -io_context::count_type io_context::poll() -{ - asio::error_code ec; - count_type s = impl_.poll(ec); - asio::detail::throw_error(ec); - return s; -} - -#if !defined(ASIO_NO_DEPRECATED) -io_context::count_type io_context::poll(asio::error_code& ec) -{ - return impl_.poll(ec); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -io_context::count_type io_context::poll_one() -{ - asio::error_code ec; - count_type s = impl_.poll_one(ec); - asio::detail::throw_error(ec); - return s; -} - -#if !defined(ASIO_NO_DEPRECATED) -io_context::count_type io_context::poll_one(asio::error_code& ec) -{ - return impl_.poll_one(ec); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -void io_context::stop() -{ - impl_.stop(); -} - -bool io_context::stopped() const -{ - return impl_.stopped(); -} - -void io_context::restart() -{ - impl_.restart(); -} - -io_context::service::service(asio::io_context& owner) - : execution_context::service(owner) -{ -} - -io_context::service::~service() -{ -} - -void io_context::service::shutdown() -{ -#if !defined(ASIO_NO_DEPRECATED) - shutdown_service(); -#endif // !defined(ASIO_NO_DEPRECATED) -} - -#if !defined(ASIO_NO_DEPRECATED) -void io_context::service::shutdown_service() -{ -} -#endif // !defined(ASIO_NO_DEPRECATED) - -void io_context::service::notify_fork(io_context::fork_event ev) -{ -#if !defined(ASIO_NO_DEPRECATED) - fork_service(ev); -#else // !defined(ASIO_NO_DEPRECATED) - (void)ev; -#endif // !defined(ASIO_NO_DEPRECATED) -} - -#if !defined(ASIO_NO_DEPRECATED) -void io_context::service::fork_service(io_context::fork_event) -{ -} -#endif // !defined(ASIO_NO_DEPRECATED) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_IO_CONTEXT_IPP diff --git a/scout_sdk/asio/asio/impl/post.hpp b/scout_sdk/asio/asio/impl/post.hpp deleted file mode 100644 index 5538953..0000000 --- a/scout_sdk/asio/asio/impl/post.hpp +++ /dev/null @@ -1,77 +0,0 @@ -// -// impl/post.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_POST_HPP -#define ASIO_IMPL_POST_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/detail/work_dispatcher.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( - ASIO_MOVE_ARG(CompletionToken) token) -{ - typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; - - async_completion init(token); - - typename associated_executor::type ex( - (get_associated_executor)(init.completion_handler)); - - typename associated_allocator::type alloc( - (get_associated_allocator)(init.completion_handler)); - - ex.post(ASIO_MOVE_CAST(handler)(init.completion_handler), alloc); - - return init.result.get(); -} - -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( - const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type*) -{ - typedef ASIO_HANDLER_TYPE(CompletionToken, void()) handler; - - async_completion init(token); - - typename associated_allocator::type alloc( - (get_associated_allocator)(init.completion_handler)); - - ex.post(detail::work_dispatcher(init.completion_handler), alloc); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( - ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type*) -{ - return (post)(ctx.get_executor(), - ASIO_MOVE_CAST(CompletionToken)(token)); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_POST_HPP diff --git a/scout_sdk/asio/asio/impl/read.hpp b/scout_sdk/asio/asio/impl/read.hpp deleted file mode 100644 index 603a7a9..0000000 --- a/scout_sdk/asio/asio/impl/read.hpp +++ /dev/null @@ -1,715 +0,0 @@ -// -// impl/read.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_READ_HPP -#define ASIO_IMPL_READ_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/detail/array_fwd.hpp" -#include "asio/detail/base_from_completion_cond.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/consuming_buffers.hpp" -#include "asio/detail/dependent_type.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - template - std::size_t read_buffer_sequence(SyncReadStream& s, - const MutableBufferSequence& buffers, const MutableBufferIterator&, - CompletionCondition completion_condition, asio::error_code& ec) - { - ec = asio::error_code(); - asio::detail::consuming_buffers tmp(buffers); - while (!tmp.empty()) - { - if (std::size_t max_size = detail::adapt_completion_condition_result( - completion_condition(ec, tmp.total_consumed()))) - tmp.consume(s.read_some(tmp.prepare(max_size), ec)); - else - break; - } - return tmp.total_consumed();; - } -} // namespace detail - -template -std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_mutable_buffer_sequence::value - >::type*) -{ - return detail::read_buffer_sequence(s, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, ec); -} - -template -inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - typename enable_if< - is_mutable_buffer_sequence::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = read(s, buffers, transfer_all(), ec); - asio::detail::throw_error(ec, "read"); - return bytes_transferred; -} - -template -inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - asio::error_code& ec, - typename enable_if< - is_mutable_buffer_sequence::value - >::type*) -{ - return read(s, buffers, transfer_all(), ec); -} - -template -inline std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, - typename enable_if< - is_mutable_buffer_sequence::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = read(s, buffers, completion_condition, ec); - asio::detail::throw_error(ec, "read"); - return bytes_transferred; -} - -template -std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - typename decay::type b( - ASIO_MOVE_CAST(DynamicBuffer)(buffers)); - - ec = asio::error_code(); - std::size_t total_transferred = 0; - std::size_t max_size = detail::adapt_completion_condition_result( - completion_condition(ec, total_transferred)); - std::size_t bytes_available = std::min( - std::max(512, b.capacity() - b.size()), - std::min(max_size, b.max_size() - b.size())); - while (bytes_available > 0) - { - std::size_t bytes_transferred = s.read_some(b.prepare(bytes_available), ec); - b.commit(bytes_transferred); - total_transferred += bytes_transferred; - max_size = detail::adapt_completion_condition_result( - completion_condition(ec, total_transferred)); - bytes_available = std::min( - std::max(512, b.capacity() - b.size()), - std::min(max_size, b.max_size() - b.size())); - } - return total_transferred; -} - -template -inline std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = read(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), transfer_all(), ec); - asio::detail::throw_error(ec, "read"); - return bytes_transferred; -} - -template -inline std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - return read(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - transfer_all(), ec); -} - -template -inline std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = read(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), - completion_condition, ec); - asio::detail::throw_error(ec, "read"); - return bytes_transferred; -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -template -inline std::size_t read(SyncReadStream& s, - asio::basic_streambuf& b, - CompletionCondition completion_condition, asio::error_code& ec) -{ - return read(s, basic_streambuf_ref(b), completion_condition, ec); -} - -template -inline std::size_t read(SyncReadStream& s, - asio::basic_streambuf& b) -{ - return read(s, basic_streambuf_ref(b)); -} - -template -inline std::size_t read(SyncReadStream& s, - asio::basic_streambuf& b, - asio::error_code& ec) -{ - return read(s, basic_streambuf_ref(b), ec); -} - -template -inline std::size_t read(SyncReadStream& s, - asio::basic_streambuf& b, - CompletionCondition completion_condition) -{ - return read(s, basic_streambuf_ref(b), completion_condition); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -namespace detail -{ - template - class read_op - : detail::base_from_completion_cond - { - public: - read_op(AsyncReadStream& stream, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, ReadHandler& handler) - : detail::base_from_completion_cond< - CompletionCondition>(completion_condition), - stream_(stream), - buffers_(buffers), - start_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_op(const read_op& other) - : detail::base_from_completion_cond(other), - stream_(other.stream_), - buffers_(other.buffers_), - start_(other.start_), - handler_(other.handler_) - { - } - - read_op(read_op&& other) - : detail::base_from_completion_cond(other), - stream_(other.stream_), - buffers_(other.buffers_), - start_(other.start_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - std::size_t max_size; - switch (start_ = start) - { - case 1: - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - do - { - stream_.async_read_some(buffers_.prepare(max_size), - ASIO_MOVE_CAST(read_op)(*this)); - return; default: - buffers_.consume(bytes_transferred); - if ((!ec && bytes_transferred == 0) || buffers_.empty()) - break; - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - } while (max_size > 0); - - handler_(ec, buffers_.total_consumed()); - } - } - - //private: - AsyncReadStream& stream_; - asio::detail::consuming_buffers buffers_; - int start_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void start_read_buffer_sequence_op(AsyncReadStream& stream, - const MutableBufferSequence& buffers, const MutableBufferIterator&, - CompletionCondition completion_condition, ReadHandler& handler) - { - detail::read_op( - stream, buffers, completion_condition, handler)( - asio::error_code(), 0, 1); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_mutable_buffer_sequence::value - >::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::start_read_buffer_sequence_op(s, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, - init.completion_handler); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_mutable_buffer_sequence::value - >::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::start_read_buffer_sequence_op(s, buffers, - asio::buffer_sequence_begin(buffers), transfer_all(), - init.completion_handler); - - return init.result.get(); -} - -namespace detail -{ - template - class read_dynbuf_op - : detail::base_from_completion_cond - { - public: - template - read_dynbuf_op(AsyncReadStream& stream, - ASIO_MOVE_ARG(BufferSequence) buffers, - CompletionCondition completion_condition, ReadHandler& handler) - : detail::base_from_completion_cond< - CompletionCondition>(completion_condition), - stream_(stream), - buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), - start_(0), - total_transferred_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_dynbuf_op(const read_dynbuf_op& other) - : detail::base_from_completion_cond(other), - stream_(other.stream_), - buffers_(other.buffers_), - start_(other.start_), - total_transferred_(other.total_transferred_), - handler_(other.handler_) - { - } - - read_dynbuf_op(read_dynbuf_op&& other) - : detail::base_from_completion_cond(other), - stream_(other.stream_), - buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), - start_(other.start_), - total_transferred_(other.total_transferred_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - std::size_t max_size, bytes_available; - switch (start_ = start) - { - case 1: - max_size = this->check_for_completion(ec, total_transferred_); - bytes_available = std::min( - std::max(512, - buffers_.capacity() - buffers_.size()), - std::min(max_size, - buffers_.max_size() - buffers_.size())); - for (;;) - { - stream_.async_read_some(buffers_.prepare(bytes_available), - ASIO_MOVE_CAST(read_dynbuf_op)(*this)); - return; default: - total_transferred_ += bytes_transferred; - buffers_.commit(bytes_transferred); - max_size = this->check_for_completion(ec, total_transferred_); - bytes_available = std::min( - std::max(512, - buffers_.capacity() - buffers_.size()), - std::min(max_size, - buffers_.max_size() - buffers_.size())); - if ((!ec && bytes_transferred == 0) || bytes_available == 0) - break; - } - - handler_(ec, static_cast(total_transferred_)); - } - } - - //private: - AsyncReadStream& stream_; - DynamicBuffer buffers_; - int start_; - std::size_t total_transferred_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_dynbuf_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_dynbuf_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_dynbuf_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_dynbuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_dynbuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_dynbuf_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_dynbuf_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_dynbuf_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_dynbuf_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - return async_read(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), - transfer_all(), ASIO_MOVE_CAST(ReadHandler)(handler)); -} - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::read_dynbuf_op::type, - CompletionCondition, ASIO_HANDLER_TYPE( - ReadHandler, void (asio::error_code, std::size_t))>( - s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - completion_condition, init.completion_handler)( - asio::error_code(), 0, 1); - - return init.result.get(); -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, basic_streambuf& b, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - return async_read(s, basic_streambuf_ref(b), - ASIO_MOVE_CAST(ReadHandler)(handler)); -} - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, basic_streambuf& b, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - return async_read(s, basic_streambuf_ref(b), - completion_condition, ASIO_MOVE_CAST(ReadHandler)(handler)); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_READ_HPP diff --git a/scout_sdk/asio/asio/impl/read_at.hpp b/scout_sdk/asio/asio/impl/read_at.hpp deleted file mode 100644 index d736d4d..0000000 --- a/scout_sdk/asio/asio/impl/read_at.hpp +++ /dev/null @@ -1,640 +0,0 @@ -// -// impl/read_at.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_READ_AT_HPP -#define ASIO_IMPL_READ_AT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/detail/array_fwd.hpp" -#include "asio/detail/base_from_completion_cond.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/consuming_buffers.hpp" -#include "asio/detail/dependent_type.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - template - std::size_t read_at_buffer_sequence(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - const MutableBufferIterator&, CompletionCondition completion_condition, - asio::error_code& ec) - { - ec = asio::error_code(); - asio::detail::consuming_buffers tmp(buffers); - while (!tmp.empty()) - { - if (std::size_t max_size = detail::adapt_completion_condition_result( - completion_condition(ec, tmp.total_consumed()))) - { - tmp.consume(d.read_some_at(offset + tmp.total_consumed(), - tmp.prepare(max_size), ec)); - } - else - break; - } - return tmp.total_consumed();; - } -} // namespace detail - -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec) -{ - return detail::read_at_buffer_sequence(d, offset, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, ec); -} - -template -inline std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_at( - d, offset, buffers, transfer_all(), ec); - asio::detail::throw_error(ec, "read_at"); - return bytes_transferred; -} - -template -inline std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - asio::error_code& ec) -{ - return read_at(d, offset, buffers, transfer_all(), ec); -} - -template -inline std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - CompletionCondition completion_condition) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_at( - d, offset, buffers, completion_condition, ec); - asio::detail::throw_error(ec, "read_at"); - return bytes_transferred; -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, asio::basic_streambuf& b, - CompletionCondition completion_condition, asio::error_code& ec) -{ - ec = asio::error_code(); - std::size_t total_transferred = 0; - std::size_t max_size = detail::adapt_completion_condition_result( - completion_condition(ec, total_transferred)); - std::size_t bytes_available = read_size_helper(b, max_size); - while (bytes_available > 0) - { - std::size_t bytes_transferred = d.read_some_at( - offset + total_transferred, b.prepare(bytes_available), ec); - b.commit(bytes_transferred); - total_transferred += bytes_transferred; - max_size = detail::adapt_completion_condition_result( - completion_condition(ec, total_transferred)); - bytes_available = read_size_helper(b, max_size); - } - return total_transferred; -} - -template -inline std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, asio::basic_streambuf& b) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_at( - d, offset, b, transfer_all(), ec); - asio::detail::throw_error(ec, "read_at"); - return bytes_transferred; -} - -template -inline std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, asio::basic_streambuf& b, - asio::error_code& ec) -{ - return read_at(d, offset, b, transfer_all(), ec); -} - -template -inline std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, asio::basic_streambuf& b, - CompletionCondition completion_condition) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_at( - d, offset, b, completion_condition, ec); - asio::detail::throw_error(ec, "read_at"); - return bytes_transferred; -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -namespace detail -{ - template - class read_at_op - : detail::base_from_completion_cond - { - public: - read_at_op(AsyncRandomAccessReadDevice& device, - uint64_t offset, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, ReadHandler& handler) - : detail::base_from_completion_cond< - CompletionCondition>(completion_condition), - device_(device), - offset_(offset), - buffers_(buffers), - start_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_at_op(const read_at_op& other) - : detail::base_from_completion_cond(other), - device_(other.device_), - offset_(other.offset_), - buffers_(other.buffers_), - start_(other.start_), - handler_(other.handler_) - { - } - - read_at_op(read_at_op&& other) - : detail::base_from_completion_cond(other), - device_(other.device_), - offset_(other.offset_), - buffers_(other.buffers_), - start_(other.start_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - std::size_t max_size; - switch (start_ = start) - { - case 1: - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - do - { - device_.async_read_some_at( - offset_ + buffers_.total_consumed(), buffers_.prepare(max_size), - ASIO_MOVE_CAST(read_at_op)(*this)); - return; default: - buffers_.consume(bytes_transferred); - if ((!ec && bytes_transferred == 0) || buffers_.empty()) - break; - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - } while (max_size > 0); - - handler_(ec, buffers_.total_consumed()); - } - } - - //private: - AsyncRandomAccessReadDevice& device_; - uint64_t offset_; - asio::detail::consuming_buffers buffers_; - int start_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_at_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_at_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_at_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_at_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_at_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void start_read_at_buffer_sequence_op(AsyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - const MutableBufferIterator&, CompletionCondition completion_condition, - ReadHandler& handler) - { - detail::read_at_op( - d, offset, buffers, completion_condition, handler)( - asio::error_code(), 0, 1); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_at_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_at_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_at_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_at_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::start_read_at_buffer_sequence_op(d, offset, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, - init.completion_handler); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::start_read_at_buffer_sequence_op(d, offset, buffers, - asio::buffer_sequence_begin(buffers), transfer_all(), - init.completion_handler); - - return init.result.get(); -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -namespace detail -{ - template - class read_at_streambuf_op - : detail::base_from_completion_cond - { - public: - read_at_streambuf_op(AsyncRandomAccessReadDevice& device, - uint64_t offset, basic_streambuf& streambuf, - CompletionCondition completion_condition, ReadHandler& handler) - : detail::base_from_completion_cond< - CompletionCondition>(completion_condition), - device_(device), - offset_(offset), - streambuf_(streambuf), - start_(0), - total_transferred_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_at_streambuf_op(const read_at_streambuf_op& other) - : detail::base_from_completion_cond(other), - device_(other.device_), - offset_(other.offset_), - streambuf_(other.streambuf_), - start_(other.start_), - total_transferred_(other.total_transferred_), - handler_(other.handler_) - { - } - - read_at_streambuf_op(read_at_streambuf_op&& other) - : detail::base_from_completion_cond(other), - device_(other.device_), - offset_(other.offset_), - streambuf_(other.streambuf_), - start_(other.start_), - total_transferred_(other.total_transferred_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - std::size_t max_size, bytes_available; - switch (start_ = start) - { - case 1: - max_size = this->check_for_completion(ec, total_transferred_); - bytes_available = read_size_helper(streambuf_, max_size); - for (;;) - { - device_.async_read_some_at(offset_ + total_transferred_, - streambuf_.prepare(bytes_available), - ASIO_MOVE_CAST(read_at_streambuf_op)(*this)); - return; default: - total_transferred_ += bytes_transferred; - streambuf_.commit(bytes_transferred); - max_size = this->check_for_completion(ec, total_transferred_); - bytes_available = read_size_helper(streambuf_, max_size); - if ((!ec && bytes_transferred == 0) || bytes_available == 0) - break; - } - - handler_(ec, static_cast(total_transferred_)); - } - } - - //private: - AsyncRandomAccessReadDevice& device_; - uint64_t offset_; - asio::basic_streambuf& streambuf_; - int start_; - std::size_t total_transferred_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_at_streambuf_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_at_streambuf_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_at_streambuf_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_at_streambuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_at_streambuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_at_streambuf_op, - Allocator1> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_at_streambuf_op& h, - const Allocator1& a = Allocator1()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_at_streambuf_op, - Executor1> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_at_streambuf_op& h, - const Executor1& ex = Executor1()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, - uint64_t offset, asio::basic_streambuf& b, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::read_at_streambuf_op( - d, offset, b, completion_condition, init.completion_handler)( - asio::error_code(), 0, 1); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, - uint64_t offset, asio::basic_streambuf& b, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::read_at_streambuf_op( - d, offset, b, transfer_all(), init.completion_handler)( - asio::error_code(), 0, 1); - - return init.result.get(); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_READ_AT_HPP diff --git a/scout_sdk/asio/asio/impl/read_until.hpp b/scout_sdk/asio/asio/impl/read_until.hpp deleted file mode 100644 index 1f39e19..0000000 --- a/scout_sdk/asio/asio/impl/read_until.hpp +++ /dev/null @@ -1,1500 +0,0 @@ -// -// impl/read_until.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_READ_UNTIL_HPP -#define ASIO_IMPL_READ_UNTIL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include -#include -#include -#include -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/buffer.hpp" -#include "asio/buffers_iterator.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/limits.hpp" -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -inline std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_until(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), delim, ec); - asio::detail::throw_error(ec, "read_until"); - return bytes_transferred; -} - -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - char delim, asio::error_code& ec) -{ - typename decay::type b( - ASIO_MOVE_CAST(DynamicBuffer)(buffers)); - - std::size_t search_position = 0; - for (;;) - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = b.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position; - iterator end = iterator::end(data_buffers); - - // Look for a match. - iterator iter = std::find(start_pos, end, delim); - if (iter != end) - { - // Found a match. We're done. - ec = asio::error_code(); - return iter - begin + 1; - } - else - { - // No match. Next search can start with the new data. - search_position = end - begin; - } - - // Check if buffer is full. - if (b.size() == b.max_size()) - { - ec = error::not_found; - return 0; - } - - // Need more data. - std::size_t bytes_to_read = std::min( - std::max(512, b.capacity() - b.size()), - std::min(65536, b.max_size() - b.size())); - b.commit(s.read_some(b.prepare(bytes_to_read), ec)); - if (ec) - return 0; - } -} - -template -inline std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_STRING_VIEW_PARAM delim) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_until(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), delim, ec); - asio::detail::throw_error(ec, "read_until"); - return bytes_transferred; -} - -namespace detail -{ - // Algorithm that finds a subsequence of equal values in a sequence. Returns - // (iterator,true) if a full match was found, in which case the iterator - // points to the beginning of the match. Returns (iterator,false) if a - // partial match was found at the end of the first sequence, in which case - // the iterator points to the beginning of the partial match. Returns - // (last1,false) if no full or partial match was found. - template - std::pair partial_search( - Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) - { - for (Iterator1 iter1 = first1; iter1 != last1; ++iter1) - { - Iterator1 test_iter1 = iter1; - Iterator2 test_iter2 = first2; - for (;; ++test_iter1, ++test_iter2) - { - if (test_iter2 == last2) - return std::make_pair(iter1, true); - if (test_iter1 == last1) - { - if (test_iter2 != first2) - return std::make_pair(iter1, false); - else - break; - } - if (*test_iter1 != *test_iter2) - break; - } - } - return std::make_pair(last1, false); - } -} // namespace detail - -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec) -{ - typename decay::type b( - ASIO_MOVE_CAST(DynamicBuffer)(buffers)); - - std::size_t search_position = 0; - for (;;) - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = b.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position; - iterator end = iterator::end(data_buffers); - - // Look for a match. - std::pair result = detail::partial_search( - start_pos, end, delim.begin(), delim.end()); - if (result.first != end) - { - if (result.second) - { - // Full match. We're done. - ec = asio::error_code(); - return result.first - begin + delim.length(); - } - else - { - // Partial match. Next search needs to start from beginning of match. - search_position = result.first - begin; - } - } - else - { - // No match. Next search can start with the new data. - search_position = end - begin; - } - - // Check if buffer is full. - if (b.size() == b.max_size()) - { - ec = error::not_found; - return 0; - } - - // Need more data. - std::size_t bytes_to_read = std::min( - std::max(512, b.capacity() - b.size()), - std::min(65536, b.max_size() - b.size())); - b.commit(s.read_some(b.prepare(bytes_to_read), ec)); - if (ec) - return 0; - } -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if defined(ASIO_HAS_BOOST_REGEX) - -template -inline std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - const boost::regex& expr) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_until(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), expr, ec); - asio::detail::throw_error(ec, "read_until"); - return bytes_transferred; -} - -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - const boost::regex& expr, asio::error_code& ec) -{ - typename decay::type b( - ASIO_MOVE_CAST(DynamicBuffer)(buffers)); - - std::size_t search_position = 0; - for (;;) - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = b.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position; - iterator end = iterator::end(data_buffers); - - // Look for a match. - boost::match_results >::allocator_type> - match_results; - if (regex_search(start_pos, end, match_results, expr, - boost::match_default | boost::match_partial)) - { - if (match_results[0].matched) - { - // Full match. We're done. - ec = asio::error_code(); - return match_results[0].second - begin; - } - else - { - // Partial match. Next search needs to start from beginning of match. - search_position = match_results[0].first - begin; - } - } - else - { - // No match. Next search can start with the new data. - search_position = end - begin; - } - - // Check if buffer is full. - if (b.size() == b.max_size()) - { - ec = error::not_found; - return 0; - } - - // Need more data. - std::size_t bytes_to_read = read_size_helper(b, 65536); - b.commit(s.read_some(b.prepare(bytes_to_read), ec)); - if (ec) - return 0; - } -} - -#endif // defined(ASIO_HAS_BOOST_REGEX) - -template -inline std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - MatchCondition match_condition, - typename enable_if::value>::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = read_until(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), - match_condition, ec); - asio::detail::throw_error(ec, "read_until"); - return bytes_transferred; -} - -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - MatchCondition match_condition, asio::error_code& ec, - typename enable_if::value>::type*) -{ - typename decay::type b( - ASIO_MOVE_CAST(DynamicBuffer)(buffers)); - - std::size_t search_position = 0; - for (;;) - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = b.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position; - iterator end = iterator::end(data_buffers); - - // Look for a match. - std::pair result = match_condition(start_pos, end); - if (result.second) - { - // Full match. We're done. - ec = asio::error_code(); - return result.first - begin; - } - else if (result.first != end) - { - // Partial match. Next search needs to start from beginning of match. - search_position = result.first - begin; - } - else - { - // No match. Next search can start with the new data. - search_position = end - begin; - } - - // Check if buffer is full. - if (b.size() == b.max_size()) - { - ec = error::not_found; - return 0; - } - - // Need more data. - std::size_t bytes_to_read = std::min( - std::max(512, b.capacity() - b.size()), - std::min(65536, b.max_size() - b.size())); - b.commit(s.read_some(b.prepare(bytes_to_read), ec)); - if (ec) - return 0; - } -} - -#if !defined(ASIO_NO_IOSTREAM) - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, char delim) -{ - return read_until(s, basic_streambuf_ref(b), delim); -} - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, char delim, - asio::error_code& ec) -{ - return read_until(s, basic_streambuf_ref(b), delim, ec); -} - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, - ASIO_STRING_VIEW_PARAM delim) -{ - return read_until(s, basic_streambuf_ref(b), delim); -} - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, - ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec) -{ - return read_until(s, basic_streambuf_ref(b), delim, ec); -} - -#if defined(ASIO_HAS_BOOST_REGEX) - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, const boost::regex& expr) -{ - return read_until(s, basic_streambuf_ref(b), expr); -} - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, const boost::regex& expr, - asio::error_code& ec) -{ - return read_until(s, basic_streambuf_ref(b), expr, ec); -} - -#endif // defined(ASIO_HAS_BOOST_REGEX) - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, MatchCondition match_condition, - typename enable_if::value>::type*) -{ - return read_until(s, basic_streambuf_ref(b), match_condition); -} - -template -inline std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, - MatchCondition match_condition, asio::error_code& ec, - typename enable_if::value>::type*) -{ - return read_until(s, basic_streambuf_ref(b), match_condition, ec); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -namespace detail -{ - template - class read_until_delim_op - { - public: - template - read_until_delim_op(AsyncReadStream& stream, - ASIO_MOVE_ARG(BufferSequence) buffers, - char delim, ReadHandler& handler) - : stream_(stream), - buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), - delim_(delim), - start_(0), - search_position_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_until_delim_op(const read_until_delim_op& other) - : stream_(other.stream_), - buffers_(other.buffers_), - delim_(other.delim_), - start_(other.start_), - search_position_(other.search_position_), - handler_(other.handler_) - { - } - - read_until_delim_op(read_until_delim_op&& other) - : stream_(other.stream_), - buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), - delim_(other.delim_), - start_(other.start_), - search_position_(other.search_position_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - const std::size_t not_found = (std::numeric_limits::max)(); - std::size_t bytes_to_read; - switch (start_ = start) - { - case 1: - for (;;) - { - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type - buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = buffers_.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position_; - iterator end = iterator::end(data_buffers); - - // Look for a match. - iterator iter = std::find(start_pos, end, delim_); - if (iter != end) - { - // Found a match. We're done. - search_position_ = iter - begin + 1; - bytes_to_read = 0; - } - - // No match yet. Check if buffer is full. - else if (buffers_.size() == buffers_.max_size()) - { - search_position_ = not_found; - bytes_to_read = 0; - } - - // Need to read some more data. - else - { - // Next search can start with the new data. - search_position_ = end - begin; - bytes_to_read = std::min( - std::max(512, - buffers_.capacity() - buffers_.size()), - std::min(65536, - buffers_.max_size() - buffers_.size())); - } - } - - // Check if we're done. - if (!start && bytes_to_read == 0) - break; - - // Start a new asynchronous read operation to obtain more data. - stream_.async_read_some(buffers_.prepare(bytes_to_read), - ASIO_MOVE_CAST(read_until_delim_op)(*this)); - return; default: - buffers_.commit(bytes_transferred); - if (ec || bytes_transferred == 0) - break; - } - - const asio::error_code result_ec = - (search_position_ == not_found) - ? error::not_found : ec; - - const std::size_t result_n = - (ec || search_position_ == not_found) - ? 0 : search_position_; - - handler_(result_ec, result_n); - } - } - - //private: - AsyncReadStream& stream_; - DynamicBuffer buffers_; - char delim_; - int start_; - std::size_t search_position_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_until_delim_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_until_delim_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_until_delim_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_until_delim_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_until_delim_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_until_delim_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_until_delim_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_until_delim_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_until_delim_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - char delim, ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::read_until_delim_op::type, - ASIO_HANDLER_TYPE(ReadHandler, - void (asio::error_code, std::size_t))>( - s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - delim, init.completion_handler)(asio::error_code(), 0, 1); - - return init.result.get(); -} - -namespace detail -{ - template - class read_until_delim_string_op - { - public: - template - read_until_delim_string_op(AsyncReadStream& stream, - ASIO_MOVE_ARG(BufferSequence) buffers, - const std::string& delim, ReadHandler& handler) - : stream_(stream), - buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), - delim_(delim), - start_(0), - search_position_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_until_delim_string_op(const read_until_delim_string_op& other) - : stream_(other.stream_), - buffers_(other.buffers_), - delim_(other.delim_), - start_(other.start_), - search_position_(other.search_position_), - handler_(other.handler_) - { - } - - read_until_delim_string_op(read_until_delim_string_op&& other) - : stream_(other.stream_), - buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), - delim_(ASIO_MOVE_CAST(std::string)(other.delim_)), - start_(other.start_), - search_position_(other.search_position_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - const std::size_t not_found = (std::numeric_limits::max)(); - std::size_t bytes_to_read; - switch (start_ = start) - { - case 1: - for (;;) - { - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type - buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = buffers_.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position_; - iterator end = iterator::end(data_buffers); - - // Look for a match. - std::pair result = detail::partial_search( - start_pos, end, delim_.begin(), delim_.end()); - if (result.first != end && result.second) - { - // Full match. We're done. - search_position_ = result.first - begin + delim_.length(); - bytes_to_read = 0; - } - - // No match yet. Check if buffer is full. - else if (buffers_.size() == buffers_.max_size()) - { - search_position_ = not_found; - bytes_to_read = 0; - } - - // Need to read some more data. - else - { - if (result.first != end) - { - // Partial match. Next search needs to start from beginning of - // match. - search_position_ = result.first - begin; - } - else - { - // Next search can start with the new data. - search_position_ = end - begin; - } - - bytes_to_read = std::min( - std::max(512, - buffers_.capacity() - buffers_.size()), - std::min(65536, - buffers_.max_size() - buffers_.size())); - } - } - - // Check if we're done. - if (!start && bytes_to_read == 0) - break; - - // Start a new asynchronous read operation to obtain more data. - stream_.async_read_some(buffers_.prepare(bytes_to_read), - ASIO_MOVE_CAST(read_until_delim_string_op)(*this)); - return; default: - buffers_.commit(bytes_transferred); - if (ec || bytes_transferred == 0) - break; - } - - const asio::error_code result_ec = - (search_position_ == not_found) - ? error::not_found : ec; - - const std::size_t result_n = - (ec || search_position_ == not_found) - ? 0 : search_position_; - - handler_(result_ec, result_n); - } - } - - //private: - AsyncReadStream& stream_; - DynamicBuffer buffers_; - std::string delim_; - int start_; - std::size_t search_position_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_until_delim_string_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_until_delim_string_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_until_delim_string_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_until_delim_string_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_until_delim_string_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_until_delim_string_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_until_delim_string_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_until_delim_string_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_until_delim_string_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_STRING_VIEW_PARAM delim, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::read_until_delim_string_op::type, - ASIO_HANDLER_TYPE(ReadHandler, - void (asio::error_code, std::size_t))>( - s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - static_cast(delim), - init.completion_handler)(asio::error_code(), 0, 1); - - return init.result.get(); -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if defined(ASIO_HAS_BOOST_REGEX) - -namespace detail -{ - template - class read_until_expr_op - { - public: - template - read_until_expr_op(AsyncReadStream& stream, - ASIO_MOVE_ARG(BufferSequence) buffers, - const boost::regex& expr, ReadHandler& handler) - : stream_(stream), - buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), - expr_(expr), - start_(0), - search_position_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_until_expr_op(const read_until_expr_op& other) - : stream_(other.stream_), - buffers_(other.buffers_), - expr_(other.expr_), - start_(other.start_), - search_position_(other.search_position_), - handler_(other.handler_) - { - } - - read_until_expr_op(read_until_expr_op&& other) - : stream_(other.stream_), - buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), - expr_(other.expr_), - start_(other.start_), - search_position_(other.search_position_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - const std::size_t not_found = (std::numeric_limits::max)(); - std::size_t bytes_to_read; - switch (start_ = start) - { - case 1: - for (;;) - { - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type - buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = buffers_.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position_; - iterator end = iterator::end(data_buffers); - - // Look for a match. - boost::match_results >::allocator_type> - match_results; - bool match = regex_search(start_pos, end, match_results, expr_, - boost::match_default | boost::match_partial); - if (match && match_results[0].matched) - { - // Full match. We're done. - search_position_ = match_results[0].second - begin; - bytes_to_read = 0; - } - - // No match yet. Check if buffer is full. - else if (buffers_.size() == buffers_.max_size()) - { - search_position_ = not_found; - bytes_to_read = 0; - } - - // Need to read some more data. - else - { - if (match) - { - // Partial match. Next search needs to start from beginning of - // match. - search_position_ = match_results[0].first - begin; - } - else - { - // Next search can start with the new data. - search_position_ = end - begin; - } - - bytes_to_read = std::min( - std::max(512, - buffers_.capacity() - buffers_.size()), - std::min(65536, - buffers_.max_size() - buffers_.size())); - } - } - - // Check if we're done. - if (!start && bytes_to_read == 0) - break; - - // Start a new asynchronous read operation to obtain more data. - stream_.async_read_some(buffers_.prepare(bytes_to_read), - ASIO_MOVE_CAST(read_until_expr_op)(*this)); - return; default: - buffers_.commit(bytes_transferred); - if (ec || bytes_transferred == 0) - break; - } - - const asio::error_code result_ec = - (search_position_ == not_found) - ? error::not_found : ec; - - const std::size_t result_n = - (ec || search_position_ == not_found) - ? 0 : search_position_; - - handler_(result_ec, result_n); - } - } - - //private: - AsyncReadStream& stream_; - DynamicBuffer buffers_; - RegEx expr_; - int start_; - std::size_t search_position_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_until_expr_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_until_expr_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_until_expr_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_until_expr_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_until_expr_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_until_expr_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_until_expr_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_until_expr_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_until_expr_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - const boost::regex& expr, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::read_until_expr_op::type, - boost::regex, ASIO_HANDLER_TYPE(ReadHandler, - void (asio::error_code, std::size_t))>( - s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - expr, init.completion_handler)(asio::error_code(), 0, 1); - - return init.result.get(); -} - -#endif // defined(ASIO_HAS_BOOST_REGEX) - -namespace detail -{ - template - class read_until_match_op - { - public: - template - read_until_match_op(AsyncReadStream& stream, - ASIO_MOVE_ARG(BufferSequence) buffers, - MatchCondition match_condition, ReadHandler& handler) - : stream_(stream), - buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), - match_condition_(match_condition), - start_(0), - search_position_(0), - handler_(ASIO_MOVE_CAST(ReadHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - read_until_match_op(const read_until_match_op& other) - : stream_(other.stream_), - buffers_(other.buffers_), - match_condition_(other.match_condition_), - start_(other.start_), - search_position_(other.search_position_), - handler_(other.handler_) - { - } - - read_until_match_op(read_until_match_op&& other) - : stream_(other.stream_), - buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), - match_condition_(other.match_condition_), - start_(other.start_), - search_position_(other.search_position_), - handler_(ASIO_MOVE_CAST(ReadHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - const std::size_t not_found = (std::numeric_limits::max)(); - std::size_t bytes_to_read; - switch (start_ = start) - { - case 1: - for (;;) - { - { - // Determine the range of the data to be searched. - typedef typename DynamicBuffer::const_buffers_type - buffers_type; - typedef buffers_iterator iterator; - buffers_type data_buffers = buffers_.data(); - iterator begin = iterator::begin(data_buffers); - iterator start_pos = begin + search_position_; - iterator end = iterator::end(data_buffers); - - // Look for a match. - std::pair result = match_condition_(start_pos, end); - if (result.second) - { - // Full match. We're done. - search_position_ = result.first - begin; - bytes_to_read = 0; - } - - // No match yet. Check if buffer is full. - else if (buffers_.size() == buffers_.max_size()) - { - search_position_ = not_found; - bytes_to_read = 0; - } - - // Need to read some more data. - else - { - if (result.first != end) - { - // Partial match. Next search needs to start from beginning of - // match. - search_position_ = result.first - begin; - } - else - { - // Next search can start with the new data. - search_position_ = end - begin; - } - - bytes_to_read = std::min( - std::max(512, - buffers_.capacity() - buffers_.size()), - std::min(65536, - buffers_.max_size() - buffers_.size())); - } - } - - // Check if we're done. - if (!start && bytes_to_read == 0) - break; - - // Start a new asynchronous read operation to obtain more data. - stream_.async_read_some(buffers_.prepare(bytes_to_read), - ASIO_MOVE_CAST(read_until_match_op)(*this)); - return; default: - buffers_.commit(bytes_transferred); - if (ec || bytes_transferred == 0) - break; - } - - const asio::error_code result_ec = - (search_position_ == not_found) - ? error::not_found : ec; - - const std::size_t result_n = - (ec || search_position_ == not_found) - ? 0 : search_position_; - - handler_(result_ec, result_n); - } - } - - //private: - AsyncReadStream& stream_; - DynamicBuffer buffers_; - MatchCondition match_condition_; - int start_; - std::size_t search_position_; - ReadHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_until_match_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_until_match_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - read_until_match_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - read_until_match_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_until_match_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::read_until_match_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::read_until_match_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::read_until_match_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::read_until_match_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if::value>::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - detail::read_until_match_op::type, - MatchCondition, ASIO_HANDLER_TYPE(ReadHandler, - void (asio::error_code, std::size_t))>( - s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - match_condition, init.completion_handler)( - asio::error_code(), 0, 1); - - return init.result.get(); -} - -#if !defined(ASIO_NO_IOSTREAM) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, - char delim, ASIO_MOVE_ARG(ReadHandler) handler) -{ - return async_read_until(s, basic_streambuf_ref(b), - delim, ASIO_MOVE_CAST(ReadHandler)(handler)); -} - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, - ASIO_STRING_VIEW_PARAM delim, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - return async_read_until(s, basic_streambuf_ref(b), - delim, ASIO_MOVE_CAST(ReadHandler)(handler)); -} - -#if defined(ASIO_HAS_BOOST_REGEX) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, const boost::regex& expr, - ASIO_MOVE_ARG(ReadHandler) handler) -{ - return async_read_until(s, basic_streambuf_ref(b), - expr, ASIO_MOVE_CAST(ReadHandler)(handler)); -} - -#endif // defined(ASIO_HAS_BOOST_REGEX) - -template -inline ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, - MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if::value>::type*) -{ - return async_read_until(s, basic_streambuf_ref(b), - match_condition, ASIO_MOVE_CAST(ReadHandler)(handler)); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_READ_UNTIL_HPP diff --git a/scout_sdk/asio/asio/impl/serial_port_base.hpp b/scout_sdk/asio/asio/impl/serial_port_base.hpp deleted file mode 100644 index cdc201d..0000000 --- a/scout_sdk/asio/asio/impl/serial_port_base.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// impl/serial_port_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_SERIAL_PORT_BASE_HPP -#define ASIO_IMPL_SERIAL_PORT_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -inline serial_port_base::baud_rate::baud_rate(unsigned int rate) - : value_(rate) -{ -} - -inline unsigned int serial_port_base::baud_rate::value() const -{ - return value_; -} - -inline serial_port_base::flow_control::type -serial_port_base::flow_control::value() const -{ - return value_; -} - -inline serial_port_base::parity::type serial_port_base::parity::value() const -{ - return value_; -} - -inline serial_port_base::stop_bits::type -serial_port_base::stop_bits::value() const -{ - return value_; -} - -inline unsigned int serial_port_base::character_size::value() const -{ - return value_; -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_SERIAL_PORT_BASE_HPP diff --git a/scout_sdk/asio/asio/impl/serial_port_base.ipp b/scout_sdk/asio/asio/impl/serial_port_base.ipp deleted file mode 100644 index 5d52ed5..0000000 --- a/scout_sdk/asio/asio/impl/serial_port_base.ipp +++ /dev/null @@ -1,554 +0,0 @@ -// -// impl/serial_port_base.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_SERIAL_PORT_BASE_IPP -#define ASIO_IMPL_SERIAL_PORT_BASE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_SERIAL_PORT) - -#include -#include "asio/error.hpp" -#include "asio/serial_port_base.hpp" -#include "asio/detail/throw_exception.hpp" - -#if defined(GENERATING_DOCUMENTATION) -# define ASIO_OPTION_STORAGE implementation_defined -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# define ASIO_OPTION_STORAGE DCB -#else -# define ASIO_OPTION_STORAGE termios -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -ASIO_SYNC_OP_VOID serial_port_base::baud_rate::store( - ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - storage.BaudRate = value_; -#else - speed_t baud; - switch (value_) - { - // Do POSIX-specified rates first. - case 0: baud = B0; break; - case 50: baud = B50; break; - case 75: baud = B75; break; - case 110: baud = B110; break; - case 134: baud = B134; break; - case 150: baud = B150; break; - case 200: baud = B200; break; - case 300: baud = B300; break; - case 600: baud = B600; break; - case 1200: baud = B1200; break; - case 1800: baud = B1800; break; - case 2400: baud = B2400; break; - case 4800: baud = B4800; break; - case 9600: baud = B9600; break; - case 19200: baud = B19200; break; - case 38400: baud = B38400; break; - // And now the extended ones conditionally. -# ifdef B7200 - case 7200: baud = B7200; break; -# endif -# ifdef B14400 - case 14400: baud = B14400; break; -# endif -# ifdef B57600 - case 57600: baud = B57600; break; -# endif -# ifdef B115200 - case 115200: baud = B115200; break; -# endif -# ifdef B230400 - case 230400: baud = B230400; break; -# endif -# ifdef B460800 - case 460800: baud = B460800; break; -# endif -# ifdef B500000 - case 500000: baud = B500000; break; -# endif -# ifdef B576000 - case 576000: baud = B576000; break; -# endif -# ifdef B921600 - case 921600: baud = B921600; break; -# endif -# ifdef B1000000 - case 1000000: baud = B1000000; break; -# endif -# ifdef B1152000 - case 1152000: baud = B1152000; break; -# endif -# ifdef B2000000 - case 2000000: baud = B2000000; break; -# endif -# ifdef B3000000 - case 3000000: baud = B3000000; break; -# endif -# ifdef B3500000 - case 3500000: baud = B3500000; break; -# endif -# ifdef B4000000 - case 4000000: baud = B4000000; break; -# endif - default: - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } -# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) - ::cfsetspeed(&storage, baud); -# else - ::cfsetispeed(&storage, baud); - ::cfsetospeed(&storage, baud); -# endif -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID serial_port_base::baud_rate::load( - const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - value_ = storage.BaudRate; -#else - speed_t baud = ::cfgetospeed(&storage); - switch (baud) - { - // First do those specified by POSIX. - case B0: value_ = 0; break; - case B50: value_ = 50; break; - case B75: value_ = 75; break; - case B110: value_ = 110; break; - case B134: value_ = 134; break; - case B150: value_ = 150; break; - case B200: value_ = 200; break; - case B300: value_ = 300; break; - case B600: value_ = 600; break; - case B1200: value_ = 1200; break; - case B1800: value_ = 1800; break; - case B2400: value_ = 2400; break; - case B4800: value_ = 4800; break; - case B9600: value_ = 9600; break; - case B19200: value_ = 19200; break; - case B38400: value_ = 38400; break; - // Now conditionally handle a bunch of extended rates. -# ifdef B7200 - case B7200: value_ = 7200; break; -# endif -# ifdef B14400 - case B14400: value_ = 14400; break; -# endif -# ifdef B57600 - case B57600: value_ = 57600; break; -# endif -# ifdef B115200 - case B115200: value_ = 115200; break; -# endif -# ifdef B230400 - case B230400: value_ = 230400; break; -# endif -# ifdef B460800 - case B460800: value_ = 460800; break; -# endif -# ifdef B500000 - case B500000: value_ = 500000; break; -# endif -# ifdef B576000 - case B576000: value_ = 576000; break; -# endif -# ifdef B921600 - case B921600: value_ = 921600; break; -# endif -# ifdef B1000000 - case B1000000: value_ = 1000000; break; -# endif -# ifdef B1152000 - case B1152000: value_ = 1152000; break; -# endif -# ifdef B2000000 - case B2000000: value_ = 2000000; break; -# endif -# ifdef B3000000 - case B3000000: value_ = 3000000; break; -# endif -# ifdef B3500000 - case B3500000: value_ = 3500000; break; -# endif -# ifdef B4000000 - case B4000000: value_ = 4000000; break; -# endif - default: - value_ = 0; - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -serial_port_base::flow_control::flow_control( - serial_port_base::flow_control::type t) - : value_(t) -{ - if (t != none && t != software && t != hardware) - { - std::out_of_range ex("invalid flow_control value"); - asio::detail::throw_exception(ex); - } -} - -ASIO_SYNC_OP_VOID serial_port_base::flow_control::store( - ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - storage.fOutxCtsFlow = FALSE; - storage.fOutxDsrFlow = FALSE; - storage.fTXContinueOnXoff = TRUE; - storage.fDtrControl = DTR_CONTROL_ENABLE; - storage.fDsrSensitivity = FALSE; - storage.fOutX = FALSE; - storage.fInX = FALSE; - storage.fRtsControl = RTS_CONTROL_ENABLE; - switch (value_) - { - case none: - break; - case software: - storage.fOutX = TRUE; - storage.fInX = TRUE; - break; - case hardware: - storage.fOutxCtsFlow = TRUE; - storage.fRtsControl = RTS_CONTROL_HANDSHAKE; - break; - default: - break; - } -#else - switch (value_) - { - case none: - storage.c_iflag &= ~(IXOFF | IXON); -# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) - storage.c_cflag &= ~CRTSCTS; -# elif defined(__QNXNTO__) - storage.c_cflag &= ~(IHFLOW | OHFLOW); -# endif - break; - case software: - storage.c_iflag |= IXOFF | IXON; -# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) - storage.c_cflag &= ~CRTSCTS; -# elif defined(__QNXNTO__) - storage.c_cflag &= ~(IHFLOW | OHFLOW); -# endif - break; - case hardware: -# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) - storage.c_iflag &= ~(IXOFF | IXON); - storage.c_cflag |= CRTSCTS; - break; -# elif defined(__QNXNTO__) - storage.c_iflag &= ~(IXOFF | IXON); - storage.c_cflag |= (IHFLOW | OHFLOW); - break; -# else - ec = asio::error::operation_not_supported; - ASIO_SYNC_OP_VOID_RETURN(ec); -# endif - default: - break; - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID serial_port_base::flow_control::load( - const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - if (storage.fOutX && storage.fInX) - { - value_ = software; - } - else if (storage.fOutxCtsFlow && storage.fRtsControl == RTS_CONTROL_HANDSHAKE) - { - value_ = hardware; - } - else - { - value_ = none; - } -#else - if (storage.c_iflag & (IXOFF | IXON)) - { - value_ = software; - } -# if defined(_BSD_SOURCE) || defined(_DEFAULT_SOURCE) - else if (storage.c_cflag & CRTSCTS) - { - value_ = hardware; - } -# elif defined(__QNXNTO__) - else if (storage.c_cflag & IHFLOW && storage.c_cflag & OHFLOW) - { - value_ = hardware; - } -# endif - else - { - value_ = none; - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -serial_port_base::parity::parity(serial_port_base::parity::type t) - : value_(t) -{ - if (t != none && t != odd && t != even) - { - std::out_of_range ex("invalid parity value"); - asio::detail::throw_exception(ex); - } -} - -ASIO_SYNC_OP_VOID serial_port_base::parity::store( - ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - switch (value_) - { - case none: - storage.fParity = FALSE; - storage.Parity = NOPARITY; - break; - case odd: - storage.fParity = TRUE; - storage.Parity = ODDPARITY; - break; - case even: - storage.fParity = TRUE; - storage.Parity = EVENPARITY; - break; - default: - break; - } -#else - switch (value_) - { - case none: - storage.c_iflag |= IGNPAR; - storage.c_cflag &= ~(PARENB | PARODD); - break; - case even: - storage.c_iflag &= ~(IGNPAR | PARMRK); - storage.c_iflag |= INPCK; - storage.c_cflag |= PARENB; - storage.c_cflag &= ~PARODD; - break; - case odd: - storage.c_iflag &= ~(IGNPAR | PARMRK); - storage.c_iflag |= INPCK; - storage.c_cflag |= (PARENB | PARODD); - break; - default: - break; - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID serial_port_base::parity::load( - const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - if (storage.Parity == EVENPARITY) - { - value_ = even; - } - else if (storage.Parity == ODDPARITY) - { - value_ = odd; - } - else - { - value_ = none; - } -#else - if (storage.c_cflag & PARENB) - { - if (storage.c_cflag & PARODD) - { - value_ = odd; - } - else - { - value_ = even; - } - } - else - { - value_ = none; - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -serial_port_base::stop_bits::stop_bits( - serial_port_base::stop_bits::type t) - : value_(t) -{ - if (t != one && t != onepointfive && t != two) - { - std::out_of_range ex("invalid stop_bits value"); - asio::detail::throw_exception(ex); - } -} - -ASIO_SYNC_OP_VOID serial_port_base::stop_bits::store( - ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - switch (value_) - { - case one: - storage.StopBits = ONESTOPBIT; - break; - case onepointfive: - storage.StopBits = ONE5STOPBITS; - break; - case two: - storage.StopBits = TWOSTOPBITS; - break; - default: - break; - } -#else - switch (value_) - { - case one: - storage.c_cflag &= ~CSTOPB; - break; - case two: - storage.c_cflag |= CSTOPB; - break; - default: - ec = asio::error::operation_not_supported; - ASIO_SYNC_OP_VOID_RETURN(ec); - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID serial_port_base::stop_bits::load( - const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - if (storage.StopBits == ONESTOPBIT) - { - value_ = one; - } - else if (storage.StopBits == ONE5STOPBITS) - { - value_ = onepointfive; - } - else if (storage.StopBits == TWOSTOPBITS) - { - value_ = two; - } - else - { - value_ = one; - } -#else - value_ = (storage.c_cflag & CSTOPB) ? two : one; -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -serial_port_base::character_size::character_size(unsigned int t) - : value_(t) -{ - if (t < 5 || t > 8) - { - std::out_of_range ex("invalid character_size value"); - asio::detail::throw_exception(ex); - } -} - -ASIO_SYNC_OP_VOID serial_port_base::character_size::store( - ASIO_OPTION_STORAGE& storage, asio::error_code& ec) const -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - storage.ByteSize = value_; -#else - storage.c_cflag &= ~CSIZE; - switch (value_) - { - case 5: storage.c_cflag |= CS5; break; - case 6: storage.c_cflag |= CS6; break; - case 7: storage.c_cflag |= CS7; break; - case 8: storage.c_cflag |= CS8; break; - default: break; - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID serial_port_base::character_size::load( - const ASIO_OPTION_STORAGE& storage, asio::error_code& ec) -{ -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - value_ = storage.ByteSize; -#else - if ((storage.c_cflag & CSIZE) == CS5) { value_ = 5; } - else if ((storage.c_cflag & CSIZE) == CS6) { value_ = 6; } - else if ((storage.c_cflag & CSIZE) == CS7) { value_ = 7; } - else if ((storage.c_cflag & CSIZE) == CS8) { value_ = 8; } - else - { - // Hmmm, use 8 for now. - value_ = 8; - } -#endif - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#undef ASIO_OPTION_STORAGE - -#endif // defined(ASIO_HAS_SERIAL_PORT) - -#endif // ASIO_IMPL_SERIAL_PORT_BASE_IPP diff --git a/scout_sdk/asio/asio/impl/spawn.hpp b/scout_sdk/asio/asio/impl/spawn.hpp deleted file mode 100644 index 5594ad9..0000000 --- a/scout_sdk/asio/asio/impl/spawn.hpp +++ /dev/null @@ -1,535 +0,0 @@ -// -// impl/spawn.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_SPAWN_HPP -#define ASIO_IMPL_SPAWN_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/async_result.hpp" -#include "asio/bind_executor.hpp" -#include "asio/detail/atomic_count.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/system_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - - template - class coro_handler - { - public: - coro_handler(basic_yield_context ctx) - : coro_(ctx.coro_.lock()), - ca_(ctx.ca_), - handler_(ctx.handler_), - ready_(0), - ec_(ctx.ec_), - value_(0) - { - } - - void operator()(T value) - { - *ec_ = asio::error_code(); - *value_ = ASIO_MOVE_CAST(T)(value); - if (--*ready_ == 0) - (*coro_)(); - } - - void operator()(asio::error_code ec, T value) - { - *ec_ = ec; - *value_ = ASIO_MOVE_CAST(T)(value); - if (--*ready_ == 0) - (*coro_)(); - } - - //private: - shared_ptr::callee_type> coro_; - typename basic_yield_context::caller_type& ca_; - Handler handler_; - atomic_count* ready_; - asio::error_code* ec_; - T* value_; - }; - - template - class coro_handler - { - public: - coro_handler(basic_yield_context ctx) - : coro_(ctx.coro_.lock()), - ca_(ctx.ca_), - handler_(ctx.handler_), - ready_(0), - ec_(ctx.ec_) - { - } - - void operator()() - { - *ec_ = asio::error_code(); - if (--*ready_ == 0) - (*coro_)(); - } - - void operator()(asio::error_code ec) - { - *ec_ = ec; - if (--*ready_ == 0) - (*coro_)(); - } - - //private: - shared_ptr::callee_type> coro_; - typename basic_yield_context::caller_type& ca_; - Handler handler_; - atomic_count* ready_; - asio::error_code* ec_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - coro_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - coro_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation(coro_handler*) - { - return true; - } - - template - inline void asio_handler_invoke(Function& function, - coro_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - coro_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - class coro_async_result - { - public: - typedef coro_handler completion_handler_type; - typedef T return_type; - - explicit coro_async_result(completion_handler_type& h) - : handler_(h), - ca_(h.ca_), - ready_(2) - { - h.ready_ = &ready_; - out_ec_ = h.ec_; - if (!out_ec_) h.ec_ = &ec_; - h.value_ = &value_; - } - - return_type get() - { - // Must not hold shared_ptr to coro while suspended. - handler_.coro_.reset(); - - if (--ready_ != 0) - ca_(); - if (!out_ec_ && ec_) throw asio::system_error(ec_); - return ASIO_MOVE_CAST(return_type)(value_); - } - - private: - completion_handler_type& handler_; - typename basic_yield_context::caller_type& ca_; - atomic_count ready_; - asio::error_code* out_ec_; - asio::error_code ec_; - return_type value_; - }; - - template - class coro_async_result - { - public: - typedef coro_handler completion_handler_type; - typedef void return_type; - - explicit coro_async_result(completion_handler_type& h) - : handler_(h), - ca_(h.ca_), - ready_(2) - { - h.ready_ = &ready_; - out_ec_ = h.ec_; - if (!out_ec_) h.ec_ = &ec_; - } - - void get() - { - // Must not hold shared_ptr to coro while suspended. - handler_.coro_.reset(); - - if (--ready_ != 0) - ca_(); - if (!out_ec_ && ec_) throw asio::system_error(ec_); - } - - private: - completion_handler_type& handler_; - typename basic_yield_context::caller_type& ca_; - atomic_count ready_; - asio::error_code* out_ec_; - asio::error_code ec_; - }; - -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -class async_result, ReturnType()> - : public detail::coro_async_result -{ -public: - explicit async_result( - typename detail::coro_async_result::completion_handler_type& h) - : detail::coro_async_result(h) - { - } -}; - -template -class async_result, ReturnType(Arg1)> - : public detail::coro_async_result::type> -{ -public: - explicit async_result( - typename detail::coro_async_result::type>::completion_handler_type& h) - : detail::coro_async_result::type>(h) - { - } -}; - -template -class async_result, - ReturnType(asio::error_code)> - : public detail::coro_async_result -{ -public: - explicit async_result( - typename detail::coro_async_result::completion_handler_type& h) - : detail::coro_async_result(h) - { - } -}; - -template -class async_result, - ReturnType(asio::error_code, Arg2)> - : public detail::coro_async_result::type> -{ -public: - explicit async_result( - typename detail::coro_async_result::type>::completion_handler_type& h) - : detail::coro_async_result::type>(h) - { - } -}; - -#if !defined(ASIO_NO_DEPRECATED) - -template -struct handler_type, ReturnType()> -{ - typedef detail::coro_handler type; -}; - -template -struct handler_type, ReturnType(Arg1)> -{ - typedef detail::coro_handler::type> type; -}; - -template -struct handler_type, - ReturnType(asio::error_code)> -{ - typedef detail::coro_handler type; -}; - -template -struct handler_type, - ReturnType(asio::error_code, Arg2)> -{ - typedef detail::coro_handler::type> type; -}; - -template -class async_result > - : public detail::coro_async_result -{ -public: - typedef typename detail::coro_async_result::return_type type; - - explicit async_result( - typename detail::coro_async_result::completion_handler_type& h) - : detail::coro_async_result(h) - { - } -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -struct associated_allocator, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const detail::coro_handler& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const detail::coro_handler& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -namespace detail { - - template - struct spawn_data : private noncopyable - { - template - spawn_data(ASIO_MOVE_ARG(Hand) handler, - bool call_handler, ASIO_MOVE_ARG(Func) function) - : handler_(ASIO_MOVE_CAST(Hand)(handler)), - call_handler_(call_handler), - function_(ASIO_MOVE_CAST(Func)(function)) - { - } - - weak_ptr::callee_type> coro_; - Handler handler_; - bool call_handler_; - Function function_; - }; - - template - struct coro_entry_point - { - void operator()(typename basic_yield_context::caller_type& ca) - { - shared_ptr > data(data_); -#if !defined(BOOST_COROUTINES_UNIDIRECT) && !defined(BOOST_COROUTINES_V2) - ca(); // Yield until coroutine pointer has been initialised. -#endif // !defined(BOOST_COROUTINES_UNIDIRECT) && !defined(BOOST_COROUTINES_V2) - const basic_yield_context yield( - data->coro_, ca, data->handler_); - - (data->function_)(yield); - if (data->call_handler_) - (data->handler_)(); - } - - shared_ptr > data_; - }; - - template - struct spawn_helper - { - void operator()() - { - typedef typename basic_yield_context::callee_type callee_type; - coro_entry_point entry_point = { data_ }; - shared_ptr coro(new callee_type(entry_point, attributes_)); - data_->coro_ = coro; - (*coro)(); - } - - shared_ptr > data_; - boost::coroutines::attributes attributes_; - }; - - template - inline void asio_handler_invoke(Function& function, - spawn_helper* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->data_->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - spawn_helper* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->data_->handler_); - } - - inline void default_spawn_handler() {} - -} // namespace detail - -template -inline void spawn(ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes) -{ - typedef typename decay::type function_type; - - typename associated_executor::type ex( - (get_associated_executor)(function)); - - asio::spawn(ex, ASIO_MOVE_CAST(Function)(function), attributes); -} - -template -void spawn(ASIO_MOVE_ARG(Handler) handler, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes, - typename enable_if::type>::value && - !is_convertible::value>::type*) -{ - typedef typename decay::type handler_type; - typedef typename decay::type function_type; - - typename associated_executor::type ex( - (get_associated_executor)(handler)); - - typename associated_allocator::type a( - (get_associated_allocator)(handler)); - - detail::spawn_helper helper; - helper.data_.reset( - new detail::spawn_data( - ASIO_MOVE_CAST(Handler)(handler), true, - ASIO_MOVE_CAST(Function)(function))); - helper.attributes_ = attributes; - - ex.dispatch(helper, a); -} - -template -void spawn(basic_yield_context ctx, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes) -{ - typedef typename decay::type function_type; - - Handler handler(ctx.handler_); // Explicit copy that might be moved from. - - typename associated_executor::type ex( - (get_associated_executor)(handler)); - - typename associated_allocator::type a( - (get_associated_allocator)(handler)); - - detail::spawn_helper helper; - helper.data_.reset( - new detail::spawn_data( - ASIO_MOVE_CAST(Handler)(handler), false, - ASIO_MOVE_CAST(Function)(function))); - helper.attributes_ = attributes; - - ex.dispatch(helper, a); -} - -template -inline void spawn(const Executor& ex, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes, - typename enable_if::value>::type*) -{ - asio::spawn(asio::strand(ex), - ASIO_MOVE_CAST(Function)(function), attributes); -} - -template -inline void spawn(const strand& ex, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes) -{ - asio::spawn(asio::bind_executor( - ex, &detail::default_spawn_handler), - ASIO_MOVE_CAST(Function)(function), attributes); -} - -template -inline void spawn(const asio::io_context::strand& s, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes) -{ - asio::spawn(asio::bind_executor( - s, &detail::default_spawn_handler), - ASIO_MOVE_CAST(Function)(function), attributes); -} - -template -inline void spawn(ExecutionContext& ctx, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes, - typename enable_if::value>::type*) -{ - asio::spawn(ctx.get_executor(), - ASIO_MOVE_CAST(Function)(function), attributes); -} - -#endif // !defined(GENERATING_DOCUMENTATION) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_SPAWN_HPP diff --git a/scout_sdk/asio/asio/impl/src.cpp b/scout_sdk/asio/asio/impl/src.cpp deleted file mode 100644 index e8a5953..0000000 --- a/scout_sdk/asio/asio/impl/src.cpp +++ /dev/null @@ -1,25 +0,0 @@ -// -// impl/src.cpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#if defined(_MSC_VER) \ - || defined(__BORLANDC__) \ - || defined(__DMC__) -# pragma message ( \ - "This file is deprecated. " \ - "Please #include instead.") -#elif defined(__GNUC__) \ - || defined(__HP_aCC) \ - || defined(__SUNPRO_CC) \ - || defined(__IBMCPP__) -# warning "This file is deprecated." -# warning "Please #include instead." -#endif - -#include "asio/impl/src.hpp" diff --git a/scout_sdk/asio/asio/impl/src.hpp b/scout_sdk/asio/asio/impl/src.hpp deleted file mode 100644 index a72637b..0000000 --- a/scout_sdk/asio/asio/impl/src.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// -// impl/src.hpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_SRC_HPP -#define ASIO_IMPL_SRC_HPP - -#define ASIO_SOURCE - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HEADER_ONLY) -# error Do not compile Asio library source with ASIO_HEADER_ONLY defined -#endif - -#include "asio/impl/error.ipp" -#include "asio/impl/error_code.ipp" -#include "asio/impl/execution_context.ipp" -#include "asio/impl/executor.ipp" -#include "asio/impl/handler_alloc_hook.ipp" -#include "asio/impl/io_context.ipp" -#include "asio/impl/serial_port_base.ipp" -#include "asio/impl/system_context.ipp" -#include "asio/impl/thread_pool.ipp" -#include "asio/detail/impl/buffer_sequence_adapter.ipp" -#include "asio/detail/impl/descriptor_ops.ipp" -#include "asio/detail/impl/dev_poll_reactor.ipp" -#include "asio/detail/impl/epoll_reactor.ipp" -#include "asio/detail/impl/eventfd_select_interrupter.ipp" -#include "asio/detail/impl/handler_tracking.ipp" -#include "asio/detail/impl/kqueue_reactor.ipp" -#include "asio/detail/impl/null_event.ipp" -#include "asio/detail/impl/pipe_select_interrupter.ipp" -#include "asio/detail/impl/posix_event.ipp" -#include "asio/detail/impl/posix_mutex.ipp" -#include "asio/detail/impl/posix_thread.ipp" -#include "asio/detail/impl/posix_tss_ptr.ipp" -#include "asio/detail/impl/reactive_descriptor_service.ipp" -#include "asio/detail/impl/reactive_serial_port_service.ipp" -#include "asio/detail/impl/reactive_socket_service_base.ipp" -#include "asio/detail/impl/resolver_service_base.ipp" -#include "asio/detail/impl/scheduler.ipp" -#include "asio/detail/impl/select_reactor.ipp" -#include "asio/detail/impl/service_registry.ipp" -#include "asio/detail/impl/signal_set_service.ipp" -#include "asio/detail/impl/socket_ops.ipp" -#include "asio/detail/impl/socket_select_interrupter.ipp" -#include "asio/detail/impl/strand_executor_service.ipp" -#include "asio/detail/impl/strand_service.ipp" -#include "asio/detail/impl/throw_error.ipp" -#include "asio/detail/impl/timer_queue_ptime.ipp" -#include "asio/detail/impl/timer_queue_set.ipp" -#include "asio/detail/impl/win_iocp_handle_service.ipp" -#include "asio/detail/impl/win_iocp_io_context.ipp" -#include "asio/detail/impl/win_iocp_serial_port_service.ipp" -#include "asio/detail/impl/win_iocp_socket_service_base.ipp" -#include "asio/detail/impl/win_event.ipp" -#include "asio/detail/impl/win_mutex.ipp" -#include "asio/detail/impl/win_object_handle_service.ipp" -#include "asio/detail/impl/win_static_mutex.ipp" -#include "asio/detail/impl/win_thread.ipp" -#include "asio/detail/impl/win_tss_ptr.ipp" -#include "asio/detail/impl/winrt_ssocket_service_base.ipp" -#include "asio/detail/impl/winrt_timer_scheduler.ipp" -#include "asio/detail/impl/winsock_init.ipp" -#include "asio/generic/detail/impl/endpoint.ipp" -#include "asio/ip/impl/address.ipp" -#include "asio/ip/impl/address_v4.ipp" -#include "asio/ip/impl/address_v6.ipp" -#include "asio/ip/impl/host_name.ipp" -#include "asio/ip/impl/network_v4.ipp" -#include "asio/ip/impl/network_v6.ipp" -#include "asio/ip/detail/impl/endpoint.ipp" -#include "asio/local/detail/impl/endpoint.ipp" - -#endif // ASIO_IMPL_SRC_HPP diff --git a/scout_sdk/asio/asio/impl/system_context.hpp b/scout_sdk/asio/asio/impl/system_context.hpp deleted file mode 100644 index 87ffe76..0000000 --- a/scout_sdk/asio/asio/impl/system_context.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// -// impl/system_context.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_SYSTEM_CONTEXT_HPP -#define ASIO_IMPL_SYSTEM_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/system_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -inline system_context::executor_type -system_context::get_executor() ASIO_NOEXCEPT -{ - return system_executor(); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_SYSTEM_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/impl/system_context.ipp b/scout_sdk/asio/asio/impl/system_context.ipp deleted file mode 100644 index 8ad5e41..0000000 --- a/scout_sdk/asio/asio/impl/system_context.ipp +++ /dev/null @@ -1,73 +0,0 @@ -// -// impl/system_context.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_SYSTEM_CONTEXT_IPP -#define ASIO_IMPL_SYSTEM_CONTEXT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/system_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -struct system_context::thread_function -{ - detail::scheduler* scheduler_; - - void operator()() - { - asio::error_code ec; - scheduler_->run(ec); - } -}; - -system_context::system_context() - : scheduler_(use_service(*this)) -{ - scheduler_.work_started(); - - thread_function f = { &scheduler_ }; - std::size_t num_threads = detail::thread::hardware_concurrency() * 2; - threads_.create_threads(f, num_threads ? num_threads : 2); -} - -system_context::~system_context() -{ - scheduler_.work_finished(); - scheduler_.stop(); - threads_.join(); -} - -void system_context::stop() -{ - scheduler_.stop(); -} - -bool system_context::stopped() const ASIO_NOEXCEPT -{ - return scheduler_.stopped(); -} - -void system_context::join() -{ - scheduler_.work_finished(); - threads_.join(); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_SYSTEM_CONTEXT_IPP diff --git a/scout_sdk/asio/asio/impl/system_executor.hpp b/scout_sdk/asio/asio/impl/system_executor.hpp deleted file mode 100644 index ac4861f..0000000 --- a/scout_sdk/asio/asio/impl/system_executor.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// impl/system_executor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_SYSTEM_EXECUTOR_HPP -#define ASIO_IMPL_SYSTEM_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/executor_op.hpp" -#include "asio/detail/global.hpp" -#include "asio/detail/recycling_allocator.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/system_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -inline system_context& system_executor::context() const ASIO_NOEXCEPT -{ - return detail::global(); -} - -template -void system_executor::dispatch( - ASIO_MOVE_ARG(Function) f, const Allocator&) const -{ - typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); - asio_handler_invoke_helpers::invoke(tmp, tmp); -} - -template -void system_executor::post( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - system_context& ctx = detail::global(); - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((ctx, *p.p, - "system_executor", &this->context(), 0, "post")); - - ctx.scheduler_.post_immediate_completion(p.p, false); - p.v = p.p = 0; -} - -template -void system_executor::defer( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - system_context& ctx = detail::global(); - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((ctx, *p.p, - "system_executor", &this->context(), 0, "defer")); - - ctx.scheduler_.post_immediate_completion(p.p, true); - p.v = p.p = 0; -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_SYSTEM_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/impl/thread_pool.hpp b/scout_sdk/asio/asio/impl/thread_pool.hpp deleted file mode 100644 index 058e377..0000000 --- a/scout_sdk/asio/asio/impl/thread_pool.hpp +++ /dev/null @@ -1,127 +0,0 @@ -// -// impl/thread_pool.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_THREAD_POOL_HPP -#define ASIO_IMPL_THREAD_POOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/executor_op.hpp" -#include "asio/detail/fenced_block.hpp" -#include "asio/detail/recycling_allocator.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -inline thread_pool::executor_type -thread_pool::get_executor() ASIO_NOEXCEPT -{ - return executor_type(*this); -} - -inline thread_pool& -thread_pool::executor_type::context() const ASIO_NOEXCEPT -{ - return pool_; -} - -inline void -thread_pool::executor_type::on_work_started() const ASIO_NOEXCEPT -{ - pool_.scheduler_.work_started(); -} - -inline void thread_pool::executor_type::on_work_finished() -const ASIO_NOEXCEPT -{ - pool_.scheduler_.work_finished(); -} - -template -void thread_pool::executor_type::dispatch( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - // Invoke immediately if we are already inside the thread pool. - if (pool_.scheduler_.can_dispatch()) - { - // Make a local, non-const copy of the function. - function_type tmp(ASIO_MOVE_CAST(Function)(f)); - - detail::fenced_block b(detail::fenced_block::full); - asio_handler_invoke_helpers::invoke(tmp, tmp); - return; - } - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((pool_, *p.p, - "thread_pool", &this->context(), 0, "dispatch")); - - pool_.scheduler_.post_immediate_completion(p.p, false); - p.v = p.p = 0; -} - -template -void thread_pool::executor_type::post( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((pool_, *p.p, - "thread_pool", &this->context(), 0, "post")); - - pool_.scheduler_.post_immediate_completion(p.p, false); - p.v = p.p = 0; -} - -template -void thread_pool::executor_type::defer( - ASIO_MOVE_ARG(Function) f, const Allocator& a) const -{ - typedef typename decay::type function_type; - - // Allocate and construct an operation to wrap the function. - typedef detail::executor_op op; - typename op::ptr p = { detail::addressof(a), op::ptr::allocate(a), 0 }; - p.p = new (p.v) op(ASIO_MOVE_CAST(Function)(f), a); - - ASIO_HANDLER_CREATION((pool_, *p.p, - "thread_pool", &this->context(), 0, "defer")); - - pool_.scheduler_.post_immediate_completion(p.p, true); - p.v = p.p = 0; -} - -inline bool -thread_pool::executor_type::running_in_this_thread() const ASIO_NOEXCEPT -{ - return pool_.scheduler_.can_dispatch(); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_THREAD_POOL_HPP diff --git a/scout_sdk/asio/asio/impl/thread_pool.ipp b/scout_sdk/asio/asio/impl/thread_pool.ipp deleted file mode 100644 index 89583c1..0000000 --- a/scout_sdk/asio/asio/impl/thread_pool.ipp +++ /dev/null @@ -1,76 +0,0 @@ -// -// impl/thread_pool.ipp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_THREAD_POOL_IPP -#define ASIO_IMPL_THREAD_POOL_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/thread_pool.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -struct thread_pool::thread_function -{ - detail::scheduler* scheduler_; - - void operator()() - { - asio::error_code ec; - scheduler_->run(ec); - } -}; - -thread_pool::thread_pool() - : scheduler_(use_service(*this)) -{ - scheduler_.work_started(); - - thread_function f = { &scheduler_ }; - std::size_t num_threads = detail::thread::hardware_concurrency() * 2; - threads_.create_threads(f, num_threads ? num_threads : 2); -} - -thread_pool::thread_pool(std::size_t num_threads) - : scheduler_(use_service(*this)) -{ - scheduler_.work_started(); - - thread_function f = { &scheduler_ }; - threads_.create_threads(f, num_threads); -} - -thread_pool::~thread_pool() -{ - stop(); - join(); -} - -void thread_pool::stop() -{ - scheduler_.stop(); -} - -void thread_pool::join() -{ - scheduler_.work_finished(); - threads_.join(); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_THREAD_POOL_IPP diff --git a/scout_sdk/asio/asio/impl/use_future.hpp b/scout_sdk/asio/asio/impl/use_future.hpp deleted file mode 100644 index 51eb7e2..0000000 --- a/scout_sdk/asio/asio/impl/use_future.hpp +++ /dev/null @@ -1,938 +0,0 @@ -// -// impl/use_future.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_USE_FUTURE_HPP -#define ASIO_IMPL_USE_FUTURE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include "asio/async_result.hpp" -#include "asio/detail/memory.hpp" -#include "asio/error_code.hpp" -#include "asio/packaged_task.hpp" -#include "asio/system_error.hpp" -#include "asio/system_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -inline void promise_invoke_and_set(std::promise& p, - F& f, ASIO_MOVE_ARG(Args)... args) -{ -#if !defined(ASIO_NO_EXCEPTIONS) - try -#endif // !defined(ASIO_NO_EXCEPTIONS) - { - p.set_value(f(ASIO_MOVE_CAST(Args)(args)...)); - } -#if !defined(ASIO_NO_EXCEPTIONS) - catch (...) - { - p.set_exception(std::current_exception()); - } -#endif // !defined(ASIO_NO_EXCEPTIONS) -} - -template -inline void promise_invoke_and_set(std::promise& p, - F& f, ASIO_MOVE_ARG(Args)... args) -{ -#if !defined(ASIO_NO_EXCEPTIONS) - try -#endif // !defined(ASIO_NO_EXCEPTIONS) - { - f(ASIO_MOVE_CAST(Args)(args)...); - p.set_value(); - } -#if !defined(ASIO_NO_EXCEPTIONS) - catch (...) - { - p.set_exception(std::current_exception()); - } -#endif // !defined(ASIO_NO_EXCEPTIONS) -} - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -inline void promise_invoke_and_set(std::promise& p, F& f) -{ -#if !defined(ASIO_NO_EXCEPTIONS) - try -#endif // !defined(ASIO_NO_EXCEPTIONS) - { - p.set_value(f()); - } -#if !defined(ASIO_NO_EXCEPTIONS) - catch (...) - { - p.set_exception(std::current_exception()); - } -#endif // !defined(ASIO_NO_EXCEPTIONS) -} - -template -inline void promise_invoke_and_set(std::promise& p, F& f) -{ -#if !defined(ASIO_NO_EXCEPTIONS) - try -#endif // !defined(ASIO_NO_EXCEPTIONS) - { - f(); - p.set_value(); -#if !defined(ASIO_NO_EXCEPTIONS) - } - catch (...) - { - p.set_exception(std::current_exception()); - } -#endif // !defined(ASIO_NO_EXCEPTIONS) -} - -#if defined(ASIO_NO_EXCEPTIONS) - -#define ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \ - template \ - inline void promise_invoke_and_set(std::promise& p, \ - F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - p.set_value(f(ASIO_VARIADIC_MOVE_ARGS(n))); \ - } \ - \ - template \ - inline void promise_invoke_and_set(std::promise& p, \ - F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - f(ASIO_VARIADIC_MOVE_ARGS(n)); \ - p.set_value(); \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_INVOKE_DEF) -#undef ASIO_PRIVATE_PROMISE_INVOKE_DEF - -#else // defined(ASIO_NO_EXCEPTIONS) - -#define ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \ - template \ - inline void promise_invoke_and_set(std::promise& p, \ - F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - try \ - { \ - p.set_value(f(ASIO_VARIADIC_MOVE_ARGS(n))); \ - } \ - catch (...) \ - { \ - p.set_exception(std::current_exception()); \ - } \ - } \ - \ - template \ - inline void promise_invoke_and_set(std::promise& p, \ - F& f, ASIO_VARIADIC_MOVE_PARAMS(n)) \ - { \ - try \ - { \ - f(ASIO_VARIADIC_MOVE_ARGS(n)); \ - p.set_value(); \ - } \ - catch (...) \ - { \ - p.set_exception(std::current_exception()); \ - } \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_INVOKE_DEF) -#undef ASIO_PRIVATE_PROMISE_INVOKE_DEF - -#endif // defined(ASIO_NO_EXCEPTIONS) - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -// A function object adapter to invoke a nullary function object and capture -// any exception thrown into a promise. -template -class promise_invoker -{ -public: - promise_invoker(const shared_ptr >& p, - ASIO_MOVE_ARG(F) f) - : p_(p), f_(ASIO_MOVE_CAST(F)(f)) - { - } - - void operator()() - { -#if !defined(ASIO_NO_EXCEPTIONS) - try -#endif // !defined(ASIO_NO_EXCEPTIONS) - { - f_(); - } -#if !defined(ASIO_NO_EXCEPTIONS) - catch (...) - { - p_->set_exception(std::current_exception()); - } -#endif // !defined(ASIO_NO_EXCEPTIONS) - } - -private: - shared_ptr > p_; - typename decay::type f_; -}; - -// An executor that adapts the system_executor to capture any exeption thrown -// by a submitted function object and save it into a promise. -template -class promise_executor -{ -public: - explicit promise_executor(const shared_ptr >& p) - : p_(p) - { - } - - execution_context& context() const ASIO_NOEXCEPT - { - return system_executor().context(); - } - - void on_work_started() const ASIO_NOEXCEPT {} - void on_work_finished() const ASIO_NOEXCEPT {} - - template - void dispatch(ASIO_MOVE_ARG(F) f, const A&) const - { - promise_invoker(p_, ASIO_MOVE_CAST(F)(f))(); - } - - template - void post(ASIO_MOVE_ARG(F) f, const A& a) const - { - system_executor().post( - promise_invoker(p_, ASIO_MOVE_CAST(F)(f)), a); - } - - template - void defer(ASIO_MOVE_ARG(F) f, const A& a) const - { - system_executor().defer( - promise_invoker(p_, ASIO_MOVE_CAST(F)(f)), a); - } - - friend bool operator==(const promise_executor& a, - const promise_executor& b) ASIO_NOEXCEPT - { - return a.p_ == b.p_; - } - - friend bool operator!=(const promise_executor& a, - const promise_executor& b) ASIO_NOEXCEPT - { - return a.p_ != b.p_; - } - -private: - shared_ptr > p_; -}; - -// The base class for all completion handlers that create promises. -template -class promise_creator -{ -public: - typedef promise_executor executor_type; - - executor_type get_executor() const ASIO_NOEXCEPT - { - return executor_type(p_); - } - - typedef std::future future_type; - - future_type get_future() - { - return p_->get_future(); - } - -protected: - template - void create_promise(const Allocator& a) - { - ASIO_REBIND_ALLOC(Allocator, char) b(a); - p_ = std::allocate_shared>(b, std::allocator_arg, b); - } - - shared_ptr > p_; -}; - -// For completion signature void(). -class promise_handler_0 - : public promise_creator -{ -public: - void operator()() - { - this->p_->set_value(); - } -}; - -// For completion signature void(error_code). -class promise_handler_ec_0 - : public promise_creator -{ -public: - void operator()(const asio::error_code& ec) - { - if (ec) - { - this->p_->set_exception( - std::make_exception_ptr( - asio::system_error(ec))); - } - else - { - this->p_->set_value(); - } - } -}; - -// For completion signature void(exception_ptr). -class promise_handler_ex_0 - : public promise_creator -{ -public: - void operator()(const std::exception_ptr& ex) - { - if (ex) - { - this->p_->set_exception(ex); - } - else - { - this->p_->set_value(); - } - } -}; - -// For completion signature void(T). -template -class promise_handler_1 - : public promise_creator -{ -public: - template - void operator()(ASIO_MOVE_ARG(Arg) arg) - { - this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg)); - } -}; - -// For completion signature void(error_code, T). -template -class promise_handler_ec_1 - : public promise_creator -{ -public: - template - void operator()(const asio::error_code& ec, - ASIO_MOVE_ARG(Arg) arg) - { - if (ec) - { - this->p_->set_exception( - std::make_exception_ptr( - asio::system_error(ec))); - } - else - this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg)); - } -}; - -// For completion signature void(exception_ptr, T). -template -class promise_handler_ex_1 - : public promise_creator -{ -public: - template - void operator()(const std::exception_ptr& ex, - ASIO_MOVE_ARG(Arg) arg) - { - if (ex) - this->p_->set_exception(ex); - else - this->p_->set_value(ASIO_MOVE_CAST(Arg)(arg)); - } -}; - -// For completion signature void(T1, ..., Tn); -template -class promise_handler_n - : public promise_creator -{ -public: -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - void operator()(ASIO_MOVE_ARG(Args)... args) - { - this->p_->set_value( - std::forward_as_tuple( - ASIO_MOVE_CAST(Args)(args)...)); - } - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#define ASIO_PRIVATE_CALL_OP_DEF(n) \ - template \ - void operator()(ASIO_VARIADIC_MOVE_PARAMS(n)) \ - {\ - this->p_->set_value( \ - std::forward_as_tuple( \ - ASIO_VARIADIC_MOVE_ARGS(n))); \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) -#undef ASIO_PRIVATE_CALL_OP_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) -}; - -// For completion signature void(error_code, T1, ..., Tn); -template -class promise_handler_ec_n - : public promise_creator -{ -public: -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - void operator()(const asio::error_code& ec, - ASIO_MOVE_ARG(Args)... args) - { - if (ec) - { - this->p_->set_exception( - std::make_exception_ptr( - asio::system_error(ec))); - } - else - { - this->p_->set_value( - std::forward_as_tuple( - ASIO_MOVE_CAST(Args)(args)...)); - } - } - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#define ASIO_PRIVATE_CALL_OP_DEF(n) \ - template \ - void operator()(const asio::error_code& ec, \ - ASIO_VARIADIC_MOVE_PARAMS(n)) \ - {\ - if (ec) \ - { \ - this->p_->set_exception( \ - std::make_exception_ptr( \ - asio::system_error(ec))); \ - } \ - else \ - { \ - this->p_->set_value( \ - std::forward_as_tuple( \ - ASIO_VARIADIC_MOVE_ARGS(n))); \ - } \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) -#undef ASIO_PRIVATE_CALL_OP_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) -}; - -// For completion signature void(exception_ptr, T1, ..., Tn); -template -class promise_handler_ex_n - : public promise_creator -{ -public: -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - void operator()(const std::exception_ptr& ex, - ASIO_MOVE_ARG(Args)... args) - { - if (ex) - this->p_->set_exception(ex); - else - { - this->p_->set_value( - std::forward_as_tuple( - ASIO_MOVE_CAST(Args)(args)...)); - } - } - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#define ASIO_PRIVATE_CALL_OP_DEF(n) \ - template \ - void operator()(const std::exception_ptr& ex, \ - ASIO_VARIADIC_MOVE_PARAMS(n)) \ - {\ - if (ex) \ - this->p_->set_exception(ex); \ - else \ - { \ - this->p_->set_value( \ - std::forward_as_tuple( \ - ASIO_VARIADIC_MOVE_ARGS(n))); \ - } \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) -#undef ASIO_PRIVATE_CALL_OP_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) -}; - -// Helper template to choose the appropriate concrete promise handler -// implementation based on the supplied completion signature. -template class promise_handler_selector; - -template <> -class promise_handler_selector - : public promise_handler_0 {}; - -template <> -class promise_handler_selector - : public promise_handler_ec_0 {}; - -template <> -class promise_handler_selector - : public promise_handler_ex_0 {}; - -template -class promise_handler_selector - : public promise_handler_1 {}; - -template -class promise_handler_selector - : public promise_handler_ec_1 {}; - -template -class promise_handler_selector - : public promise_handler_ex_1 {}; - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -class promise_handler_selector - : public promise_handler_n > {}; - -template -class promise_handler_selector - : public promise_handler_ec_n > {}; - -template -class promise_handler_selector - : public promise_handler_ex_n > {}; - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#define ASIO_PRIVATE_PROMISE_SELECTOR_DEF(n) \ - template \ - class promise_handler_selector< \ - void(Arg, ASIO_VARIADIC_TARGS(n))> \ - : public promise_handler_n< \ - std::tuple > {}; \ - \ - template \ - class promise_handler_selector< \ - void(asio::error_code, Arg, ASIO_VARIADIC_TARGS(n))> \ - : public promise_handler_ec_n< \ - std::tuple > {}; \ - \ - template \ - class promise_handler_selector< \ - void(std::exception_ptr, Arg, ASIO_VARIADIC_TARGS(n))> \ - : public promise_handler_ex_n< \ - std::tuple > {}; \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_PROMISE_SELECTOR_DEF) -#undef ASIO_PRIVATE_PROMISE_SELECTOR_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -// Completion handlers produced from the use_future completion token, when not -// using use_future::operator(). -template -class promise_handler - : public promise_handler_selector -{ -public: - typedef Allocator allocator_type; - typedef void result_type; - - promise_handler(use_future_t u) - : allocator_(u.get_allocator()) - { - this->create_promise(allocator_); - } - - allocator_type get_allocator() const ASIO_NOEXCEPT - { - return allocator_; - } - -private: - Allocator allocator_; -}; - -template -inline void asio_handler_invoke(Function& f, - promise_handler* h) -{ - typename promise_handler::executor_type - ex(h->get_executor()); - ex.dispatch(ASIO_MOVE_CAST(Function)(f), std::allocator()); -} - -template -inline void asio_handler_invoke(const Function& f, - promise_handler* h) -{ - typename promise_handler::executor_type - ex(h->get_executor()); - ex.dispatch(f, std::allocator()); -} - -// Helper base class for async_result specialisation. -template -class promise_async_result -{ -public: - typedef promise_handler completion_handler_type; - typedef typename completion_handler_type::future_type return_type; - - explicit promise_async_result(completion_handler_type& h) - : future_(h.get_future()) - { - } - - return_type get() - { - return ASIO_MOVE_CAST(return_type)(future_); - } - -private: - return_type future_; -}; - -// Return value from use_future::operator(). -template -class packaged_token -{ -public: - packaged_token(Function f, const Allocator& a) - : function_(ASIO_MOVE_CAST(Function)(f)), - allocator_(a) - { - } - -//private: - Function function_; - Allocator allocator_; -}; - -// Completion handlers produced from the use_future completion token, when -// using use_future::operator(). -template -class packaged_handler - : public promise_creator -{ -public: - typedef Allocator allocator_type; - typedef void result_type; - - packaged_handler(packaged_token t) - : function_(ASIO_MOVE_CAST(Function)(t.function_)), - allocator_(t.allocator_) - { - this->create_promise(allocator_); - } - - allocator_type get_allocator() const ASIO_NOEXCEPT - { - return allocator_; - } - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - - template - void operator()(ASIO_MOVE_ARG(Args)... args) - { - (promise_invoke_and_set)(*this->p_, - function_, ASIO_MOVE_CAST(Args)(args)...); - } - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - - void operator()() - { - (promise_invoke_and_set)(*this->p_, function_); - } - -#define ASIO_PRIVATE_CALL_OP_DEF(n) \ - template \ - void operator()(ASIO_VARIADIC_MOVE_PARAMS(n)) \ - {\ - (promise_invoke_and_set)(*this->p_, \ - function_, ASIO_VARIADIC_MOVE_ARGS(n)); \ - } \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_CALL_OP_DEF) -#undef ASIO_PRIVATE_CALL_OP_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -private: - Function function_; - Allocator allocator_; -}; - -template -inline void asio_handler_invoke(Function& f, - packaged_handler* h) -{ - typename packaged_handler::executor_type - ex(h->get_executor()); - ex.dispatch(ASIO_MOVE_CAST(Function)(f), std::allocator()); -} - -template -inline void asio_handler_invoke(const Function& f, - packaged_handler* h) -{ - typename packaged_handler::executor_type - ex(h->get_executor()); - ex.dispatch(f, std::allocator()); -} - -// Helper base class for async_result specialisation. -template -class packaged_async_result -{ -public: - typedef packaged_handler completion_handler_type; - typedef typename completion_handler_type::future_type return_type; - - explicit packaged_async_result(completion_handler_type& h) - : future_(h.get_future()) - { - } - - return_type get() - { - return ASIO_MOVE_CAST(return_type)(future_); - } - -private: - return_type future_; -}; - -} // namespace detail - -template template -inline detail::packaged_token::type, Allocator> -use_future_t::operator()(ASIO_MOVE_ARG(Function) f) const -{ - return detail::packaged_token::type, Allocator>( - ASIO_MOVE_CAST(Function)(f), allocator_); -} - -#if !defined(GENERATING_DOCUMENTATION) - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -class async_result, Result(Args...)> - : public detail::promise_async_result< - void(typename decay::type...), Allocator> -{ -public: - explicit async_result( - typename detail::promise_async_result::type...), - Allocator>::completion_handler_type& h) - : detail::promise_async_result< - void(typename decay::type...), Allocator>(h) - { - } -}; - -template -class async_result, Result(Args...)> - : public detail::packaged_async_result::type> -{ -public: - explicit async_result( - typename detail::packaged_async_result::type>::completion_handler_type& h) - : detail::packaged_async_result::type>(h) - { - } -}; - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -template -class async_result, Result()> - : public detail::promise_async_result -{ -public: - explicit async_result( - typename detail::promise_async_result< - void(), Allocator>::completion_handler_type& h) - : detail::promise_async_result(h) - { - } -}; - -template -class async_result, Result()> - : public detail::packaged_async_result::type> -{ -public: - explicit async_result( - typename detail::packaged_async_result::type>::completion_handler_type& h) - : detail::packaged_async_result::type>(h) - { - } -}; - -#define ASIO_PRIVATE_ASYNC_RESULT_DEF(n) \ - template \ - class async_result, \ - Result(ASIO_VARIADIC_TARGS(n))> \ - : public detail::promise_async_result< \ - void(ASIO_VARIADIC_DECAY(n)), Allocator> \ - { \ - public: \ - explicit async_result( \ - typename detail::promise_async_result< \ - void(ASIO_VARIADIC_DECAY(n)), \ - Allocator>::completion_handler_type& h) \ - : detail::promise_async_result< \ - void(ASIO_VARIADIC_DECAY(n)), Allocator>(h) \ - { \ - } \ - }; \ - \ - template \ - class async_result, \ - Result(ASIO_VARIADIC_TARGS(n))> \ - : public detail::packaged_async_result::type> \ - { \ - public: \ - explicit async_result( \ - typename detail::packaged_async_result::type \ - >::completion_handler_type& h) \ - : detail::packaged_async_result::type>(h) \ - { \ - } \ - }; \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_ASYNC_RESULT_DEF) -#undef ASIO_PRIVATE_ASYNC_RESULT_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - -#if !defined(ASIO_NO_DEPRECATED) - -template -struct handler_type, Signature> -{ - typedef typename async_result, - Signature>::completion_handler_type type; -}; - -template -class async_result > - : public detail::promise_async_result -{ -public: - typedef typename detail::promise_async_result< - Signature, Allocator>::return_type type; - - explicit async_result( - typename detail::promise_async_result< - Signature, Allocator>::completion_handler_type& h) - : detail::promise_async_result(h) - { - } -}; - -template -struct handler_type, Signature> -{ - typedef typename async_result, - Signature>::completion_handler_type type; -}; - -template -class async_result > - : public detail::packaged_async_result -{ -public: - typedef typename detail::packaged_async_result< - Function, Allocator, Result>::return_type type; - - explicit async_result( - typename detail::packaged_async_result< - Function, Allocator, Result>::completion_handler_type& h) - : detail::packaged_async_result(h) - { - } -}; - -#endif // !defined(ASIO_NO_DEPRECATED) - -#endif // !defined(GENERATING_DOCUMENTATION) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_USE_FUTURE_HPP diff --git a/scout_sdk/asio/asio/impl/write.hpp b/scout_sdk/asio/asio/impl/write.hpp deleted file mode 100644 index d07e8d3..0000000 --- a/scout_sdk/asio/asio/impl/write.hpp +++ /dev/null @@ -1,674 +0,0 @@ -// -// impl/write.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_WRITE_HPP -#define ASIO_IMPL_WRITE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/detail/array_fwd.hpp" -#include "asio/detail/base_from_completion_cond.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/consuming_buffers.hpp" -#include "asio/detail/dependent_type.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - template - std::size_t write_buffer_sequence(SyncWriteStream& s, - const ConstBufferSequence& buffers, const ConstBufferIterator&, - CompletionCondition completion_condition, asio::error_code& ec) - { - ec = asio::error_code(); - asio::detail::consuming_buffers tmp(buffers); - while (!tmp.empty()) - { - if (std::size_t max_size = detail::adapt_completion_condition_result( - completion_condition(ec, tmp.total_consumed()))) - tmp.consume(s.write_some(tmp.prepare(max_size), ec)); - else - break; - } - return tmp.total_consumed();; - } -} // namespace detail - -template -inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_const_buffer_sequence::value - >::type*) -{ - return detail::write_buffer_sequence(s, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, ec); -} - -template -inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - typename enable_if< - is_const_buffer_sequence::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = write(s, buffers, transfer_all(), ec); - asio::detail::throw_error(ec, "write"); - return bytes_transferred; -} - -template -inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - asio::error_code& ec, - typename enable_if< - is_const_buffer_sequence::value - >::type*) -{ - return write(s, buffers, transfer_all(), ec); -} - -template -inline std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, - typename enable_if< - is_const_buffer_sequence::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = write(s, buffers, completion_condition, ec); - asio::detail::throw_error(ec, "write"); - return bytes_transferred; -} - -template -std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - typename decay::type b( - ASIO_MOVE_CAST(DynamicBuffer)(buffers)); - - std::size_t bytes_transferred = write(s, b.data(), completion_condition, ec); - b.consume(bytes_transferred); - return bytes_transferred; -} - -template -inline std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = write(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), - transfer_all(), ec); - asio::detail::throw_error(ec, "write"); - return bytes_transferred; -} - -template -inline std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - return write(s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - transfer_all(), ec); -} - -template -inline std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - asio::error_code ec; - std::size_t bytes_transferred = write(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), - completion_condition, ec); - asio::detail::throw_error(ec, "write"); - return bytes_transferred; -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -template -inline std::size_t write(SyncWriteStream& s, - asio::basic_streambuf& b, - CompletionCondition completion_condition, asio::error_code& ec) -{ - return write(s, basic_streambuf_ref(b), completion_condition, ec); -} - -template -inline std::size_t write(SyncWriteStream& s, - asio::basic_streambuf& b) -{ - return write(s, basic_streambuf_ref(b)); -} - -template -inline std::size_t write(SyncWriteStream& s, - asio::basic_streambuf& b, - asio::error_code& ec) -{ - return write(s, basic_streambuf_ref(b), ec); -} - -template -inline std::size_t write(SyncWriteStream& s, - asio::basic_streambuf& b, - CompletionCondition completion_condition) -{ - return write(s, basic_streambuf_ref(b), completion_condition); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -namespace detail -{ - template - class write_op - : detail::base_from_completion_cond - { - public: - write_op(AsyncWriteStream& stream, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, WriteHandler& handler) - : detail::base_from_completion_cond< - CompletionCondition>(completion_condition), - stream_(stream), - buffers_(buffers), - start_(0), - handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - write_op(const write_op& other) - : detail::base_from_completion_cond(other), - stream_(other.stream_), - buffers_(other.buffers_), - start_(other.start_), - handler_(other.handler_) - { - } - - write_op(write_op&& other) - : detail::base_from_completion_cond(other), - stream_(other.stream_), - buffers_(other.buffers_), - start_(other.start_), - handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - std::size_t max_size; - switch (start_ = start) - { - case 1: - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - do - { - stream_.async_write_some(buffers_.prepare(max_size), - ASIO_MOVE_CAST(write_op)(*this)); - return; default: - buffers_.consume(bytes_transferred); - if ((!ec && bytes_transferred == 0) || buffers_.empty()) - break; - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - } while (max_size > 0); - - handler_(ec, buffers_.total_consumed()); - } - } - - //private: - AsyncWriteStream& stream_; - asio::detail::consuming_buffers buffers_; - int start_; - WriteHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - write_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - write_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - write_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - write_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - write_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void start_write_buffer_sequence_op(AsyncWriteStream& stream, - const ConstBufferSequence& buffers, const ConstBufferIterator&, - CompletionCondition completion_condition, WriteHandler& handler) - { - detail::write_op( - stream, buffers, completion_condition, handler)( - asio::error_code(), 0, 1); - } - -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::write_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::write_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::write_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::write_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_const_buffer_sequence::value - >::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - detail::start_write_buffer_sequence_op(s, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, - init.completion_handler); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_const_buffer_sequence::value - >::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - detail::start_write_buffer_sequence_op(s, buffers, - asio::buffer_sequence_begin(buffers), transfer_all(), - init.completion_handler); - - return init.result.get(); -} - -namespace detail -{ - template - class write_dynbuf_op - { - public: - template - write_dynbuf_op(AsyncWriteStream& stream, - ASIO_MOVE_ARG(BufferSequence) buffers, - CompletionCondition completion_condition, WriteHandler& handler) - : stream_(stream), - buffers_(ASIO_MOVE_CAST(BufferSequence)(buffers)), - completion_condition_( - ASIO_MOVE_CAST(CompletionCondition)(completion_condition)), - handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - write_dynbuf_op(const write_dynbuf_op& other) - : stream_(other.stream_), - buffers_(other.buffers_), - completion_condition_(other.completion_condition_), - handler_(other.handler_) - { - } - - write_dynbuf_op(write_dynbuf_op&& other) - : stream_(other.stream_), - buffers_(ASIO_MOVE_CAST(DynamicBuffer)(other.buffers_)), - completion_condition_( - ASIO_MOVE_CAST(CompletionCondition)( - other.completion_condition_)), - handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - switch (start) - { - case 1: - async_write(stream_, buffers_.data(), completion_condition_, - ASIO_MOVE_CAST(write_dynbuf_op)(*this)); - return; default: - buffers_.consume(bytes_transferred); - handler_(ec, static_cast(bytes_transferred)); - } - } - - //private: - AsyncWriteStream& stream_; - DynamicBuffer buffers_; - CompletionCondition completion_condition_; - WriteHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - write_dynbuf_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - write_dynbuf_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - write_dynbuf_op* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - write_dynbuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - write_dynbuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::write_dynbuf_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::write_dynbuf_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::write_dynbuf_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::write_dynbuf_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - return async_write(s, - ASIO_MOVE_CAST(DynamicBuffer)(buffers), - transfer_all(), ASIO_MOVE_CAST(WriteHandler)(handler)); -} - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type*) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - detail::write_dynbuf_op::type, - CompletionCondition, ASIO_HANDLER_TYPE( - WriteHandler, void (asio::error_code, std::size_t))>( - s, ASIO_MOVE_CAST(DynamicBuffer)(buffers), - completion_condition, init.completion_handler)( - asio::error_code(), 0, 1); - - return init.result.get(); -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, - asio::basic_streambuf& b, - ASIO_MOVE_ARG(WriteHandler) handler) -{ - return async_write(s, basic_streambuf_ref(b), - ASIO_MOVE_CAST(WriteHandler)(handler)); -} - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, - asio::basic_streambuf& b, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler) -{ - return async_write(s, basic_streambuf_ref(b), - completion_condition, ASIO_MOVE_CAST(WriteHandler)(handler)); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_WRITE_HPP diff --git a/scout_sdk/asio/asio/impl/write_at.hpp b/scout_sdk/asio/asio/impl/write_at.hpp deleted file mode 100644 index cc6f336..0000000 --- a/scout_sdk/asio/asio/impl/write_at.hpp +++ /dev/null @@ -1,572 +0,0 @@ -// -// impl/write_at.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IMPL_WRITE_AT_HPP -#define ASIO_IMPL_WRITE_AT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/associated_allocator.hpp" -#include "asio/associated_executor.hpp" -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/detail/array_fwd.hpp" -#include "asio/detail/base_from_completion_cond.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/consuming_buffers.hpp" -#include "asio/detail/dependent_type.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_cont_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - template - std::size_t write_at_buffer_sequence(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - const ConstBufferIterator&, CompletionCondition completion_condition, - asio::error_code& ec) - { - ec = asio::error_code(); - asio::detail::consuming_buffers tmp(buffers); - while (!tmp.empty()) - { - if (std::size_t max_size = detail::adapt_completion_condition_result( - completion_condition(ec, tmp.total_consumed()))) - { - tmp.consume(d.write_some_at(offset + tmp.total_consumed(), - tmp.prepare(max_size), ec)); - } - else - break; - } - return tmp.total_consumed();; - } -} // namespace detail - -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec) -{ - return detail::write_at_buffer_sequence(d, offset, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, ec); -} - -template -inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers) -{ - asio::error_code ec; - std::size_t bytes_transferred = write_at( - d, offset, buffers, transfer_all(), ec); - asio::detail::throw_error(ec, "write_at"); - return bytes_transferred; -} - -template -inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - asio::error_code& ec) -{ - return write_at(d, offset, buffers, transfer_all(), ec); -} - -template -inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - CompletionCondition completion_condition) -{ - asio::error_code ec; - std::size_t bytes_transferred = write_at( - d, offset, buffers, completion_condition, ec); - asio::detail::throw_error(ec, "write_at"); - return bytes_transferred; -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, asio::basic_streambuf& b, - CompletionCondition completion_condition, asio::error_code& ec) -{ - std::size_t bytes_transferred = write_at( - d, offset, b.data(), completion_condition, ec); - b.consume(bytes_transferred); - return bytes_transferred; -} - -template -inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, asio::basic_streambuf& b) -{ - asio::error_code ec; - std::size_t bytes_transferred = write_at(d, offset, b, transfer_all(), ec); - asio::detail::throw_error(ec, "write_at"); - return bytes_transferred; -} - -template -inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, asio::basic_streambuf& b, - asio::error_code& ec) -{ - return write_at(d, offset, b, transfer_all(), ec); -} - -template -inline std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, asio::basic_streambuf& b, - CompletionCondition completion_condition) -{ - asio::error_code ec; - std::size_t bytes_transferred = write_at( - d, offset, b, completion_condition, ec); - asio::detail::throw_error(ec, "write_at"); - return bytes_transferred; -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -namespace detail -{ - template - class write_at_op - : detail::base_from_completion_cond - { - public: - write_at_op(AsyncRandomAccessWriteDevice& device, - uint64_t offset, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, WriteHandler& handler) - : detail::base_from_completion_cond< - CompletionCondition>(completion_condition), - device_(device), - offset_(offset), - buffers_(buffers), - start_(0), - handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - write_at_op(const write_at_op& other) - : detail::base_from_completion_cond(other), - device_(other.device_), - offset_(other.offset_), - buffers_(other.buffers_), - start_(other.start_), - handler_(other.handler_) - { - } - - write_at_op(write_at_op&& other) - : detail::base_from_completion_cond(other), - device_(other.device_), - offset_(other.offset_), - buffers_(other.buffers_), - start_(other.start_), - handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - std::size_t bytes_transferred, int start = 0) - { - std::size_t max_size; - switch (start_ = start) - { - case 1: - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - do - { - device_.async_write_some_at( - offset_ + buffers_.total_consumed(), buffers_.prepare(max_size), - ASIO_MOVE_CAST(write_at_op)(*this)); - return; default: - buffers_.consume(bytes_transferred); - if ((!ec && bytes_transferred == 0) || buffers_.empty()) - break; - max_size = this->check_for_completion(ec, buffers_.total_consumed()); - } while (max_size > 0); - - handler_(ec, buffers_.total_consumed()); - } - } - - //private: - AsyncRandomAccessWriteDevice& device_; - uint64_t offset_; - asio::detail::consuming_buffers buffers_; - int start_; - WriteHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - write_at_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - write_at_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - write_at_op* this_handler) - { - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - write_at_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - write_at_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void start_write_at_buffer_sequence_op(AsyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - const ConstBufferIterator&, CompletionCondition completion_condition, - WriteHandler& handler) - { - detail::write_at_op( - d, offset, buffers, completion_condition, handler)( - asio::error_code(), 0, 1); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::write_at_op, - Allocator> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::write_at_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::write_at_op, - Executor> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::write_at_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - detail::start_write_at_buffer_sequence_op(d, offset, buffers, - asio::buffer_sequence_begin(buffers), completion_condition, - init.completion_handler); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - detail::start_write_at_buffer_sequence_op(d, offset, buffers, - asio::buffer_sequence_begin(buffers), transfer_all(), - init.completion_handler); - - return init.result.get(); -} - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -namespace detail -{ - template - class write_at_streambuf_op - { - public: - write_at_streambuf_op( - asio::basic_streambuf& streambuf, - WriteHandler& handler) - : streambuf_(streambuf), - handler_(ASIO_MOVE_CAST(WriteHandler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - write_at_streambuf_op(const write_at_streambuf_op& other) - : streambuf_(other.streambuf_), - handler_(other.handler_) - { - } - - write_at_streambuf_op(write_at_streambuf_op&& other) - : streambuf_(other.streambuf_), - handler_(ASIO_MOVE_CAST(WriteHandler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(const asio::error_code& ec, - const std::size_t bytes_transferred) - { - streambuf_.consume(bytes_transferred); - handler_(ec, bytes_transferred); - } - - //private: - asio::basic_streambuf& streambuf_; - WriteHandler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - write_at_streambuf_op* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - write_at_streambuf_op* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); - } - - template - inline bool asio_handler_is_continuation( - write_at_streambuf_op* this_handler) - { - return asio_handler_cont_helpers::is_continuation( - this_handler->handler_); - } - - template - inline void asio_handler_invoke(Function& function, - write_at_streambuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - write_at_streambuf_op* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); - } - - template - inline write_at_streambuf_op - make_write_at_streambuf_op( - asio::basic_streambuf& b, WriteHandler handler) - { - return write_at_streambuf_op(b, handler); - } -} // namespace detail - -#if !defined(GENERATING_DOCUMENTATION) - -template -struct associated_allocator< - detail::write_at_streambuf_op, - Allocator1> -{ - typedef typename associated_allocator::type type; - - static type get( - const detail::write_at_streambuf_op& h, - const Allocator1& a = Allocator1()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - detail::write_at_streambuf_op, - Executor1> -{ - typedef typename associated_executor::type type; - - static type get( - const detail::write_at_streambuf_op& h, - const Executor1& ex = Executor1()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -#endif // !defined(GENERATING_DOCUMENTATION) - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, - uint64_t offset, asio::basic_streambuf& b, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - async_write_at(d, offset, b.data(), completion_condition, - detail::write_at_streambuf_op( - b, init.completion_handler)); - - return init.result.get(); -} - -template -inline ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, - uint64_t offset, asio::basic_streambuf& b, - ASIO_MOVE_ARG(WriteHandler) handler) -{ - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - async_write_at(d, offset, b.data(), transfer_all(), - detail::write_at_streambuf_op( - b, init.completion_handler)); - - return init.result.get(); -} - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IMPL_WRITE_AT_HPP diff --git a/scout_sdk/asio/asio/io_context.hpp b/scout_sdk/asio/asio/io_context.hpp deleted file mode 100644 index 4d93be4..0000000 --- a/scout_sdk/asio/asio/io_context.hpp +++ /dev/null @@ -1,876 +0,0 @@ -// -// io_context.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IO_CONTEXT_HPP -#define ASIO_IO_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include "asio/async_result.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/wrapped_handler.hpp" -#include "asio/error_code.hpp" -#include "asio/execution_context.hpp" - -#if defined(ASIO_HAS_CHRONO) -# include "asio/detail/chrono.hpp" -#endif // defined(ASIO_HAS_CHRONO) - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# include "asio/detail/winsock_init.hpp" -#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \ - || defined(__osf__) -# include "asio/detail/signal_init.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail { -#if defined(ASIO_HAS_IOCP) - typedef class win_iocp_io_context io_context_impl; - class win_iocp_overlapped_ptr; -#else - typedef class scheduler io_context_impl; -#endif -} // namespace detail - -/// Provides core I/O functionality. -/** - * The io_context class provides the core I/O functionality for users of the - * asynchronous I/O objects, including: - * - * @li asio::ip::tcp::socket - * @li asio::ip::tcp::acceptor - * @li asio::ip::udp::socket - * @li asio::deadline_timer. - * - * The io_context class also includes facilities intended for developers of - * custom asynchronous services. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe, with the specific exceptions of the restart() - * and notify_fork() functions. Calling restart() while there are unfinished - * run(), run_one(), run_for(), run_until(), poll() or poll_one() calls results - * in undefined behaviour. The notify_fork() function should not be called - * while any io_context function, or any function on an I/O object that is - * associated with the io_context, is being called in another thread. - * - * @par Concepts: - * Dispatcher. - * - * @par Synchronous and asynchronous operations - * - * Synchronous operations on I/O objects implicitly run the io_context object - * for an individual operation. The io_context functions run(), run_one(), - * run_for(), run_until(), poll() or poll_one() must be called for the - * io_context to perform asynchronous operations on behalf of a C++ program. - * Notification that an asynchronous operation has completed is delivered by - * invocation of the associated handler. Handlers are invoked only by a thread - * that is currently calling any overload of run(), run_one(), run_for(), - * run_until(), poll() or poll_one() for the io_context. - * - * @par Effect of exceptions thrown from handlers - * - * If an exception is thrown from a handler, the exception is allowed to - * propagate through the throwing thread's invocation of run(), run_one(), - * run_for(), run_until(), poll() or poll_one(). No other threads that are - * calling any of these functions are affected. It is then the responsibility - * of the application to catch the exception. - * - * After the exception has been caught, the run(), run_one(), run_for(), - * run_until(), poll() or poll_one() call may be restarted @em without the need - * for an intervening call to restart(). This allows the thread to rejoin the - * io_context object's thread pool without impacting any other threads in the - * pool. - * - * For example: - * - * @code - * asio::io_context io_context; - * ... - * for (;;) - * { - * try - * { - * io_context.run(); - * break; // run() exited normally - * } - * catch (my_exception& e) - * { - * // Deal with exception as appropriate. - * } - * } - * @endcode - * - * @par Submitting arbitrary tasks to the io_context - * - * To submit functions to the io_context, use the @ref asio::dispatch, - * @ref asio::post or @ref asio::defer free functions. - * - * For example: - * - * @code void my_task() - * { - * ... - * } - * - * ... - * - * asio::io_context io_context; - * - * // Submit a function to the io_context. - * asio::post(io_context, my_task); - * - * // Submit a lambda object to the io_context. - * asio::post(io_context, - * []() - * { - * ... - * }); - * - * // Run the io_context until it runs out of work. - * io_context.run(); @endcode - * - * @par Stopping the io_context from running out of work - * - * Some applications may need to prevent an io_context object's run() call from - * returning when there is no more work to do. For example, the io_context may - * be being run in a background thread that is launched prior to the - * application's asynchronous operations. The run() call may be kept running by - * creating an object of type - * asio::executor_work_guard: - * - * @code asio::io_context io_context; - * asio::executor_work_guard - * = asio::make_work_guard(io_context); - * ... @endcode - * - * To effect a shutdown, the application will then need to call the io_context - * object's stop() member function. This will cause the io_context run() call - * to return as soon as possible, abandoning unfinished operations and without - * permitting ready handlers to be dispatched. - * - * Alternatively, if the application requires that all operations and handlers - * be allowed to finish normally, the work object may be explicitly reset. - * - * @code asio::io_context io_context; - * asio::executor_work_guard - * = asio::make_work_guard(io_context); - * ... - * work.reset(); // Allow run() to exit. @endcode - */ -class io_context - : public execution_context -{ -private: - typedef detail::io_context_impl impl_type; -#if defined(ASIO_HAS_IOCP) - friend class detail::win_iocp_overlapped_ptr; -#endif - -public: - class executor_type; - friend class executor_type; - -#if !defined(ASIO_NO_DEPRECATED) - class work; - friend class work; -#endif // !defined(ASIO_NO_DEPRECATED) - - class service; - -#if !defined(ASIO_NO_EXTENSIONS) - class strand; -#endif // !defined(ASIO_NO_EXTENSIONS) - - /// The type used to count the number of handlers executed by the context. - typedef std::size_t count_type; - - /// Constructor. - ASIO_DECL io_context(); - - /// Constructor. - /** - * Construct with a hint about the required level of concurrency. - * - * @param concurrency_hint A suggestion to the implementation on how many - * threads it should allow to run simultaneously. - */ - ASIO_DECL explicit io_context(int concurrency_hint); - - /// Destructor. - /** - * On destruction, the io_context performs the following sequence of - * operations: - * - * @li For each service object @c svc in the io_context set, in reverse order - * of the beginning of service object lifetime, performs - * @c svc->shutdown(). - * - * @li Uninvoked handler objects that were scheduled for deferred invocation - * on the io_context, or any associated strand, are destroyed. - * - * @li For each service object @c svc in the io_context set, in reverse order - * of the beginning of service object lifetime, performs - * delete static_cast(svc). - * - * @note The destruction sequence described above permits programs to - * simplify their resource management by using @c shared_ptr<>. Where an - * object's lifetime is tied to the lifetime of a connection (or some other - * sequence of asynchronous operations), a @c shared_ptr to the object would - * be bound into the handlers for all asynchronous operations associated with - * it. This works as follows: - * - * @li When a single connection ends, all associated asynchronous operations - * complete. The corresponding handler objects are destroyed, and all - * @c shared_ptr references to the objects are destroyed. - * - * @li To shut down the whole program, the io_context function stop() is - * called to terminate any run() calls as soon as possible. The io_context - * destructor defined above destroys all handlers, causing all @c shared_ptr - * references to all connection objects to be destroyed. - */ - ASIO_DECL ~io_context(); - - /// Obtains the executor associated with the io_context. - executor_type get_executor() ASIO_NOEXCEPT; - - /// Run the io_context object's event processing loop. - /** - * The run() function blocks until all work has finished and there are no - * more handlers to be dispatched, or until the io_context has been stopped. - * - * Multiple threads may call the run() function to set up a pool of threads - * from which the io_context may execute handlers. All threads that are - * waiting in the pool are equivalent and the io_context may choose any one - * of them to invoke a handler. - * - * A normal exit from the run() function implies that the io_context object - * is stopped (the stopped() function returns @c true). Subsequent calls to - * run(), run_one(), poll() or poll_one() will return immediately unless there - * is a prior call to restart(). - * - * @return The number of handlers that were executed. - * - * @note Calling the run() function from a thread that is currently calling - * one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on - * the same io_context object may introduce the potential for deadlock. It is - * the caller's reponsibility to avoid this. - * - * The poll() function may also be used to dispatch ready handlers, but - * without blocking. - */ - ASIO_DECL count_type run(); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use non-error_code overload.) Run the io_context object's - /// event processing loop. - /** - * The run() function blocks until all work has finished and there are no - * more handlers to be dispatched, or until the io_context has been stopped. - * - * Multiple threads may call the run() function to set up a pool of threads - * from which the io_context may execute handlers. All threads that are - * waiting in the pool are equivalent and the io_context may choose any one - * of them to invoke a handler. - * - * A normal exit from the run() function implies that the io_context object - * is stopped (the stopped() function returns @c true). Subsequent calls to - * run(), run_one(), poll() or poll_one() will return immediately unless there - * is a prior call to restart(). - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of handlers that were executed. - * - * @note Calling the run() function from a thread that is currently calling - * one of run(), run_one(), run_for(), run_until(), poll() or poll_one() on - * the same io_context object may introduce the potential for deadlock. It is - * the caller's reponsibility to avoid this. - * - * The poll() function may also be used to dispatch ready handlers, but - * without blocking. - */ - ASIO_DECL count_type run(asio::error_code& ec); -#endif // !defined(ASIO_NO_DEPRECATED) - -#if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - /// Run the io_context object's event processing loop for a specified - /// duration. - /** - * The run_for() function blocks until all work has finished and there are no - * more handlers to be dispatched, until the io_context has been stopped, or - * until the specified duration has elapsed. - * - * @param rel_time The duration for which the call may block. - * - * @return The number of handlers that were executed. - */ - template - std::size_t run_for(const chrono::duration& rel_time); - - /// Run the io_context object's event processing loop until a specified time. - /** - * The run_until() function blocks until all work has finished and there are - * no more handlers to be dispatched, until the io_context has been stopped, - * or until the specified time has been reached. - * - * @param abs_time The time point until which the call may block. - * - * @return The number of handlers that were executed. - */ - template - std::size_t run_until(const chrono::time_point& abs_time); -#endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - - /// Run the io_context object's event processing loop to execute at most one - /// handler. - /** - * The run_one() function blocks until one handler has been dispatched, or - * until the io_context has been stopped. - * - * @return The number of handlers that were executed. A zero return value - * implies that the io_context object is stopped (the stopped() function - * returns @c true). Subsequent calls to run(), run_one(), poll() or - * poll_one() will return immediately unless there is a prior call to - * restart(). - * - * @note Calling the run_one() function from a thread that is currently - * calling one of run(), run_one(), run_for(), run_until(), poll() or - * poll_one() on the same io_context object may introduce the potential for - * deadlock. It is the caller's reponsibility to avoid this. - */ - ASIO_DECL count_type run_one(); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use non-error_code overlaod.) Run the io_context object's - /// event processing loop to execute at most one handler. - /** - * The run_one() function blocks until one handler has been dispatched, or - * until the io_context has been stopped. - * - * @return The number of handlers that were executed. A zero return value - * implies that the io_context object is stopped (the stopped() function - * returns @c true). Subsequent calls to run(), run_one(), poll() or - * poll_one() will return immediately unless there is a prior call to - * restart(). - * - * @return The number of handlers that were executed. - * - * @note Calling the run_one() function from a thread that is currently - * calling one of run(), run_one(), run_for(), run_until(), poll() or - * poll_one() on the same io_context object may introduce the potential for - * deadlock. It is the caller's reponsibility to avoid this. - */ - ASIO_DECL count_type run_one(asio::error_code& ec); -#endif // !defined(ASIO_NO_DEPRECATED) - -#if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - /// Run the io_context object's event processing loop for a specified duration - /// to execute at most one handler. - /** - * The run_one_for() function blocks until one handler has been dispatched, - * until the io_context has been stopped, or until the specified duration has - * elapsed. - * - * @param rel_time The duration for which the call may block. - * - * @return The number of handlers that were executed. - */ - template - std::size_t run_one_for(const chrono::duration& rel_time); - - /// Run the io_context object's event processing loop until a specified time - /// to execute at most one handler. - /** - * The run_one_until() function blocks until one handler has been dispatched, - * until the io_context has been stopped, or until the specified time has - * been reached. - * - * @param abs_time The time point until which the call may block. - * - * @return The number of handlers that were executed. - */ - template - std::size_t run_one_until( - const chrono::time_point& abs_time); -#endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - - /// Run the io_context object's event processing loop to execute ready - /// handlers. - /** - * The poll() function runs handlers that are ready to run, without blocking, - * until the io_context has been stopped or there are no more ready handlers. - * - * @return The number of handlers that were executed. - */ - ASIO_DECL count_type poll(); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use non-error_code overload.) Run the io_context object's - /// event processing loop to execute ready handlers. - /** - * The poll() function runs handlers that are ready to run, without blocking, - * until the io_context has been stopped or there are no more ready handlers. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of handlers that were executed. - */ - ASIO_DECL count_type poll(asio::error_code& ec); -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Run the io_context object's event processing loop to execute one ready - /// handler. - /** - * The poll_one() function runs at most one handler that is ready to run, - * without blocking. - * - * @return The number of handlers that were executed. - */ - ASIO_DECL count_type poll_one(); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use non-error_code overload.) Run the io_context object's - /// event processing loop to execute one ready handler. - /** - * The poll_one() function runs at most one handler that is ready to run, - * without blocking. - * - * @param ec Set to indicate what error occurred, if any. - * - * @return The number of handlers that were executed. - */ - ASIO_DECL count_type poll_one(asio::error_code& ec); -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Stop the io_context object's event processing loop. - /** - * This function does not block, but instead simply signals the io_context to - * stop. All invocations of its run() or run_one() member functions should - * return as soon as possible. Subsequent calls to run(), run_one(), poll() - * or poll_one() will return immediately until restart() is called. - */ - ASIO_DECL void stop(); - - /// Determine whether the io_context object has been stopped. - /** - * This function is used to determine whether an io_context object has been - * stopped, either through an explicit call to stop(), or due to running out - * of work. When an io_context object is stopped, calls to run(), run_one(), - * poll() or poll_one() will return immediately without invoking any - * handlers. - * - * @return @c true if the io_context object is stopped, otherwise @c false. - */ - ASIO_DECL bool stopped() const; - - /// Restart the io_context in preparation for a subsequent run() invocation. - /** - * This function must be called prior to any second or later set of - * invocations of the run(), run_one(), poll() or poll_one() functions when a - * previous invocation of these functions returned due to the io_context - * being stopped or running out of work. After a call to restart(), the - * io_context object's stopped() function will return @c false. - * - * This function must not be called while there are any unfinished calls to - * the run(), run_one(), poll() or poll_one() functions. - */ - ASIO_DECL void restart(); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use restart().) Reset the io_context in preparation for a - /// subsequent run() invocation. - /** - * This function must be called prior to any second or later set of - * invocations of the run(), run_one(), poll() or poll_one() functions when a - * previous invocation of these functions returned due to the io_context - * being stopped or running out of work. After a call to restart(), the - * io_context object's stopped() function will return @c false. - * - * This function must not be called while there are any unfinished calls to - * the run(), run_one(), poll() or poll_one() functions. - */ - void reset(); - - /// (Deprecated: Use asio::dispatch().) Request the io_context to - /// invoke the given handler. - /** - * This function is used to ask the io_context to execute the given handler. - * - * The io_context guarantees that the handler will only be called in a thread - * in which the run(), run_one(), poll() or poll_one() member functions is - * currently being invoked. The handler may be executed inside this function - * if the guarantee can be met. - * - * @param handler The handler to be called. The io_context will make - * a copy of the handler object as required. The function signature of the - * handler must be: @code void handler(); @endcode - * - * @note This function throws an exception only if: - * - * @li the handler's @c asio_handler_allocate function; or - * - * @li the handler's copy constructor - * - * throws an exception. - */ - template - ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) - dispatch(ASIO_MOVE_ARG(LegacyCompletionHandler) handler); - - /// (Deprecated: Use asio::post().) Request the io_context to invoke - /// the given handler and return immediately. - /** - * This function is used to ask the io_context to execute the given handler, - * but without allowing the io_context to call the handler from inside this - * function. - * - * The io_context guarantees that the handler will only be called in a thread - * in which the run(), run_one(), poll() or poll_one() member functions is - * currently being invoked. - * - * @param handler The handler to be called. The io_context will make - * a copy of the handler object as required. The function signature of the - * handler must be: @code void handler(); @endcode - * - * @note This function throws an exception only if: - * - * @li the handler's @c asio_handler_allocate function; or - * - * @li the handler's copy constructor - * - * throws an exception. - */ - template - ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) - post(ASIO_MOVE_ARG(LegacyCompletionHandler) handler); - - /// (Deprecated: Use asio::bind_executor().) Create a new handler that - /// automatically dispatches the wrapped handler on the io_context. - /** - * This function is used to create a new handler function object that, when - * invoked, will automatically pass the wrapped handler to the io_context - * object's dispatch function. - * - * @param handler The handler to be wrapped. The io_context will make a copy - * of the handler object as required. The function signature of the handler - * must be: @code void handler(A1 a1, ... An an); @endcode - * - * @return A function object that, when invoked, passes the wrapped handler to - * the io_context object's dispatch function. Given a function object with the - * signature: - * @code R f(A1 a1, ... An an); @endcode - * If this function object is passed to the wrap function like so: - * @code io_context.wrap(f); @endcode - * then the return value is a function object with the signature - * @code void g(A1 a1, ... An an); @endcode - * that, when invoked, executes code equivalent to: - * @code io_context.dispatch(boost::bind(f, a1, ... an)); @endcode - */ - template -#if defined(GENERATING_DOCUMENTATION) - unspecified -#else - detail::wrapped_handler -#endif - wrap(Handler handler); -#endif // !defined(ASIO_NO_DEPRECATED) - -private: - // Helper function to add the implementation. - ASIO_DECL impl_type& add_impl(impl_type* impl); - - // Backwards compatible overload for use with services derived from - // io_context::service. - template - friend Service& use_service(io_context& ioc); - -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - detail::winsock_init<> init_; -#elif defined(__sun) || defined(__QNX__) || defined(__hpux) || defined(_AIX) \ - || defined(__osf__) - detail::signal_init<> init_; -#endif - - // The implementation. - impl_type& impl_; -}; - -/// Executor used to submit functions to an io_context. -class io_context::executor_type -{ -public: - /// Obtain the underlying execution context. - io_context& context() const ASIO_NOEXCEPT; - - /// Inform the io_context that it has some outstanding work to do. - /** - * This function is used to inform the io_context that some work has begun. - * This ensures that the io_context's run() and run_one() functions do not - * exit while the work is underway. - */ - void on_work_started() const ASIO_NOEXCEPT; - - /// Inform the io_context that some work is no longer outstanding. - /** - * This function is used to inform the io_context that some work has - * finished. Once the count of unfinished work reaches zero, the io_context - * is stopped and the run() and run_one() functions may exit. - */ - void on_work_finished() const ASIO_NOEXCEPT; - - /// Request the io_context to invoke the given function object. - /** - * This function is used to ask the io_context to execute the given function - * object. If the current thread is running the io_context, @c dispatch() - * executes the function before returning. Otherwise, the function will be - * scheduled to run on the io_context. - * - * @param f The function object to be called. The executor will make a copy - * of the handler object as required. The function signature of the function - * object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the io_context to invoke the given function object. - /** - * This function is used to ask the io_context to execute the given function - * object. The function object will never be executed inside @c post(). - * Instead, it will be scheduled to run on the io_context. - * - * @param f The function object to be called. The executor will make a copy - * of the handler object as required. The function signature of the function - * object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the io_context to invoke the given function object. - /** - * This function is used to ask the io_context to execute the given function - * object. The function object will never be executed inside @c defer(). - * Instead, it will be scheduled to run on the io_context. - * - * If the current thread belongs to the io_context, @c defer() will delay - * scheduling the function object until the current thread returns control to - * the pool. - * - * @param f The function object to be called. The executor will make a copy - * of the handler object as required. The function signature of the function - * object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Determine whether the io_context is running in the current thread. - /** - * @return @c true if the current thread is running the io_context. Otherwise - * returns @c false. - */ - bool running_in_this_thread() const ASIO_NOEXCEPT; - - /// Compare two executors for equality. - /** - * Two executors are equal if they refer to the same underlying io_context. - */ - friend bool operator==(const executor_type& a, - const executor_type& b) ASIO_NOEXCEPT - { - return &a.io_context_ == &b.io_context_; - } - - /// Compare two executors for inequality. - /** - * Two executors are equal if they refer to the same underlying io_context. - */ - friend bool operator!=(const executor_type& a, - const executor_type& b) ASIO_NOEXCEPT - { - return &a.io_context_ != &b.io_context_; - } - -private: - friend class io_context; - - // Constructor. - explicit executor_type(io_context& i) : io_context_(i) {} - - // The underlying io_context. - io_context& io_context_; -}; - -#if !defined(ASIO_NO_DEPRECATED) -/// (Deprecated: Use executor_work_guard.) Class to inform the io_context when -/// it has work to do. -/** - * The work class is used to inform the io_context when work starts and - * finishes. This ensures that the io_context object's run() function will not - * exit while work is underway, and that it does exit when there is no - * unfinished work remaining. - * - * The work class is copy-constructible so that it may be used as a data member - * in a handler class. It is not assignable. - */ -class io_context::work -{ -public: - /// Constructor notifies the io_context that work is starting. - /** - * The constructor is used to inform the io_context that some work has begun. - * This ensures that the io_context object's run() function will not exit - * while the work is underway. - */ - explicit work(asio::io_context& io_context); - - /// Copy constructor notifies the io_context that work is starting. - /** - * The constructor is used to inform the io_context that some work has begun. - * This ensures that the io_context object's run() function will not exit - * while the work is underway. - */ - work(const work& other); - - /// Destructor notifies the io_context that the work is complete. - /** - * The destructor is used to inform the io_context that some work has - * finished. Once the count of unfinished work reaches zero, the io_context - * object's run() function is permitted to exit. - */ - ~work(); - - /// Get the io_context associated with the work. - asio::io_context& get_io_context(); - - /// (Deprecated: Use get_io_context().) Get the io_context associated with the - /// work. - asio::io_context& get_io_service(); - -private: - // Prevent assignment. - void operator=(const work& other); - - // The io_context implementation. - detail::io_context_impl& io_context_impl_; -}; -#endif // !defined(ASIO_NO_DEPRECATED) - -/// Base class for all io_context services. -class io_context::service - : public execution_context::service -{ -public: - /// Get the io_context object that owns the service. - asio::io_context& get_io_context(); - -#if !defined(ASIO_NO_DEPRECATED) - /// Get the io_context object that owns the service. - asio::io_context& get_io_service(); -#endif // !defined(ASIO_NO_DEPRECATED) - -private: - /// Destroy all user-defined handler objects owned by the service. - ASIO_DECL virtual void shutdown(); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use shutdown().) Destroy all user-defined handler objects - /// owned by the service. - ASIO_DECL virtual void shutdown_service(); -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Handle notification of a fork-related event to perform any necessary - /// housekeeping. - /** - * This function is not a pure virtual so that services only have to - * implement it if necessary. The default implementation does nothing. - */ - ASIO_DECL virtual void notify_fork( - execution_context::fork_event event); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use notify_fork().) Handle notification of a fork-related - /// event to perform any necessary housekeeping. - /** - * This function is not a pure virtual so that services only have to - * implement it if necessary. The default implementation does nothing. - */ - ASIO_DECL virtual void fork_service( - execution_context::fork_event event); -#endif // !defined(ASIO_NO_DEPRECATED) - -protected: - /// Constructor. - /** - * @param owner The io_context object that owns the service. - */ - ASIO_DECL service(asio::io_context& owner); - - /// Destructor. - ASIO_DECL virtual ~service(); -}; - -namespace detail { - -// Special service base class to keep classes header-file only. -template -class service_base - : public asio::io_context::service -{ -public: - static asio::detail::service_id id; - - // Constructor. - service_base(asio::io_context& io_context) - : asio::io_context::service(io_context) - { - } -}; - -template -asio::detail::service_id service_base::id; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/io_context.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/io_context.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -// If both io_context.hpp and strand.hpp have been included, automatically -// include the header file needed for the io_context::strand class. -#if !defined(ASIO_NO_EXTENSIONS) -# if defined(ASIO_STRAND_HPP) -# include "asio/io_context_strand.hpp" -# endif // defined(ASIO_STRAND_HPP) -#endif // !defined(ASIO_NO_EXTENSIONS) - -#endif // ASIO_IO_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/io_context_strand.hpp b/scout_sdk/asio/asio/io_context_strand.hpp deleted file mode 100644 index 3c596f1..0000000 --- a/scout_sdk/asio/asio/io_context_strand.hpp +++ /dev/null @@ -1,384 +0,0 @@ -// -// io_context_strand.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IO_CONTEXT_STRAND_HPP -#define ASIO_IO_CONTEXT_STRAND_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_NO_EXTENSIONS) - -#include "asio/async_result.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/strand_service.hpp" -#include "asio/detail/wrapped_handler.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides serialised handler execution. -/** - * The io_context::strand class provides the ability to post and dispatch - * handlers with the guarantee that none of those handlers will execute - * concurrently. - * - * @par Order of handler invocation - * Given: - * - * @li a strand object @c s - * - * @li an object @c a meeting completion handler requirements - * - * @li an object @c a1 which is an arbitrary copy of @c a made by the - * implementation - * - * @li an object @c b meeting completion handler requirements - * - * @li an object @c b1 which is an arbitrary copy of @c b made by the - * implementation - * - * if any of the following conditions are true: - * - * @li @c s.post(a) happens-before @c s.post(b) - * - * @li @c s.post(a) happens-before @c s.dispatch(b), where the latter is - * performed outside the strand - * - * @li @c s.dispatch(a) happens-before @c s.post(b), where the former is - * performed outside the strand - * - * @li @c s.dispatch(a) happens-before @c s.dispatch(b), where both are - * performed outside the strand - * - * then @c asio_handler_invoke(a1, &a1) happens-before - * @c asio_handler_invoke(b1, &b1). - * - * Note that in the following case: - * @code async_op_1(..., s.wrap(a)); - * async_op_2(..., s.wrap(b)); @endcode - * the completion of the first async operation will perform @c s.dispatch(a), - * and the second will perform @c s.dispatch(b), but the order in which those - * are performed is unspecified. That is, you cannot state whether one - * happens-before the other. Therefore none of the above conditions are met and - * no ordering guarantee is made. - * - * @note The implementation makes no guarantee that handlers posted or - * dispatched through different @c strand objects will be invoked concurrently. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Dispatcher. - */ -class io_context::strand -{ -public: - /// Constructor. - /** - * Constructs the strand. - * - * @param io_context The io_context object that the strand will use to - * dispatch handlers that are ready to be run. - */ - explicit strand(asio::io_context& io_context) - : service_(asio::use_service< - asio::detail::strand_service>(io_context)) - { - service_.construct(impl_); - } - - /// Destructor. - /** - * Destroys a strand. - * - * Handlers posted through the strand that have not yet been invoked will - * still be dispatched in a way that meets the guarantee of non-concurrency. - */ - ~strand() - { - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use context().) Get the io_context associated with the - /// strand. - /** - * This function may be used to obtain the io_context object that the strand - * uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the strand will use to - * dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return service_.get_io_context(); - } - - /// (Deprecated: Use context().) Get the io_context associated with the - /// strand. - /** - * This function may be used to obtain the io_context object that the strand - * uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the strand will use to - * dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return service_.get_io_context(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Obtain the underlying execution context. - asio::io_context& context() const ASIO_NOEXCEPT - { - return service_.get_io_context(); - } - - /// Inform the strand that it has some outstanding work to do. - /** - * The strand delegates this call to its underlying io_context. - */ - void on_work_started() const ASIO_NOEXCEPT - { - context().get_executor().on_work_started(); - } - - /// Inform the strand that some work is no longer outstanding. - /** - * The strand delegates this call to its underlying io_context. - */ - void on_work_finished() const ASIO_NOEXCEPT - { - context().get_executor().on_work_finished(); - } - - /// Request the strand to invoke the given function object. - /** - * This function is used to ask the strand to execute the given function - * object on its underlying io_context. The function object will be executed - * inside this function if the strand is not otherwise busy and if the - * underlying io_context's executor's @c dispatch() function is also able to - * execute the function before returning. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const - { - typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); - service_.dispatch(impl_, tmp); - (void)a; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use asio::dispatch().) Request the strand to invoke - /// the given handler. - /** - * This function is used to ask the strand to execute the given handler. - * - * The strand object guarantees that handlers posted or dispatched through - * the strand will not be executed concurrently. The handler may be executed - * inside this function if the guarantee can be met. If this function is - * called from within a handler that was posted or dispatched through the same - * strand, then the new handler will be executed immediately. - * - * The strand's guarantee is in addition to the guarantee provided by the - * underlying io_context. The io_context guarantees that the handler will only - * be called in a thread in which the io_context's run member function is - * currently being invoked. - * - * @param handler The handler to be called. The strand will make a copy of the - * handler object as required. The function signature of the handler must be: - * @code void handler(); @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) - dispatch(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a LegacyCompletionHandler. - ASIO_LEGACY_COMPLETION_HANDLER_CHECK( - LegacyCompletionHandler, handler) type_check; - - async_completion init(handler); - - service_.dispatch(impl_, init.completion_handler); - - return init.result.get(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Request the strand to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object will never be executed inside this function. - * Instead, it will be scheduled to run by the underlying io_context. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const - { - typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); - service_.post(impl_, tmp); - (void)a; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use asio::post().) Request the strand to invoke the - /// given handler and return immediately. - /** - * This function is used to ask the strand to execute the given handler, but - * without allowing the strand to call the handler from inside this function. - * - * The strand object guarantees that handlers posted or dispatched through - * the strand will not be executed concurrently. The strand's guarantee is in - * addition to the guarantee provided by the underlying io_context. The - * io_context guarantees that the handler will only be called in a thread in - * which the io_context's run member function is currently being invoked. - * - * @param handler The handler to be called. The strand will make a copy of the - * handler object as required. The function signature of the handler must be: - * @code void handler(); @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(LegacyCompletionHandler, void ()) - post(ASIO_MOVE_ARG(LegacyCompletionHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a LegacyCompletionHandler. - ASIO_LEGACY_COMPLETION_HANDLER_CHECK( - LegacyCompletionHandler, handler) type_check; - - async_completion init(handler); - - service_.post(impl_, init.completion_handler); - - return init.result.get(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Request the strand to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object will never be executed inside this function. - * Instead, it will be scheduled to run by the underlying io_context. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const - { - typename decay::type tmp(ASIO_MOVE_CAST(Function)(f)); - service_.post(impl_, tmp); - (void)a; - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use asio::bind_executor().) Create a new handler that - /// automatically dispatches the wrapped handler on the strand. - /** - * This function is used to create a new handler function object that, when - * invoked, will automatically pass the wrapped handler to the strand's - * dispatch function. - * - * @param handler The handler to be wrapped. The strand will make a copy of - * the handler object as required. The function signature of the handler must - * be: @code void handler(A1 a1, ... An an); @endcode - * - * @return A function object that, when invoked, passes the wrapped handler to - * the strand's dispatch function. Given a function object with the signature: - * @code R f(A1 a1, ... An an); @endcode - * If this function object is passed to the wrap function like so: - * @code strand.wrap(f); @endcode - * then the return value is a function object with the signature - * @code void g(A1 a1, ... An an); @endcode - * that, when invoked, executes code equivalent to: - * @code strand.dispatch(boost::bind(f, a1, ... an)); @endcode - */ - template -#if defined(GENERATING_DOCUMENTATION) - unspecified -#else - detail::wrapped_handler -#endif - wrap(Handler handler) - { - return detail::wrapped_handler(*this, handler); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Determine whether the strand is running in the current thread. - /** - * @return @c true if the current thread is executing a handler that was - * submitted to the strand using post(), dispatch() or wrap(). Otherwise - * returns @c false. - */ - bool running_in_this_thread() const ASIO_NOEXCEPT - { - return service_.running_in_this_thread(impl_); - } - - /// Compare two strands for equality. - /** - * Two strands are equal if they refer to the same ordered, non-concurrent - * state. - */ - friend bool operator==(const strand& a, const strand& b) ASIO_NOEXCEPT - { - return a.impl_ == b.impl_; - } - - /// Compare two strands for inequality. - /** - * Two strands are equal if they refer to the same ordered, non-concurrent - * state. - */ - friend bool operator!=(const strand& a, const strand& b) ASIO_NOEXCEPT - { - return a.impl_ != b.impl_; - } - -private: - asio::detail::strand_service& service_; - mutable asio::detail::strand_service::implementation_type impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_EXTENSIONS) - -#endif // ASIO_IO_CONTEXT_STRAND_HPP diff --git a/scout_sdk/asio/asio/io_service.hpp b/scout_sdk/asio/asio/io_service.hpp deleted file mode 100644 index ed05c83..0000000 --- a/scout_sdk/asio/asio/io_service.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// io_service.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IO_SERVICE_HPP -#define ASIO_IO_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if !defined(ASIO_NO_DEPRECATED) -/// Typedef for backwards compatibility. -typedef io_context io_service; -#endif // !defined(ASIO_NO_DEPRECATED) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IO_SERVICE_HPP diff --git a/scout_sdk/asio/asio/io_service_strand.hpp b/scout_sdk/asio/asio/io_service_strand.hpp deleted file mode 100644 index 7093f0e..0000000 --- a/scout_sdk/asio/asio/io_service_strand.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// io_service_strand.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IO_SERVICE_STRAND_HPP -#define ASIO_IO_SERVICE_STRAND_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/io_context_strand.hpp" - -#endif // ASIO_IO_SERVICE_STRAND_HPP diff --git a/scout_sdk/asio/asio/ip/address.hpp b/scout_sdk/asio/asio/ip/address.hpp deleted file mode 100644 index cf852a6..0000000 --- a/scout_sdk/asio/asio/ip/address.hpp +++ /dev/null @@ -1,260 +0,0 @@ -// -// ip/address.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_HPP -#define ASIO_IP_ADDRESS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/throw_exception.hpp" -#include "asio/detail/string_view.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error_code.hpp" -#include "asio/ip/address_v4.hpp" -#include "asio/ip/address_v6.hpp" -#include "asio/ip/bad_address_cast.hpp" - -#if !defined(ASIO_NO_IOSTREAM) -# include -#endif // !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Implements version-independent IP addresses. -/** - * The asio::ip::address class provides the ability to use either IP - * version 4 or version 6 addresses. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class address -{ -public: - /// Default constructor. - ASIO_DECL address(); - - /// Construct an address from an IPv4 address. - ASIO_DECL address(const asio::ip::address_v4& ipv4_address); - - /// Construct an address from an IPv6 address. - ASIO_DECL address(const asio::ip::address_v6& ipv6_address); - - /// Copy constructor. - ASIO_DECL address(const address& other); - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - ASIO_DECL address(address&& other); -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from another address. - ASIO_DECL address& operator=(const address& other); - -#if defined(ASIO_HAS_MOVE) - /// Move-assign from another address. - ASIO_DECL address& operator=(address&& other); -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from an IPv4 address. - ASIO_DECL address& operator=( - const asio::ip::address_v4& ipv4_address); - - /// Assign from an IPv6 address. - ASIO_DECL address& operator=( - const asio::ip::address_v6& ipv6_address); - - /// Get whether the address is an IP version 4 address. - bool is_v4() const - { - return type_ == ipv4; - } - - /// Get whether the address is an IP version 6 address. - bool is_v6() const - { - return type_ == ipv6; - } - - /// Get the address as an IP version 4 address. - ASIO_DECL asio::ip::address_v4 to_v4() const; - - /// Get the address as an IP version 6 address. - ASIO_DECL asio::ip::address_v6 to_v6() const; - - /// Get the address as a string. - ASIO_DECL std::string to_string() const; - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use other overload.) Get the address as a string. - ASIO_DECL std::string to_string(asio::error_code& ec) const; - - /// (Deprecated: Use make_address().) Create an address from an IPv4 address - /// string in dotted decimal form, or from an IPv6 address in hexadecimal - /// notation. - static address from_string(const char* str); - - /// (Deprecated: Use make_address().) Create an address from an IPv4 address - /// string in dotted decimal form, or from an IPv6 address in hexadecimal - /// notation. - static address from_string(const char* str, asio::error_code& ec); - - /// (Deprecated: Use make_address().) Create an address from an IPv4 address - /// string in dotted decimal form, or from an IPv6 address in hexadecimal - /// notation. - static address from_string(const std::string& str); - - /// (Deprecated: Use make_address().) Create an address from an IPv4 address - /// string in dotted decimal form, or from an IPv6 address in hexadecimal - /// notation. - static address from_string( - const std::string& str, asio::error_code& ec); -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Determine whether the address is a loopback address. - ASIO_DECL bool is_loopback() const; - - /// Determine whether the address is unspecified. - ASIO_DECL bool is_unspecified() const; - - /// Determine whether the address is a multicast address. - ASIO_DECL bool is_multicast() const; - - /// Compare two addresses for equality. - ASIO_DECL friend bool operator==(const address& a1, const address& a2); - - /// Compare two addresses for inequality. - friend bool operator!=(const address& a1, const address& a2) - { - return !(a1 == a2); - } - - /// Compare addresses for ordering. - ASIO_DECL friend bool operator<(const address& a1, const address& a2); - - /// Compare addresses for ordering. - friend bool operator>(const address& a1, const address& a2) - { - return a2 < a1; - } - - /// Compare addresses for ordering. - friend bool operator<=(const address& a1, const address& a2) - { - return !(a2 < a1); - } - - /// Compare addresses for ordering. - friend bool operator>=(const address& a1, const address& a2) - { - return !(a1 < a2); - } - -private: - // The type of the address. - enum { ipv4, ipv6 } type_; - - // The underlying IPv4 address. - asio::ip::address_v4 ipv4_address_; - - // The underlying IPv6 address. - asio::ip::address_v6 ipv6_address_; -}; - -/// Create an address from an IPv4 address string in dotted decimal form, -/// or from an IPv6 address in hexadecimal notation. -/** - * @relates address - */ -ASIO_DECL address make_address(const char* str); - -/// Create an address from an IPv4 address string in dotted decimal form, -/// or from an IPv6 address in hexadecimal notation. -/** - * @relates address - */ -ASIO_DECL address make_address( - const char* str, asio::error_code& ec); - -/// Create an address from an IPv4 address string in dotted decimal form, -/// or from an IPv6 address in hexadecimal notation. -/** - * @relates address - */ -ASIO_DECL address make_address(const std::string& str); - -/// Create an address from an IPv4 address string in dotted decimal form, -/// or from an IPv6 address in hexadecimal notation. -/** - * @relates address - */ -ASIO_DECL address make_address( - const std::string& str, asio::error_code& ec); - -#if defined(ASIO_HAS_STRING_VIEW) \ - || defined(GENERATING_DOCUMENTATION) - -/// Create an address from an IPv4 address string in dotted decimal form, -/// or from an IPv6 address in hexadecimal notation. -/** - * @relates address - */ -ASIO_DECL address make_address(string_view str); - -/// Create an address from an IPv4 address string in dotted decimal form, -/// or from an IPv6 address in hexadecimal notation. -/** - * @relates address - */ -ASIO_DECL address make_address( - string_view str, asio::error_code& ec); - -#endif // defined(ASIO_HAS_STRING_VIEW) - // || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_NO_IOSTREAM) - -/// Output an address as a string. -/** - * Used to output a human-readable string for a specified address. - * - * @param os The output stream to which the string will be written. - * - * @param addr The address to be written. - * - * @return The output stream. - * - * @relates asio::ip::address - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address& addr); - -#endif // !defined(ASIO_NO_IOSTREAM) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/impl/address.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/ip/impl/address.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_IP_ADDRESS_HPP diff --git a/scout_sdk/asio/asio/ip/address_v4.hpp b/scout_sdk/asio/asio/ip/address_v4.hpp deleted file mode 100644 index 4e1cc9a..0000000 --- a/scout_sdk/asio/asio/ip/address_v4.hpp +++ /dev/null @@ -1,329 +0,0 @@ -// -// ip/address_v4.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V4_HPP -#define ASIO_IP_ADDRESS_V4_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/array.hpp" -#include "asio/detail/cstdint.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/string_view.hpp" -#include "asio/detail/winsock_init.hpp" -#include "asio/error_code.hpp" - -#if !defined(ASIO_NO_IOSTREAM) -# include -#endif // !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Implements IP version 4 style addresses. -/** - * The asio::ip::address_v4 class provides the ability to use and - * manipulate IP version 4 addresses. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class address_v4 -{ -public: - /// The type used to represent an address as an unsigned integer. - typedef uint_least32_t uint_type; - - /// The type used to represent an address as an array of bytes. - /** - * @note This type is defined in terms of the C++0x template @c std::array - * when it is available. Otherwise, it uses @c boost:array. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef array bytes_type; -#else - typedef asio::detail::array bytes_type; -#endif - - /// Default constructor. - address_v4() - { - addr_.s_addr = 0; - } - - /// Construct an address from raw bytes. - ASIO_DECL explicit address_v4(const bytes_type& bytes); - - /// Construct an address from an unsigned integer in host byte order. - ASIO_DECL explicit address_v4(uint_type addr); - - /// Copy constructor. - address_v4(const address_v4& other) - : addr_(other.addr_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - address_v4(address_v4&& other) - : addr_(other.addr_) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from another address. - address_v4& operator=(const address_v4& other) - { - addr_ = other.addr_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move-assign from another address. - address_v4& operator=(address_v4&& other) - { - addr_ = other.addr_; - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// Get the address in bytes, in network byte order. - ASIO_DECL bytes_type to_bytes() const; - - /// Get the address as an unsigned integer in host byte order - ASIO_DECL uint_type to_uint() const; - -#if !defined(ASIO_NO_DEPRECATED) - /// Get the address as an unsigned long in host byte order - ASIO_DECL unsigned long to_ulong() const; -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the address as a string in dotted decimal format. - ASIO_DECL std::string to_string() const; - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use other overload.) Get the address as a string in dotted - /// decimal format. - ASIO_DECL std::string to_string(asio::error_code& ec) const; - - /// (Deprecated: Use make_address_v4().) Create an address from an IP address - /// string in dotted decimal form. - static address_v4 from_string(const char* str); - - /// (Deprecated: Use make_address_v4().) Create an address from an IP address - /// string in dotted decimal form. - static address_v4 from_string( - const char* str, asio::error_code& ec); - - /// (Deprecated: Use make_address_v4().) Create an address from an IP address - /// string in dotted decimal form. - static address_v4 from_string(const std::string& str); - - /// (Deprecated: Use make_address_v4().) Create an address from an IP address - /// string in dotted decimal form. - static address_v4 from_string( - const std::string& str, asio::error_code& ec); -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Determine whether the address is a loopback address. - ASIO_DECL bool is_loopback() const; - - /// Determine whether the address is unspecified. - ASIO_DECL bool is_unspecified() const; - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use network_v4 class.) Determine whether the address is a - /// class A address. - ASIO_DECL bool is_class_a() const; - - /// (Deprecated: Use network_v4 class.) Determine whether the address is a - /// class B address. - ASIO_DECL bool is_class_b() const; - - /// (Deprecated: Use network_v4 class.) Determine whether the address is a - /// class C address. - ASIO_DECL bool is_class_c() const; -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Determine whether the address is a multicast address. - ASIO_DECL bool is_multicast() const; - - /// Compare two addresses for equality. - friend bool operator==(const address_v4& a1, const address_v4& a2) - { - return a1.addr_.s_addr == a2.addr_.s_addr; - } - - /// Compare two addresses for inequality. - friend bool operator!=(const address_v4& a1, const address_v4& a2) - { - return a1.addr_.s_addr != a2.addr_.s_addr; - } - - /// Compare addresses for ordering. - friend bool operator<(const address_v4& a1, const address_v4& a2) - { - return a1.to_uint() < a2.to_uint(); - } - - /// Compare addresses for ordering. - friend bool operator>(const address_v4& a1, const address_v4& a2) - { - return a1.to_uint() > a2.to_uint(); - } - - /// Compare addresses for ordering. - friend bool operator<=(const address_v4& a1, const address_v4& a2) - { - return a1.to_uint() <= a2.to_uint(); - } - - /// Compare addresses for ordering. - friend bool operator>=(const address_v4& a1, const address_v4& a2) - { - return a1.to_uint() >= a2.to_uint(); - } - - /// Obtain an address object that represents any address. - static address_v4 any() - { - return address_v4(); - } - - /// Obtain an address object that represents the loopback address. - static address_v4 loopback() - { - return address_v4(0x7F000001); - } - - /// Obtain an address object that represents the broadcast address. - static address_v4 broadcast() - { - return address_v4(0xFFFFFFFF); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use network_v4 class.) Obtain an address object that - /// represents the broadcast address that corresponds to the specified - /// address and netmask. - ASIO_DECL static address_v4 broadcast( - const address_v4& addr, const address_v4& mask); - - /// (Deprecated: Use network_v4 class.) Obtain the netmask that corresponds - /// to the address, based on its address class. - ASIO_DECL static address_v4 netmask(const address_v4& addr); -#endif // !defined(ASIO_NO_DEPRECATED) - -private: - // The underlying IPv4 address. - asio::detail::in4_addr_type addr_; -}; - -/// Create an IPv4 address from raw bytes in network order. -/** - * @relates address_v4 - */ -inline address_v4 make_address_v4(const address_v4::bytes_type& bytes) -{ - return address_v4(bytes); -} - -/// Create an IPv4 address from an unsigned integer in host byte order. -/** - * @relates address_v4 - */ -inline address_v4 make_address_v4(address_v4::uint_type addr) -{ - return address_v4(addr); -} - -/// Create an IPv4 address from an IP address string in dotted decimal form. -/** - * @relates address_v4 - */ -ASIO_DECL address_v4 make_address_v4(const char* str); - -/// Create an IPv4 address from an IP address string in dotted decimal form. -/** - * @relates address_v4 - */ -ASIO_DECL address_v4 make_address_v4( - const char* str, asio::error_code& ec); - -/// Create an IPv4 address from an IP address string in dotted decimal form. -/** - * @relates address_v4 - */ -ASIO_DECL address_v4 make_address_v4(const std::string& str); - -/// Create an IPv4 address from an IP address string in dotted decimal form. -/** - * @relates address_v4 - */ -ASIO_DECL address_v4 make_address_v4( - const std::string& str, asio::error_code& ec); - -#if defined(ASIO_HAS_STRING_VIEW) \ - || defined(GENERATING_DOCUMENTATION) - -/// Create an IPv4 address from an IP address string in dotted decimal form. -/** - * @relates address_v4 - */ -ASIO_DECL address_v4 make_address_v4(string_view str); - -/// Create an IPv4 address from an IP address string in dotted decimal form. -/** - * @relates address_v4 - */ -ASIO_DECL address_v4 make_address_v4( - string_view str, asio::error_code& ec); - -#endif // defined(ASIO_HAS_STRING_VIEW) - // || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_NO_IOSTREAM) - -/// Output an address as a string. -/** - * Used to output a human-readable string for a specified address. - * - * @param os The output stream to which the string will be written. - * - * @param addr The address to be written. - * - * @return The output stream. - * - * @relates asio::ip::address_v4 - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address_v4& addr); - -#endif // !defined(ASIO_NO_IOSTREAM) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/impl/address_v4.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/ip/impl/address_v4.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_IP_ADDRESS_V4_HPP diff --git a/scout_sdk/asio/asio/ip/address_v4_iterator.hpp b/scout_sdk/asio/asio/ip/address_v4_iterator.hpp deleted file mode 100644 index e2ef393..0000000 --- a/scout_sdk/asio/asio/ip/address_v4_iterator.hpp +++ /dev/null @@ -1,162 +0,0 @@ -// -// ip/address_v4_iterator.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V4_ITERATOR_HPP -#define ASIO_IP_ADDRESS_V4_ITERATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ip/address_v4.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template class basic_address_iterator; - -/// An input iterator that can be used for traversing IPv4 addresses. -/** - * In addition to satisfying the input iterator requirements, this iterator - * also supports decrement. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template <> class basic_address_iterator -{ -public: - /// The type of the elements pointed to by the iterator. - typedef address_v4 value_type; - - /// Distance between two iterators. - typedef std::ptrdiff_t difference_type; - - /// The type of a pointer to an element pointed to by the iterator. - typedef const address_v4* pointer; - - /// The type of a reference to an element pointed to by the iterator. - typedef const address_v4& reference; - - /// Denotes that the iterator satisfies the input iterator requirements. - typedef std::input_iterator_tag iterator_category; - - /// Construct an iterator that points to the specified address. - basic_address_iterator(const address_v4& addr) ASIO_NOEXCEPT - : address_(addr) - { - } - - /// Copy constructor. - basic_address_iterator( - const basic_address_iterator& other) ASIO_NOEXCEPT - : address_(other.address_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - basic_address_iterator(basic_address_iterator&& other) ASIO_NOEXCEPT - : address_(ASIO_MOVE_CAST(address_v4)(other.address_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assignment operator. - basic_address_iterator& operator=( - const basic_address_iterator& other) ASIO_NOEXCEPT - { - address_ = other.address_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move assignment operator. - basic_address_iterator& operator=( - basic_address_iterator&& other) ASIO_NOEXCEPT - { - address_ = ASIO_MOVE_CAST(address_v4)(other.address_); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// Dereference the iterator. - const address_v4& operator*() const ASIO_NOEXCEPT - { - return address_; - } - - /// Dereference the iterator. - const address_v4* operator->() const ASIO_NOEXCEPT - { - return &address_; - } - - /// Pre-increment operator. - basic_address_iterator& operator++() ASIO_NOEXCEPT - { - address_ = address_v4((address_.to_uint() + 1) & 0xFFFFFFFF); - return *this; - } - - /// Post-increment operator. - basic_address_iterator operator++(int) ASIO_NOEXCEPT - { - basic_address_iterator tmp(*this); - ++*this; - return tmp; - } - - /// Pre-decrement operator. - basic_address_iterator& operator--() ASIO_NOEXCEPT - { - address_ = address_v4((address_.to_uint() - 1) & 0xFFFFFFFF); - return *this; - } - - /// Post-decrement operator. - basic_address_iterator operator--(int) - { - basic_address_iterator tmp(*this); - --*this; - return tmp; - } - - /// Compare two addresses for equality. - friend bool operator==(const basic_address_iterator& a, - const basic_address_iterator& b) - { - return a.address_ == b.address_; - } - - /// Compare two addresses for inequality. - friend bool operator!=(const basic_address_iterator& a, - const basic_address_iterator& b) - { - return a.address_ != b.address_; - } - -private: - address_v4 address_; -}; - -/// An input iterator that can be used for traversing IPv4 addresses. -typedef basic_address_iterator address_v4_iterator; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_V4_ITERATOR_HPP diff --git a/scout_sdk/asio/asio/ip/address_v4_range.hpp b/scout_sdk/asio/asio/ip/address_v4_range.hpp deleted file mode 100644 index a402842..0000000 --- a/scout_sdk/asio/asio/ip/address_v4_range.hpp +++ /dev/null @@ -1,134 +0,0 @@ -// -// ip/address_v4_range.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V4_RANGE_HPP -#define ASIO_IP_ADDRESS_V4_RANGE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ip/address_v4_iterator.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template class basic_address_range; - -/// Represents a range of IPv4 addresses. -/** - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template <> class basic_address_range -{ -public: - /// The type of an iterator that points into the range. - typedef basic_address_iterator iterator; - - /// Construct an empty range. - basic_address_range() ASIO_NOEXCEPT - : begin_(address_v4()), - end_(address_v4()) - { - } - - /// Construct an range that represents the given range of addresses. - explicit basic_address_range(const iterator& first, - const iterator& last) ASIO_NOEXCEPT - : begin_(first), - end_(last) - { - } - - /// Copy constructor. - basic_address_range(const basic_address_range& other) ASIO_NOEXCEPT - : begin_(other.begin_), - end_(other.end_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - basic_address_range(basic_address_range&& other) ASIO_NOEXCEPT - : begin_(ASIO_MOVE_CAST(iterator)(other.begin_)), - end_(ASIO_MOVE_CAST(iterator)(other.end_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assignment operator. - basic_address_range& operator=( - const basic_address_range& other) ASIO_NOEXCEPT - { - begin_ = other.begin_; - end_ = other.end_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move assignment operator. - basic_address_range& operator=( - basic_address_range&& other) ASIO_NOEXCEPT - { - begin_ = ASIO_MOVE_CAST(iterator)(other.begin_); - end_ = ASIO_MOVE_CAST(iterator)(other.end_); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// Obtain an iterator that points to the start of the range. - iterator begin() const ASIO_NOEXCEPT - { - return begin_; - } - - /// Obtain an iterator that points to the end of the range. - iterator end() const ASIO_NOEXCEPT - { - return end_; - } - - /// Determine whether the range is empty. - bool empty() const ASIO_NOEXCEPT - { - return size() == 0; - } - - /// Return the size of the range. - std::size_t size() const ASIO_NOEXCEPT - { - return end_->to_uint() - begin_->to_uint(); - } - - /// Find an address in the range. - iterator find(const address_v4& addr) const ASIO_NOEXCEPT - { - return addr >= *begin_ && addr < *end_ ? iterator(addr) : end_; - } - -private: - iterator begin_; - iterator end_; -}; - -/// Represents a range of IPv4 addresses. -typedef basic_address_range address_v4_range; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_V4_RANGE_HPP diff --git a/scout_sdk/asio/asio/ip/address_v6.hpp b/scout_sdk/asio/asio/ip/address_v6.hpp deleted file mode 100644 index fece332..0000000 --- a/scout_sdk/asio/asio/ip/address_v6.hpp +++ /dev/null @@ -1,336 +0,0 @@ -// -// ip/address_v6.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V6_HPP -#define ASIO_IP_ADDRESS_V6_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/array.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/string_view.hpp" -#include "asio/detail/winsock_init.hpp" -#include "asio/error_code.hpp" -#include "asio/ip/address_v4.hpp" - -#if !defined(ASIO_NO_IOSTREAM) -# include -#endif // !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template class basic_address_iterator; - -/// Implements IP version 6 style addresses. -/** - * The asio::ip::address_v6 class provides the ability to use and - * manipulate IP version 6 addresses. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class address_v6 -{ -public: - /// The type used to represent an address as an array of bytes. - /** - * @note This type is defined in terms of the C++0x template @c std::array - * when it is available. Otherwise, it uses @c boost:array. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef array bytes_type; -#else - typedef asio::detail::array bytes_type; -#endif - - /// Default constructor. - ASIO_DECL address_v6(); - - /// Construct an address from raw bytes and scope ID. - ASIO_DECL explicit address_v6(const bytes_type& bytes, - unsigned long scope_id = 0); - - /// Copy constructor. - ASIO_DECL address_v6(const address_v6& other); - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - ASIO_DECL address_v6(address_v6&& other); -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from another address. - ASIO_DECL address_v6& operator=(const address_v6& other); - -#if defined(ASIO_HAS_MOVE) - /// Move-assign from another address. - ASIO_DECL address_v6& operator=(address_v6&& other); -#endif // defined(ASIO_HAS_MOVE) - - /// The scope ID of the address. - /** - * Returns the scope ID associated with the IPv6 address. - */ - unsigned long scope_id() const - { - return scope_id_; - } - - /// The scope ID of the address. - /** - * Modifies the scope ID associated with the IPv6 address. - */ - void scope_id(unsigned long id) - { - scope_id_ = id; - } - - /// Get the address in bytes, in network byte order. - ASIO_DECL bytes_type to_bytes() const; - - /// Get the address as a string. - ASIO_DECL std::string to_string() const; - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use other overload.) Get the address as a string. - ASIO_DECL std::string to_string(asio::error_code& ec) const; - - /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP - /// address string. - static address_v6 from_string(const char* str); - - /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP - /// address string. - static address_v6 from_string( - const char* str, asio::error_code& ec); - - /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP - /// address string. - static address_v6 from_string(const std::string& str); - - /// (Deprecated: Use make_address_v6().) Create an IPv6 address from an IP - /// address string. - static address_v6 from_string( - const std::string& str, asio::error_code& ec); - - /// (Deprecated: Use make_address_v4().) Converts an IPv4-mapped or - /// IPv4-compatible address to an IPv4 address. - ASIO_DECL address_v4 to_v4() const; -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Determine whether the address is a loopback address. - ASIO_DECL bool is_loopback() const; - - /// Determine whether the address is unspecified. - ASIO_DECL bool is_unspecified() const; - - /// Determine whether the address is link local. - ASIO_DECL bool is_link_local() const; - - /// Determine whether the address is site local. - ASIO_DECL bool is_site_local() const; - - /// Determine whether the address is a mapped IPv4 address. - ASIO_DECL bool is_v4_mapped() const; - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: No replacement.) Determine whether the address is an - /// IPv4-compatible address. - ASIO_DECL bool is_v4_compatible() const; -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Determine whether the address is a multicast address. - ASIO_DECL bool is_multicast() const; - - /// Determine whether the address is a global multicast address. - ASIO_DECL bool is_multicast_global() const; - - /// Determine whether the address is a link-local multicast address. - ASIO_DECL bool is_multicast_link_local() const; - - /// Determine whether the address is a node-local multicast address. - ASIO_DECL bool is_multicast_node_local() const; - - /// Determine whether the address is a org-local multicast address. - ASIO_DECL bool is_multicast_org_local() const; - - /// Determine whether the address is a site-local multicast address. - ASIO_DECL bool is_multicast_site_local() const; - - /// Compare two addresses for equality. - ASIO_DECL friend bool operator==( - const address_v6& a1, const address_v6& a2); - - /// Compare two addresses for inequality. - friend bool operator!=(const address_v6& a1, const address_v6& a2) - { - return !(a1 == a2); - } - - /// Compare addresses for ordering. - ASIO_DECL friend bool operator<( - const address_v6& a1, const address_v6& a2); - - /// Compare addresses for ordering. - friend bool operator>(const address_v6& a1, const address_v6& a2) - { - return a2 < a1; - } - - /// Compare addresses for ordering. - friend bool operator<=(const address_v6& a1, const address_v6& a2) - { - return !(a2 < a1); - } - - /// Compare addresses for ordering. - friend bool operator>=(const address_v6& a1, const address_v6& a2) - { - return !(a1 < a2); - } - - /// Obtain an address object that represents any address. - static address_v6 any() - { - return address_v6(); - } - - /// Obtain an address object that represents the loopback address. - ASIO_DECL static address_v6 loopback(); - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use make_address_v6().) Create an IPv4-mapped IPv6 address. - ASIO_DECL static address_v6 v4_mapped(const address_v4& addr); - - /// (Deprecated: No replacement.) Create an IPv4-compatible IPv6 address. - ASIO_DECL static address_v6 v4_compatible(const address_v4& addr); -#endif // !defined(ASIO_NO_DEPRECATED) - -private: - friend class basic_address_iterator; - - // The underlying IPv6 address. - asio::detail::in6_addr_type addr_; - - // The scope ID associated with the address. - unsigned long scope_id_; -}; - -/// Create an IPv6 address from raw bytes and scope ID. -/** - * @relates address_v6 - */ -inline address_v6 make_address_v6(const address_v6::bytes_type& bytes, - unsigned long scope_id = 0) -{ - return address_v6(bytes, scope_id); -} - -/// Create an IPv6 address from an IP address string. -/** - * @relates address_v6 - */ -ASIO_DECL address_v6 make_address_v6(const char* str); - -/// Create an IPv6 address from an IP address string. -/** - * @relates address_v6 - */ -ASIO_DECL address_v6 make_address_v6( - const char* str, asio::error_code& ec); - -/// Createan IPv6 address from an IP address string. -/** - * @relates address_v6 - */ -ASIO_DECL address_v6 make_address_v6(const std::string& str); - -/// Create an IPv6 address from an IP address string. -/** - * @relates address_v6 - */ -ASIO_DECL address_v6 make_address_v6( - const std::string& str, asio::error_code& ec); - -#if defined(ASIO_HAS_STRING_VIEW) \ - || defined(GENERATING_DOCUMENTATION) - -/// Create an IPv6 address from an IP address string. -/** - * @relates address_v6 - */ -ASIO_DECL address_v6 make_address_v6(string_view str); - -/// Create an IPv6 address from an IP address string. -/** - * @relates address_v6 - */ -ASIO_DECL address_v6 make_address_v6( - string_view str, asio::error_code& ec); - -#endif // defined(ASIO_HAS_STRING_VIEW) - // || defined(GENERATING_DOCUMENTATION) - -/// Tag type used for distinguishing overloads that deal in IPv4-mapped IPv6 -/// addresses. -enum v4_mapped_t { v4_mapped }; - -/// Create an IPv4 address from a IPv4-mapped IPv6 address. -/** - * @relates address_v4 - */ -ASIO_DECL address_v4 make_address_v4( - v4_mapped_t, const address_v6& v6_addr); - -/// Create an IPv4-mapped IPv6 address from an IPv4 address. -/** - * @relates address_v6 - */ -ASIO_DECL address_v6 make_address_v6( - v4_mapped_t, const address_v4& v4_addr); - -#if !defined(ASIO_NO_IOSTREAM) - -/// Output an address as a string. -/** - * Used to output a human-readable string for a specified address. - * - * @param os The output stream to which the string will be written. - * - * @param addr The address to be written. - * - * @return The output stream. - * - * @relates asio::ip::address_v6 - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address_v6& addr); - -#endif // !defined(ASIO_NO_IOSTREAM) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/impl/address_v6.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/ip/impl/address_v6.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_IP_ADDRESS_V6_HPP diff --git a/scout_sdk/asio/asio/ip/address_v6_iterator.hpp b/scout_sdk/asio/asio/ip/address_v6_iterator.hpp deleted file mode 100644 index 0a1fb3f..0000000 --- a/scout_sdk/asio/asio/ip/address_v6_iterator.hpp +++ /dev/null @@ -1,183 +0,0 @@ -// -// ip/address_v6_iterator.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Oliver Kowalke (oliver dot kowalke at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V6_ITERATOR_HPP -#define ASIO_IP_ADDRESS_V6_ITERATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ip/address_v6.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template class basic_address_iterator; - -/// An input iterator that can be used for traversing IPv6 addresses. -/** - * In addition to satisfying the input iterator requirements, this iterator - * also supports decrement. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template <> class basic_address_iterator -{ -public: - /// The type of the elements pointed to by the iterator. - typedef address_v6 value_type; - - /// Distance between two iterators. - typedef std::ptrdiff_t difference_type; - - /// The type of a pointer to an element pointed to by the iterator. - typedef const address_v6* pointer; - - /// The type of a reference to an element pointed to by the iterator. - typedef const address_v6& reference; - - /// Denotes that the iterator satisfies the input iterator requirements. - typedef std::input_iterator_tag iterator_category; - - /// Construct an iterator that points to the specified address. - basic_address_iterator(const address_v6& addr) ASIO_NOEXCEPT - : address_(addr) - { - } - - /// Copy constructor. - basic_address_iterator( - const basic_address_iterator& other) ASIO_NOEXCEPT - : address_(other.address_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - basic_address_iterator(basic_address_iterator&& other) ASIO_NOEXCEPT - : address_(ASIO_MOVE_CAST(address_v6)(other.address_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assignment operator. - basic_address_iterator& operator=( - const basic_address_iterator& other) ASIO_NOEXCEPT - { - address_ = other.address_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move assignment operator. - basic_address_iterator& operator=( - basic_address_iterator&& other) ASIO_NOEXCEPT - { - address_ = ASIO_MOVE_CAST(address_v6)(other.address_); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// Dereference the iterator. - const address_v6& operator*() const ASIO_NOEXCEPT - { - return address_; - } - - /// Dereference the iterator. - const address_v6* operator->() const ASIO_NOEXCEPT - { - return &address_; - } - - /// Pre-increment operator. - basic_address_iterator& operator++() ASIO_NOEXCEPT - { - for (int i = 15; i >= 0; --i) - { - if (address_.addr_.s6_addr[i] < 0xFF) - { - ++address_.addr_.s6_addr[i]; - break; - } - - address_.addr_.s6_addr[i] = 0; - } - - return *this; - } - - /// Post-increment operator. - basic_address_iterator operator++(int) ASIO_NOEXCEPT - { - basic_address_iterator tmp(*this); - ++*this; - return tmp; - } - - /// Pre-decrement operator. - basic_address_iterator& operator--() ASIO_NOEXCEPT - { - for (int i = 15; i >= 0; --i) - { - if (address_.addr_.s6_addr[i] > 0) - { - --address_.addr_.s6_addr[i]; - break; - } - - address_.addr_.s6_addr[i] = 0xFF; - } - - return *this; - } - - /// Post-decrement operator. - basic_address_iterator operator--(int) - { - basic_address_iterator tmp(*this); - --*this; - return tmp; - } - - /// Compare two addresses for equality. - friend bool operator==(const basic_address_iterator& a, - const basic_address_iterator& b) - { - return a.address_ == b.address_; - } - - /// Compare two addresses for inequality. - friend bool operator!=(const basic_address_iterator& a, - const basic_address_iterator& b) - { - return a.address_ != b.address_; - } - -private: - address_v6 address_; -}; - -/// An input iterator that can be used for traversing IPv6 addresses. -typedef basic_address_iterator address_v6_iterator; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_V6_ITERATOR_HPP diff --git a/scout_sdk/asio/asio/ip/address_v6_range.hpp b/scout_sdk/asio/asio/ip/address_v6_range.hpp deleted file mode 100644 index 9d7062e..0000000 --- a/scout_sdk/asio/asio/ip/address_v6_range.hpp +++ /dev/null @@ -1,129 +0,0 @@ -// -// ip/address_v6_range.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Oliver Kowalke (oliver dot kowalke at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V6_RANGE_HPP -#define ASIO_IP_ADDRESS_V6_RANGE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ip/address_v6_iterator.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template class basic_address_range; - -/// Represents a range of IPv6 addresses. -/** - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template <> class basic_address_range -{ -public: - /// The type of an iterator that points into the range. - typedef basic_address_iterator iterator; - - /// Construct an empty range. - basic_address_range() ASIO_NOEXCEPT - : begin_(address_v6()), - end_(address_v6()) - { - } - - /// Construct an range that represents the given range of addresses. - explicit basic_address_range(const iterator& first, - const iterator& last) ASIO_NOEXCEPT - : begin_(first), - end_(last) - { - } - - /// Copy constructor. - basic_address_range(const basic_address_range& other) ASIO_NOEXCEPT - : begin_(other.begin_), - end_(other.end_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - basic_address_range(basic_address_range&& other) ASIO_NOEXCEPT - : begin_(ASIO_MOVE_CAST(iterator)(other.begin_)), - end_(ASIO_MOVE_CAST(iterator)(other.end_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assignment operator. - basic_address_range& operator=( - const basic_address_range& other) ASIO_NOEXCEPT - { - begin_ = other.begin_; - end_ = other.end_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move assignment operator. - basic_address_range& operator=( - basic_address_range&& other) ASIO_NOEXCEPT - { - begin_ = ASIO_MOVE_CAST(iterator)(other.begin_); - end_ = ASIO_MOVE_CAST(iterator)(other.end_); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// Obtain an iterator that points to the start of the range. - iterator begin() const ASIO_NOEXCEPT - { - return begin_; - } - - /// Obtain an iterator that points to the end of the range. - iterator end() const ASIO_NOEXCEPT - { - return end_; - } - - /// Determine whether the range is empty. - bool empty() const ASIO_NOEXCEPT - { - return begin_ == end_; - } - - /// Find an address in the range. - iterator find(const address_v6& addr) const ASIO_NOEXCEPT - { - return addr >= *begin_ && addr < *end_ ? iterator(addr) : end_; - } - -private: - iterator begin_; - iterator end_; -}; - -/// Represents a range of IPv6 addresses. -typedef basic_address_range address_v6_range; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_V6_RANGE_HPP diff --git a/scout_sdk/asio/asio/ip/bad_address_cast.hpp b/scout_sdk/asio/asio/ip/bad_address_cast.hpp deleted file mode 100644 index 8c71f70..0000000 --- a/scout_sdk/asio/asio/ip/bad_address_cast.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// -// ip/bad_address_cast.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BAD_ADDRESS_CAST_HPP -#define ASIO_IP_BAD_ADDRESS_CAST_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Thrown to indicate a failed address conversion. -class bad_address_cast : public std::bad_cast -{ -public: - /// Default constructor. - bad_address_cast() {} - - /// Destructor. - virtual ~bad_address_cast() ASIO_NOEXCEPT_OR_NOTHROW {} - - /// Get the message associated with the exception. - virtual const char* what() const ASIO_NOEXCEPT_OR_NOTHROW - { - return "bad address cast"; - } -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_HPP diff --git a/scout_sdk/asio/asio/ip/basic_endpoint.hpp b/scout_sdk/asio/asio/ip/basic_endpoint.hpp deleted file mode 100644 index 4418ee7..0000000 --- a/scout_sdk/asio/asio/ip/basic_endpoint.hpp +++ /dev/null @@ -1,263 +0,0 @@ -// -// ip/basic_endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_ENDPOINT_HPP -#define ASIO_IP_BASIC_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ip/address.hpp" -#include "asio/ip/detail/endpoint.hpp" - -#if !defined(ASIO_NO_IOSTREAM) -# include -#endif // !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Describes an endpoint for a version-independent IP socket. -/** - * The asio::ip::basic_endpoint class template describes an endpoint that - * may be associated with a particular socket. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Endpoint. - */ -template -class basic_endpoint -{ -public: - /// The protocol type associated with the endpoint. - typedef InternetProtocol protocol_type; - - /// The type of the endpoint structure. This type is dependent on the - /// underlying implementation of the socket layer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined data_type; -#else - typedef asio::detail::socket_addr_type data_type; -#endif - - /// Default constructor. - basic_endpoint() - : impl_() - { - } - - /// Construct an endpoint using a port number, specified in the host's byte - /// order. The IP address will be the any address (i.e. INADDR_ANY or - /// in6addr_any). This constructor would typically be used for accepting new - /// connections. - /** - * @par Examples - * To initialise an IPv4 TCP endpoint for port 1234, use: - * @code - * asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 1234); - * @endcode - * - * To specify an IPv6 UDP endpoint for port 9876, use: - * @code - * asio::ip::udp::endpoint ep(asio::ip::udp::v6(), 9876); - * @endcode - */ - basic_endpoint(const InternetProtocol& internet_protocol, - unsigned short port_num) - : impl_(internet_protocol.family(), port_num) - { - } - - /// Construct an endpoint using a port number and an IP address. This - /// constructor may be used for accepting connections on a specific interface - /// or for making a connection to a remote endpoint. - basic_endpoint(const asio::ip::address& addr, unsigned short port_num) - : impl_(addr, port_num) - { - } - - /// Copy constructor. - basic_endpoint(const basic_endpoint& other) - : impl_(other.impl_) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move constructor. - basic_endpoint(basic_endpoint&& other) - : impl_(other.impl_) - { - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Assign from another endpoint. - basic_endpoint& operator=(const basic_endpoint& other) - { - impl_ = other.impl_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-assign from another endpoint. - basic_endpoint& operator=(basic_endpoint&& other) - { - impl_ = other.impl_; - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// The protocol associated with the endpoint. - protocol_type protocol() const - { - if (impl_.is_v4()) - return InternetProtocol::v4(); - return InternetProtocol::v6(); - } - - /// Get the underlying endpoint in the native type. - data_type* data() - { - return impl_.data(); - } - - /// Get the underlying endpoint in the native type. - const data_type* data() const - { - return impl_.data(); - } - - /// Get the underlying size of the endpoint in the native type. - std::size_t size() const - { - return impl_.size(); - } - - /// Set the underlying size of the endpoint in the native type. - void resize(std::size_t new_size) - { - impl_.resize(new_size); - } - - /// Get the capacity of the endpoint in the native type. - std::size_t capacity() const - { - return impl_.capacity(); - } - - /// Get the port associated with the endpoint. The port number is always in - /// the host's byte order. - unsigned short port() const - { - return impl_.port(); - } - - /// Set the port associated with the endpoint. The port number is always in - /// the host's byte order. - void port(unsigned short port_num) - { - impl_.port(port_num); - } - - /// Get the IP address associated with the endpoint. - asio::ip::address address() const - { - return impl_.address(); - } - - /// Set the IP address associated with the endpoint. - void address(const asio::ip::address& addr) - { - impl_.address(addr); - } - - /// Compare two endpoints for equality. - friend bool operator==(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.impl_ == e2.impl_; - } - - /// Compare two endpoints for inequality. - friend bool operator!=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e1 == e2); - } - - /// Compare endpoints for ordering. - friend bool operator<(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.impl_ < e2.impl_; - } - - /// Compare endpoints for ordering. - friend bool operator>(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e2.impl_ < e1.impl_; - } - - /// Compare endpoints for ordering. - friend bool operator<=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e2 < e1); - } - - /// Compare endpoints for ordering. - friend bool operator>=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e1 < e2); - } - -private: - // The underlying IP endpoint. - asio::ip::detail::endpoint impl_; -}; - -#if !defined(ASIO_NO_IOSTREAM) - -/// Output an endpoint as a string. -/** - * Used to output a human-readable string for a specified endpoint. - * - * @param os The output stream to which the string will be written. - * - * @param endpoint The endpoint to be written. - * - * @return The output stream. - * - * @relates asio::ip::basic_endpoint - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, - const basic_endpoint& endpoint); - -#endif // !defined(ASIO_NO_IOSTREAM) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/impl/basic_endpoint.hpp" - -#endif // ASIO_IP_BASIC_ENDPOINT_HPP diff --git a/scout_sdk/asio/asio/ip/basic_resolver.hpp b/scout_sdk/asio/asio/ip/basic_resolver.hpp deleted file mode 100644 index 812dbec..0000000 --- a/scout_sdk/asio/asio/ip/basic_resolver.hpp +++ /dev/null @@ -1,1018 +0,0 @@ -// -// ip/basic_resolver.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_HPP -#define ASIO_IP_BASIC_RESOLVER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/string_view.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/basic_resolver_results.hpp" -#include "asio/ip/resolver_base.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/ip/resolver_service.hpp" -#else // defined(ASIO_ENABLE_OLD_SERVICES) -# if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/winrt_resolver_service.hpp" -# define ASIO_SVC_T \ - asio::detail::winrt_resolver_service -# else -# include "asio/detail/resolver_service.hpp" -# define ASIO_SVC_T \ - asio::detail::resolver_service -# endif -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Provides endpoint resolution functionality. -/** - * The basic_resolver class template provides the ability to resolve a query - * to a list of endpoints. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template )> -class basic_resolver - : ASIO_SVC_ACCESS basic_io_object, - public resolver_base -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The protocol type. - typedef InternetProtocol protocol_type; - - /// The endpoint type. - typedef typename InternetProtocol::endpoint endpoint_type; - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated.) The query type. - typedef basic_resolver_query query; - - /// (Deprecated.) The iterator type. - typedef basic_resolver_iterator iterator; -#endif // !defined(ASIO_NO_DEPRECATED) - - /// The results type. - typedef basic_resolver_results results_type; - - /// Constructor. - /** - * This constructor creates a basic_resolver. - * - * @param io_context The io_context object that the resolver will use to - * dispatch handlers for any asynchronous operations performed on the - * resolver. - */ - explicit basic_resolver(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_resolver from another. - /** - * This constructor moves a resolver from one object to another. - * - * @param other The other basic_resolver object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_resolver(io_context&) constructor. - */ - basic_resolver(basic_resolver&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign a basic_resolver from another. - /** - * This assignment operator moves a resolver from one object to another. - * Cancels any outstanding asynchronous operations associated with the target - * object. - * - * @param other The other basic_resolver object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_resolver(io_context&) constructor. - */ - basic_resolver& operator=(basic_resolver&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the resolver. - /** - * This function destroys the resolver, cancelling any outstanding - * asynchronous wait operations associated with the resolver as if by calling - * @c cancel. - */ - ~basic_resolver() - { - } - -#if defined(ASIO_ENABLE_OLD_SERVICES) - // These functions are provided by basic_io_object<>. -#else // defined(ASIO_ENABLE_OLD_SERVICES) -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - - /// Cancel any asynchronous operations that are waiting on the resolver. - /** - * This function forces the completion of any pending asynchronous - * operations on the host resolver. The handler for each cancelled operation - * will be invoked with the asio::error::operation_aborted error code. - */ - void cancel() - { - return this->get_service().cancel(this->get_implementation()); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated.) Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve a query into a list of endpoint entries. - * - * @param q A query object that determines what endpoints will be returned. - * - * @returns A range object representing the list of endpoint entries. A - * successful call to this function is guaranteed to return a non-empty - * range. - * - * @throws asio::system_error Thrown on failure. - */ - results_type resolve(const query& q) - { - asio::error_code ec; - results_type r = this->get_service().resolve( - this->get_implementation(), q, ec); - asio::detail::throw_error(ec, "resolve"); - return r; - } - - /// (Deprecated.) Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve a query into a list of endpoint entries. - * - * @param q A query object that determines what endpoints will be returned. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns A range object representing the list of endpoint entries. An - * empty range is returned if an error occurs. A successful call to this - * function is guaranteed to return a non-empty range. - */ - results_type resolve(const query& q, asio::error_code& ec) - { - return this->get_service().resolve(this->get_implementation(), q, ec); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @returns A range object representing the list of endpoint entries. A - * successful call to this function is guaranteed to return a non-empty - * range. - * - * @throws asio::system_error Thrown on failure. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(ASIO_STRING_VIEW_PARAM host, - ASIO_STRING_VIEW_PARAM service) - { - return resolve(host, service, resolver_base::flags()); - } - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns A range object representing the list of endpoint entries. An - * empty range is returned if an error occurs. A successful call to this - * function is guaranteed to return a non-empty range. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(ASIO_STRING_VIEW_PARAM host, - ASIO_STRING_VIEW_PARAM service, asio::error_code& ec) - { - return resolve(host, service, resolver_base::flags(), ec); - } - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @returns A range object representing the list of endpoint entries. A - * successful call to this function is guaranteed to return a non-empty - * range. - * - * @throws asio::system_error Thrown on failure. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(ASIO_STRING_VIEW_PARAM host, - ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags) - { - asio::error_code ec; - basic_resolver_query q(static_cast(host), - static_cast(service), resolve_flags); - results_type r = this->get_service().resolve( - this->get_implementation(), q, ec); - asio::detail::throw_error(ec, "resolve"); - return r; - } - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns A range object representing the list of endpoint entries. An - * empty range is returned if an error occurs. A successful call to this - * function is guaranteed to return a non-empty range. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(ASIO_STRING_VIEW_PARAM host, - ASIO_STRING_VIEW_PARAM service, resolver_base::flags resolve_flags, - asio::error_code& ec) - { - basic_resolver_query q(static_cast(host), - static_cast(service), resolve_flags); - return this->get_service().resolve(this->get_implementation(), q, ec); - } - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @returns A range object representing the list of endpoint entries. A - * successful call to this function is guaranteed to return a non-empty - * range. - * - * @throws asio::system_error Thrown on failure. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(const protocol_type& protocol, - ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service) - { - return resolve(protocol, host, service, resolver_base::flags()); - } - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns A range object representing the list of endpoint entries. An - * empty range is returned if an error occurs. A successful call to this - * function is guaranteed to return a non-empty range. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(const protocol_type& protocol, - ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, - asio::error_code& ec) - { - return resolve(protocol, host, service, resolver_base::flags(), ec); - } - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @returns A range object representing the list of endpoint entries. A - * successful call to this function is guaranteed to return a non-empty - * range. - * - * @throws asio::system_error Thrown on failure. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(const protocol_type& protocol, - ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, - resolver_base::flags resolve_flags) - { - asio::error_code ec; - basic_resolver_query q( - protocol, static_cast(host), - static_cast(service), resolve_flags); - results_type r = this->get_service().resolve( - this->get_implementation(), q, ec); - asio::detail::throw_error(ec, "resolve"); - return r; - } - - /// Perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns A range object representing the list of endpoint entries. An - * empty range is returned if an error occurs. A successful call to this - * function is guaranteed to return a non-empty range. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - results_type resolve(const protocol_type& protocol, - ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, - resolver_base::flags resolve_flags, asio::error_code& ec) - { - basic_resolver_query q( - protocol, static_cast(host), - static_cast(service), resolve_flags); - return this->get_service().resolve(this->get_implementation(), q, ec); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated.) Asynchronously perform forward resolution of a query to a - /// list of entries. - /** - * This function is used to asynchronously resolve a query into a list of - * endpoint entries. - * - * @param q A query object that determines what endpoints will be returned. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * resolver::results_type results // Resolved endpoints as a range. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * A successful resolve operation is guaranteed to pass a non-empty range to - * the handler. - */ - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(const query& q, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ResolveHandler. - ASIO_RESOLVE_HANDLER_CHECK( - ResolveHandler, handler, results_type) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_resolve(this->get_implementation(), q, - ASIO_MOVE_CAST(ResolveHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - asio::async_completion init(handler); - - this->get_service().async_resolve( - this->get_implementation(), q, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Asynchronously perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * resolver::results_type results // Resolved endpoints as a range. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * A successful resolve operation is guaranteed to pass a non-empty range to - * the handler. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(ASIO_STRING_VIEW_PARAM host, - ASIO_STRING_VIEW_PARAM service, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - return async_resolve(host, service, resolver_base::flags(), - ASIO_MOVE_CAST(ResolveHandler)(handler)); - } - - /// Asynchronously perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * resolver::results_type results // Resolved endpoints as a range. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * A successful resolve operation is guaranteed to pass a non-empty range to - * the handler. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(ASIO_STRING_VIEW_PARAM host, - ASIO_STRING_VIEW_PARAM service, - resolver_base::flags resolve_flags, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ResolveHandler. - ASIO_RESOLVE_HANDLER_CHECK( - ResolveHandler, handler, results_type) type_check; - - basic_resolver_query q(static_cast(host), - static_cast(service), resolve_flags); - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_resolve(this->get_implementation(), q, - ASIO_MOVE_CAST(ResolveHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - asio::async_completion init(handler); - - this->get_service().async_resolve( - this->get_implementation(), q, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Asynchronously perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * resolver::results_type results // Resolved endpoints as a range. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * A successful resolve operation is guaranteed to pass a non-empty range to - * the handler. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(const protocol_type& protocol, - ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - return async_resolve(protocol, host, service, resolver_base::flags(), - ASIO_MOVE_CAST(ResolveHandler)(handler)); - } - - /// Asynchronously perform forward resolution of a query to a list of entries. - /** - * This function is used to resolve host and service names into a list of - * endpoint entries. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * resolver::results_type results // Resolved endpoints as a range. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * A successful resolve operation is guaranteed to pass a non-empty range to - * the handler. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(const protocol_type& protocol, - ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service, - resolver_base::flags resolve_flags, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ResolveHandler. - ASIO_RESOLVE_HANDLER_CHECK( - ResolveHandler, handler, results_type) type_check; - - basic_resolver_query q( - protocol, static_cast(host), - static_cast(service), resolve_flags); - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_resolve(this->get_implementation(), q, - ASIO_MOVE_CAST(ResolveHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - asio::async_completion init(handler); - - this->get_service().async_resolve( - this->get_implementation(), q, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } - - /// Perform reverse resolution of an endpoint to a list of entries. - /** - * This function is used to resolve an endpoint into a list of endpoint - * entries. - * - * @param e An endpoint object that determines what endpoints will be - * returned. - * - * @returns A range object representing the list of endpoint entries. A - * successful call to this function is guaranteed to return a non-empty - * range. - * - * @throws asio::system_error Thrown on failure. - */ - results_type resolve(const endpoint_type& e) - { - asio::error_code ec; - results_type i = this->get_service().resolve( - this->get_implementation(), e, ec); - asio::detail::throw_error(ec, "resolve"); - return i; - } - - /// Perform reverse resolution of an endpoint to a list of entries. - /** - * This function is used to resolve an endpoint into a list of endpoint - * entries. - * - * @param e An endpoint object that determines what endpoints will be - * returned. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns A range object representing the list of endpoint entries. An - * empty range is returned if an error occurs. A successful call to this - * function is guaranteed to return a non-empty range. - */ - results_type resolve(const endpoint_type& e, asio::error_code& ec) - { - return this->get_service().resolve(this->get_implementation(), e, ec); - } - - /// Asynchronously perform reverse resolution of an endpoint to a list of - /// entries. - /** - * This function is used to asynchronously resolve an endpoint into a list of - * endpoint entries. - * - * @param e An endpoint object that determines what endpoints will be - * returned. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * resolver::results_type results // Resolved endpoints as a range. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * A successful resolve operation is guaranteed to pass a non-empty range to - * the handler. - */ - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(const endpoint_type& e, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ResolveHandler. - ASIO_RESOLVE_HANDLER_CHECK( - ResolveHandler, handler, results_type) type_check; - -#if defined(ASIO_ENABLE_OLD_SERVICES) - return this->get_service().async_resolve(this->get_implementation(), e, - ASIO_MOVE_CAST(ResolveHandler)(handler)); -#else // defined(ASIO_ENABLE_OLD_SERVICES) - asio::async_completion init(handler); - - this->get_service().async_resolve( - this->get_implementation(), e, init.completion_handler); - - return init.result.get(); -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - } -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# undef ASIO_SVC_T -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_IP_BASIC_RESOLVER_HPP diff --git a/scout_sdk/asio/asio/ip/basic_resolver_entry.hpp b/scout_sdk/asio/asio/ip/basic_resolver_entry.hpp deleted file mode 100644 index 99bcbd2..0000000 --- a/scout_sdk/asio/asio/ip/basic_resolver_entry.hpp +++ /dev/null @@ -1,113 +0,0 @@ -// -// ip/basic_resolver_entry.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_ENTRY_HPP -#define ASIO_IP_BASIC_RESOLVER_ENTRY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/string_view.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// An entry produced by a resolver. -/** - * The asio::ip::basic_resolver_entry class template describes an entry - * as returned by a resolver. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_resolver_entry -{ -public: - /// The protocol type associated with the endpoint entry. - typedef InternetProtocol protocol_type; - - /// The endpoint type associated with the endpoint entry. - typedef typename InternetProtocol::endpoint endpoint_type; - - /// Default constructor. - basic_resolver_entry() - { - } - - /// Construct with specified endpoint, host name and service name. - basic_resolver_entry(const endpoint_type& ep, - ASIO_STRING_VIEW_PARAM host, ASIO_STRING_VIEW_PARAM service) - : endpoint_(ep), - host_name_(static_cast(host)), - service_name_(static_cast(service)) - { - } - - /// Get the endpoint associated with the entry. - endpoint_type endpoint() const - { - return endpoint_; - } - - /// Convert to the endpoint associated with the entry. - operator endpoint_type() const - { - return endpoint_; - } - - /// Get the host name associated with the entry. - std::string host_name() const - { - return host_name_; - } - - /// Get the host name associated with the entry. - template - std::basic_string, Allocator> host_name( - const Allocator& alloc = Allocator()) const - { - return std::basic_string, Allocator>( - host_name_.c_str(), alloc); - } - - /// Get the service name associated with the entry. - std::string service_name() const - { - return service_name_; - } - - /// Get the service name associated with the entry. - template - std::basic_string, Allocator> service_name( - const Allocator& alloc = Allocator()) const - { - return std::basic_string, Allocator>( - service_name_.c_str(), alloc); - } - -private: - endpoint_type endpoint_; - std::string host_name_; - std::string service_name_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_RESOLVER_ENTRY_HPP diff --git a/scout_sdk/asio/asio/ip/basic_resolver_iterator.hpp b/scout_sdk/asio/asio/ip/basic_resolver_iterator.hpp deleted file mode 100644 index ec5412c..0000000 --- a/scout_sdk/asio/asio/ip/basic_resolver_iterator.hpp +++ /dev/null @@ -1,192 +0,0 @@ -// -// ip/basic_resolver_iterator.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP -#define ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include -#include -#include "asio/detail/memory.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/ip/basic_resolver_entry.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/winrt_utils.hpp" -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// An iterator over the entries produced by a resolver. -/** - * The asio::ip::basic_resolver_iterator class template is used to define - * iterators over the results returned by a resolver. - * - * The iterator's value_type, obtained when the iterator is dereferenced, is: - * @code const basic_resolver_entry @endcode - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_resolver_iterator -{ -public: - /// The type used for the distance between two iterators. - typedef std::ptrdiff_t difference_type; - - /// The type of the value pointed to by the iterator. - typedef basic_resolver_entry value_type; - - /// The type of the result of applying operator->() to the iterator. - typedef const basic_resolver_entry* pointer; - - /// The type of the result of applying operator*() to the iterator. - typedef const basic_resolver_entry& reference; - - /// The iterator category. - typedef std::forward_iterator_tag iterator_category; - - /// Default constructor creates an end iterator. - basic_resolver_iterator() - : index_(0) - { - } - - /// Copy constructor. - basic_resolver_iterator(const basic_resolver_iterator& other) - : values_(other.values_), - index_(other.index_) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move constructor. - basic_resolver_iterator(basic_resolver_iterator&& other) - : values_(ASIO_MOVE_CAST(values_ptr_type)(other.values_)), - index_(other.index_) - { - other.index_ = 0; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Assignment operator. - basic_resolver_iterator& operator=(const basic_resolver_iterator& other) - { - values_ = other.values_; - index_ = other.index_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-assignment operator. - basic_resolver_iterator& operator=(basic_resolver_iterator&& other) - { - if (this != &other) - { - values_ = ASIO_MOVE_CAST(values_ptr_type)(other.values_); - index_ = other.index_; - other.index_ = 0; - } - - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Dereference an iterator. - const basic_resolver_entry& operator*() const - { - return dereference(); - } - - /// Dereference an iterator. - const basic_resolver_entry* operator->() const - { - return &dereference(); - } - - /// Increment operator (prefix). - basic_resolver_iterator& operator++() - { - increment(); - return *this; - } - - /// Increment operator (postfix). - basic_resolver_iterator operator++(int) - { - basic_resolver_iterator tmp(*this); - ++*this; - return tmp; - } - - /// Test two iterators for equality. - friend bool operator==(const basic_resolver_iterator& a, - const basic_resolver_iterator& b) - { - return a.equal(b); - } - - /// Test two iterators for inequality. - friend bool operator!=(const basic_resolver_iterator& a, - const basic_resolver_iterator& b) - { - return !a.equal(b); - } - -protected: - void increment() - { - if (++index_ == values_->size()) - { - // Reset state to match a default constructed end iterator. - values_.reset(); - index_ = 0; - } - } - - bool equal(const basic_resolver_iterator& other) const - { - if (!values_ && !other.values_) - return true; - if (values_ != other.values_) - return false; - return index_ == other.index_; - } - - const basic_resolver_entry& dereference() const - { - return (*values_)[index_]; - } - - typedef std::vector > values_type; - typedef asio::detail::shared_ptr values_ptr_type; - values_ptr_type values_; - std::size_t index_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP diff --git a/scout_sdk/asio/asio/ip/basic_resolver_query.hpp b/scout_sdk/asio/asio/ip/basic_resolver_query.hpp deleted file mode 100644 index 84cd98d..0000000 --- a/scout_sdk/asio/asio/ip/basic_resolver_query.hpp +++ /dev/null @@ -1,244 +0,0 @@ -// -// ip/basic_resolver_query.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_QUERY_HPP -#define ASIO_IP_BASIC_RESOLVER_QUERY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/socket_ops.hpp" -#include "asio/ip/resolver_query_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// An query to be passed to a resolver. -/** - * The asio::ip::basic_resolver_query class template describes a query - * that can be passed to a resolver. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_resolver_query - : public resolver_query_base -{ -public: - /// The protocol type associated with the endpoint query. - typedef InternetProtocol protocol_type; - - /// Construct with specified service name for any protocol. - /** - * This constructor is typically used to perform name resolution for local - * service binding. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for local service - * binding. - * - * @note On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - basic_resolver_query(const std::string& service, - resolver_query_base::flags resolve_flags = passive | address_configured) - : hints_(), - host_name_(), - service_name_(service) - { - typename InternetProtocol::endpoint endpoint; - hints_.ai_flags = static_cast(resolve_flags); - hints_.ai_family = PF_UNSPEC; - hints_.ai_socktype = endpoint.protocol().type(); - hints_.ai_protocol = endpoint.protocol().protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Construct with specified service name for a given protocol. - /** - * This constructor is typically used to perform name resolution for local - * service binding with a specific protocol version. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for local service - * binding. - * - * @note On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - basic_resolver_query(const protocol_type& protocol, - const std::string& service, - resolver_query_base::flags resolve_flags = passive | address_configured) - : hints_(), - host_name_(), - service_name_(service) - { - hints_.ai_flags = static_cast(resolve_flags); - hints_.ai_family = protocol.family(); - hints_.ai_socktype = protocol.type(); - hints_.ai_protocol = protocol.protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Construct with specified host name and service name for any protocol. - /** - * This constructor is typically used to perform name resolution for - * communication with remote hosts. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - basic_resolver_query(const std::string& host, const std::string& service, - resolver_query_base::flags resolve_flags = address_configured) - : hints_(), - host_name_(host), - service_name_(service) - { - typename InternetProtocol::endpoint endpoint; - hints_.ai_flags = static_cast(resolve_flags); - hints_.ai_family = ASIO_OS_DEF(AF_UNSPEC); - hints_.ai_socktype = endpoint.protocol().type(); - hints_.ai_protocol = endpoint.protocol().protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Construct with specified host name and service name for a given protocol. - /** - * This constructor is typically used to perform name resolution for - * communication with remote hosts. - * - * @param protocol A protocol object, normally representing either the IPv4 or - * IPv6 version of an internet protocol. - * - * @param host A string identifying a location. May be a descriptive name or - * a numeric address string. If an empty string and the passive flag has been - * specified, the resolved endpoints are suitable for local service binding. - * If an empty string and passive is not specified, the resolved endpoints - * will use the loopback address. - * - * @param service A string identifying the requested service. This may be a - * descriptive name or a numeric string corresponding to a port number. May - * be an empty string, in which case all resolved endpoints will have a port - * number of 0. - * - * @param resolve_flags A set of flags that determine how name resolution - * should be performed. The default flags are suitable for communication with - * remote hosts. - * - * @note On POSIX systems, host names may be locally defined in the file - * /etc/hosts. On Windows, host names may be defined in the file - * c:\\windows\\system32\\drivers\\etc\\hosts. Remote host name - * resolution is performed using DNS. Operating systems may use additional - * locations when resolving host names (such as NETBIOS names on Windows). - * - * On POSIX systems, service names are typically defined in the file - * /etc/services. On Windows, service names may be found in the file - * c:\\windows\\system32\\drivers\\etc\\services. Operating systems - * may use additional locations when resolving service names. - */ - basic_resolver_query(const protocol_type& protocol, - const std::string& host, const std::string& service, - resolver_query_base::flags resolve_flags = address_configured) - : hints_(), - host_name_(host), - service_name_(service) - { - hints_.ai_flags = static_cast(resolve_flags); - hints_.ai_family = protocol.family(); - hints_.ai_socktype = protocol.type(); - hints_.ai_protocol = protocol.protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Get the hints associated with the query. - const asio::detail::addrinfo_type& hints() const - { - return hints_; - } - - /// Get the host name associated with the query. - std::string host_name() const - { - return host_name_; - } - - /// Get the service name associated with the query. - std::string service_name() const - { - return service_name_; - } - -private: - asio::detail::addrinfo_type hints_; - std::string host_name_; - std::string service_name_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_RESOLVER_QUERY_HPP diff --git a/scout_sdk/asio/asio/ip/basic_resolver_results.hpp b/scout_sdk/asio/asio/ip/basic_resolver_results.hpp deleted file mode 100644 index 185075f..0000000 --- a/scout_sdk/asio/asio/ip/basic_resolver_results.hpp +++ /dev/null @@ -1,311 +0,0 @@ -// -// ip/basic_resolver_results.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_RESULTS_HPP -#define ASIO_IP_BASIC_RESOLVER_RESULTS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/winrt_utils.hpp" -#endif // defined(ASIO_WINDOWS_RUNTIME) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// A range of entries produced by a resolver. -/** - * The asio::ip::basic_resolver_results class template is used to define - * a range over the results returned by a resolver. - * - * The iterator's value_type, obtained when a results iterator is dereferenced, - * is: @code const basic_resolver_entry @endcode - * - * @note For backward compatibility, basic_resolver_results is derived from - * basic_resolver_iterator. This derivation is deprecated. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_resolver_results -#if !defined(ASIO_NO_DEPRECATED) - : public basic_resolver_iterator -#else // !defined(ASIO_NO_DEPRECATED) - : private basic_resolver_iterator -#endif // !defined(ASIO_NO_DEPRECATED) -{ -public: - /// The protocol type associated with the results. - typedef InternetProtocol protocol_type; - - /// The endpoint type associated with the results. - typedef typename protocol_type::endpoint endpoint_type; - - /// The type of a value in the results range. - typedef basic_resolver_entry value_type; - - /// The type of a const reference to a value in the range. - typedef const value_type& const_reference; - - /// The type of a non-const reference to a value in the range. - typedef value_type& reference; - - /// The type of an iterator into the range. - typedef basic_resolver_iterator const_iterator; - - /// The type of an iterator into the range. - typedef const_iterator iterator; - - /// Type used to represent the distance between two iterators in the range. - typedef std::ptrdiff_t difference_type; - - /// Type used to represent a count of the elements in the range. - typedef std::size_t size_type; - - /// Default constructor creates an empty range. - basic_resolver_results() - { - } - - /// Copy constructor. - basic_resolver_results(const basic_resolver_results& other) - : basic_resolver_iterator(other) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move constructor. - basic_resolver_results(basic_resolver_results&& other) - : basic_resolver_iterator( - ASIO_MOVE_CAST(basic_resolver_results)(other)) - { - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Assignment operator. - basic_resolver_results& operator=(const basic_resolver_results& other) - { - basic_resolver_iterator::operator=(other); - return *this; - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-assignment operator. - basic_resolver_results& operator=(basic_resolver_results&& other) - { - basic_resolver_iterator::operator=( - ASIO_MOVE_CAST(basic_resolver_results)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - -#if !defined(GENERATING_DOCUMENTATION) - // Create results from an addrinfo list returned by getaddrinfo. - static basic_resolver_results create( - asio::detail::addrinfo_type* address_info, - const std::string& host_name, const std::string& service_name) - { - basic_resolver_results results; - if (!address_info) - return results; - - std::string actual_host_name = host_name; - if (address_info->ai_canonname) - actual_host_name = address_info->ai_canonname; - - results.values_.reset(new values_type); - - while (address_info) - { - if (address_info->ai_family == ASIO_OS_DEF(AF_INET) - || address_info->ai_family == ASIO_OS_DEF(AF_INET6)) - { - using namespace std; // For memcpy. - typename InternetProtocol::endpoint endpoint; - endpoint.resize(static_cast(address_info->ai_addrlen)); - memcpy(endpoint.data(), address_info->ai_addr, - address_info->ai_addrlen); - results.values_->push_back( - basic_resolver_entry(endpoint, - actual_host_name, service_name)); - } - address_info = address_info->ai_next; - } - - return results; - } - - // Create results from an endpoint, host name and service name. - static basic_resolver_results create(const endpoint_type& endpoint, - const std::string& host_name, const std::string& service_name) - { - basic_resolver_results results; - results.values_.reset(new values_type); - results.values_->push_back( - basic_resolver_entry( - endpoint, host_name, service_name)); - return results; - } - - // Create results from a sequence of endpoints, host and service name. - template - static basic_resolver_results create( - EndpointIterator begin, EndpointIterator end, - const std::string& host_name, const std::string& service_name) - { - basic_resolver_results results; - if (begin != end) - { - results.values_.reset(new values_type); - for (EndpointIterator ep_iter = begin; ep_iter != end; ++ep_iter) - { - results.values_->push_back( - basic_resolver_entry( - *ep_iter, host_name, service_name)); - } - } - return results; - } - -# if defined(ASIO_WINDOWS_RUNTIME) - // Create results from a Windows Runtime list of EndpointPair objects. - static basic_resolver_results create( - Windows::Foundation::Collections::IVectorView< - Windows::Networking::EndpointPair^>^ endpoints, - const asio::detail::addrinfo_type& hints, - const std::string& host_name, const std::string& service_name) - { - basic_resolver_results results; - if (endpoints->Size) - { - results.values_.reset(new values_type); - for (unsigned int i = 0; i < endpoints->Size; ++i) - { - auto pair = endpoints->GetAt(i); - - if (hints.ai_family == ASIO_OS_DEF(AF_INET) - && pair->RemoteHostName->Type - != Windows::Networking::HostNameType::Ipv4) - continue; - - if (hints.ai_family == ASIO_OS_DEF(AF_INET6) - && pair->RemoteHostName->Type - != Windows::Networking::HostNameType::Ipv6) - continue; - - results.values_->push_back( - basic_resolver_entry( - typename InternetProtocol::endpoint( - ip::make_address( - asio::detail::winrt_utils::string( - pair->RemoteHostName->CanonicalName)), - asio::detail::winrt_utils::integer( - pair->RemoteServiceName)), - host_name, service_name)); - } - } - return results; - } -# endif // defined(ASIO_WINDOWS_RUNTIME) -#endif // !defined(GENERATING_DOCUMENTATION) - - /// Get the number of entries in the results range. - size_type size() const ASIO_NOEXCEPT - { - return this->values_->size(); - } - - /// Get the maximum number of entries permitted in a results range. - size_type max_size() const ASIO_NOEXCEPT - { - return this->values_->max_size(); - } - - /// Determine whether the results range is empty. - bool empty() const ASIO_NOEXCEPT - { - return this->values_->empty(); - } - - /// Obtain a begin iterator for the results range. - const_iterator begin() const - { - basic_resolver_results tmp(*this); - tmp.index_ = 0; - return tmp; - } - - /// Obtain an end iterator for the results range. - const_iterator end() const - { - return const_iterator(); - } - - /// Obtain a begin iterator for the results range. - const_iterator cbegin() const - { - return begin(); - } - - /// Obtain an end iterator for the results range. - const_iterator cend() const - { - return end(); - } - - /// Swap the results range with another. - void swap(basic_resolver_results& that) ASIO_NOEXCEPT - { - if (this != &that) - { - this->values_.swap(that.values_); - std::size_t index = this->index_; - this->index_ = that.index_; - that.index_ = index; - } - } - - /// Test two iterators for equality. - friend bool operator==(const basic_resolver_results& a, - const basic_resolver_results& b) - { - return a.equal(b); - } - - /// Test two iterators for inequality. - friend bool operator!=(const basic_resolver_results& a, - const basic_resolver_results& b) - { - return !a.equal(b); - } - -private: - typedef std::vector > values_type; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_RESOLVER_RESULTS_HPP diff --git a/scout_sdk/asio/asio/ip/detail/endpoint.hpp b/scout_sdk/asio/asio/ip/detail/endpoint.hpp deleted file mode 100644 index 9acefe5..0000000 --- a/scout_sdk/asio/asio/ip/detail/endpoint.hpp +++ /dev/null @@ -1,139 +0,0 @@ -// -// ip/detail/endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_DETAIL_ENDPOINT_HPP -#define ASIO_IP_DETAIL_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/socket_types.hpp" -#include "asio/detail/winsock_init.hpp" -#include "asio/error_code.hpp" -#include "asio/ip/address.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { -namespace detail { - -// Helper class for implementating an IP endpoint. -class endpoint -{ -public: - // Default constructor. - ASIO_DECL endpoint(); - - // Construct an endpoint using a family and port number. - ASIO_DECL endpoint(int family, unsigned short port_num); - - // Construct an endpoint using an address and port number. - ASIO_DECL endpoint(const asio::ip::address& addr, - unsigned short port_num); - - // Copy constructor. - endpoint(const endpoint& other) - : data_(other.data_) - { - } - - // Assign from another endpoint. - endpoint& operator=(const endpoint& other) - { - data_ = other.data_; - return *this; - } - - // Get the underlying endpoint in the native type. - asio::detail::socket_addr_type* data() - { - return &data_.base; - } - - // Get the underlying endpoint in the native type. - const asio::detail::socket_addr_type* data() const - { - return &data_.base; - } - - // Get the underlying size of the endpoint in the native type. - std::size_t size() const - { - if (is_v4()) - return sizeof(asio::detail::sockaddr_in4_type); - else - return sizeof(asio::detail::sockaddr_in6_type); - } - - // Set the underlying size of the endpoint in the native type. - ASIO_DECL void resize(std::size_t new_size); - - // Get the capacity of the endpoint in the native type. - std::size_t capacity() const - { - return sizeof(data_); - } - - // Get the port associated with the endpoint. - ASIO_DECL unsigned short port() const; - - // Set the port associated with the endpoint. - ASIO_DECL void port(unsigned short port_num); - - // Get the IP address associated with the endpoint. - ASIO_DECL asio::ip::address address() const; - - // Set the IP address associated with the endpoint. - ASIO_DECL void address(const asio::ip::address& addr); - - // Compare two endpoints for equality. - ASIO_DECL friend bool operator==( - const endpoint& e1, const endpoint& e2); - - // Compare endpoints for ordering. - ASIO_DECL friend bool operator<( - const endpoint& e1, const endpoint& e2); - - // Determine whether the endpoint is IPv4. - bool is_v4() const - { - return data_.base.sa_family == ASIO_OS_DEF(AF_INET); - } - -#if !defined(ASIO_NO_IOSTREAM) - // Convert to a string. - ASIO_DECL std::string to_string() const; -#endif // !defined(ASIO_NO_IOSTREAM) - -private: - // The underlying IP socket address. - union data_union - { - asio::detail::socket_addr_type base; - asio::detail::sockaddr_in4_type v4; - asio::detail::sockaddr_in6_type v6; - } data_; -}; - -} // namespace detail -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/ip/detail/impl/endpoint.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_IP_DETAIL_ENDPOINT_HPP diff --git a/scout_sdk/asio/asio/ip/detail/impl/endpoint.ipp b/scout_sdk/asio/asio/ip/detail/impl/endpoint.ipp deleted file mode 100644 index 304bdf3..0000000 --- a/scout_sdk/asio/asio/ip/detail/impl/endpoint.ipp +++ /dev/null @@ -1,199 +0,0 @@ -// -// ip/detail/impl/endpoint.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP -#define ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#if !defined(ASIO_NO_IOSTREAM) -# include -#endif // !defined(ASIO_NO_IOSTREAM) -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/ip/detail/endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { -namespace detail { - -endpoint::endpoint() - : data_() -{ - data_.v4.sin_family = ASIO_OS_DEF(AF_INET); - data_.v4.sin_port = 0; - data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY); -} - -endpoint::endpoint(int family, unsigned short port_num) - : data_() -{ - using namespace std; // For memcpy. - if (family == ASIO_OS_DEF(AF_INET)) - { - data_.v4.sin_family = ASIO_OS_DEF(AF_INET); - data_.v4.sin_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data_.v4.sin_addr.s_addr = ASIO_OS_DEF(INADDR_ANY); - } - else - { - data_.v6.sin6_family = ASIO_OS_DEF(AF_INET6); - data_.v6.sin6_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data_.v6.sin6_flowinfo = 0; - data_.v6.sin6_addr.s6_addr[0] = 0; data_.v6.sin6_addr.s6_addr[1] = 0; - data_.v6.sin6_addr.s6_addr[2] = 0; data_.v6.sin6_addr.s6_addr[3] = 0; - data_.v6.sin6_addr.s6_addr[4] = 0; data_.v6.sin6_addr.s6_addr[5] = 0; - data_.v6.sin6_addr.s6_addr[6] = 0; data_.v6.sin6_addr.s6_addr[7] = 0; - data_.v6.sin6_addr.s6_addr[8] = 0; data_.v6.sin6_addr.s6_addr[9] = 0; - data_.v6.sin6_addr.s6_addr[10] = 0; data_.v6.sin6_addr.s6_addr[11] = 0; - data_.v6.sin6_addr.s6_addr[12] = 0; data_.v6.sin6_addr.s6_addr[13] = 0; - data_.v6.sin6_addr.s6_addr[14] = 0; data_.v6.sin6_addr.s6_addr[15] = 0; - data_.v6.sin6_scope_id = 0; - } -} - -endpoint::endpoint(const asio::ip::address& addr, - unsigned short port_num) - : data_() -{ - using namespace std; // For memcpy. - if (addr.is_v4()) - { - data_.v4.sin_family = ASIO_OS_DEF(AF_INET); - data_.v4.sin_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data_.v4.sin_addr.s_addr = - asio::detail::socket_ops::host_to_network_long( - addr.to_v4().to_uint()); - } - else - { - data_.v6.sin6_family = ASIO_OS_DEF(AF_INET6); - data_.v6.sin6_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data_.v6.sin6_flowinfo = 0; - asio::ip::address_v6 v6_addr = addr.to_v6(); - asio::ip::address_v6::bytes_type bytes = v6_addr.to_bytes(); - memcpy(data_.v6.sin6_addr.s6_addr, bytes.data(), 16); - data_.v6.sin6_scope_id = - static_cast( - v6_addr.scope_id()); - } -} - -void endpoint::resize(std::size_t new_size) -{ - if (new_size > sizeof(asio::detail::sockaddr_storage_type)) - { - asio::error_code ec(asio::error::invalid_argument); - asio::detail::throw_error(ec); - } -} - -unsigned short endpoint::port() const -{ - if (is_v4()) - { - return asio::detail::socket_ops::network_to_host_short( - data_.v4.sin_port); - } - else - { - return asio::detail::socket_ops::network_to_host_short( - data_.v6.sin6_port); - } -} - -void endpoint::port(unsigned short port_num) -{ - if (is_v4()) - { - data_.v4.sin_port - = asio::detail::socket_ops::host_to_network_short(port_num); - } - else - { - data_.v6.sin6_port - = asio::detail::socket_ops::host_to_network_short(port_num); - } -} - -asio::ip::address endpoint::address() const -{ - using namespace std; // For memcpy. - if (is_v4()) - { - return asio::ip::address_v4( - asio::detail::socket_ops::network_to_host_long( - data_.v4.sin_addr.s_addr)); - } - else - { - asio::ip::address_v6::bytes_type bytes; -#if defined(ASIO_HAS_STD_ARRAY) - memcpy(bytes.data(), data_.v6.sin6_addr.s6_addr, 16); -#else // defined(ASIO_HAS_STD_ARRAY) - memcpy(bytes.elems, data_.v6.sin6_addr.s6_addr, 16); -#endif // defined(ASIO_HAS_STD_ARRAY) - return asio::ip::address_v6(bytes, data_.v6.sin6_scope_id); - } -} - -void endpoint::address(const asio::ip::address& addr) -{ - endpoint tmp_endpoint(addr, port()); - data_ = tmp_endpoint.data_; -} - -bool operator==(const endpoint& e1, const endpoint& e2) -{ - return e1.address() == e2.address() && e1.port() == e2.port(); -} - -bool operator<(const endpoint& e1, const endpoint& e2) -{ - if (e1.address() < e2.address()) - return true; - if (e1.address() != e2.address()) - return false; - return e1.port() < e2.port(); -} - -#if !defined(ASIO_NO_IOSTREAM) -std::string endpoint::to_string() const -{ - std::ostringstream tmp_os; - tmp_os.imbue(std::locale::classic()); - if (is_v4()) - tmp_os << address(); - else - tmp_os << '[' << address() << ']'; - tmp_os << ':' << port(); - - return tmp_os.str(); -} -#endif // !defined(ASIO_NO_IOSTREAM) - -} // namespace detail -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_DETAIL_IMPL_ENDPOINT_IPP diff --git a/scout_sdk/asio/asio/ip/detail/socket_option.hpp b/scout_sdk/asio/asio/ip/detail/socket_option.hpp deleted file mode 100644 index 051ef30..0000000 --- a/scout_sdk/asio/asio/ip/detail/socket_option.hpp +++ /dev/null @@ -1,566 +0,0 @@ -// -// detail/socket_option.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_DETAIL_SOCKET_OPTION_HPP -#define ASIO_IP_DETAIL_SOCKET_OPTION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/ip/address.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { -namespace detail { -namespace socket_option { - -// Helper template for implementing multicast enable loopback options. -template -class multicast_enable_loopback -{ -public: -#if defined(__sun) || defined(__osf__) - typedef unsigned char ipv4_value_type; - typedef unsigned char ipv6_value_type; -#elif defined(_AIX) || defined(__hpux) || defined(__QNXNTO__) - typedef unsigned char ipv4_value_type; - typedef unsigned int ipv6_value_type; -#else - typedef int ipv4_value_type; - typedef int ipv6_value_type; -#endif - - // Default constructor. - multicast_enable_loopback() - : ipv4_value_(0), - ipv6_value_(0) - { - } - - // Construct with a specific option value. - explicit multicast_enable_loopback(bool v) - : ipv4_value_(v ? 1 : 0), - ipv6_value_(v ? 1 : 0) - { - } - - // Set the value of the boolean. - multicast_enable_loopback& operator=(bool v) - { - ipv4_value_ = v ? 1 : 0; - ipv6_value_ = v ? 1 : 0; - return *this; - } - - // Get the current value of the boolean. - bool value() const - { - return !!ipv4_value_; - } - - // Convert to bool. - operator bool() const - { - return !!ipv4_value_; - } - - // Test for false. - bool operator!() const - { - return !ipv4_value_; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the boolean data. - template - void* data(const Protocol& protocol) - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the address of the boolean data. - template - const void* data(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the size of the boolean data. - template - std::size_t size(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return sizeof(ipv6_value_); - return sizeof(ipv4_value_); - } - - // Set the size of the boolean data. - template - void resize(const Protocol& protocol, std::size_t s) - { - if (protocol.family() == PF_INET6) - { - if (s != sizeof(ipv6_value_)) - { - std::length_error ex("multicast_enable_loopback socket option resize"); - asio::detail::throw_exception(ex); - } - ipv4_value_ = ipv6_value_ ? 1 : 0; - } - else - { - if (s != sizeof(ipv4_value_)) - { - std::length_error ex("multicast_enable_loopback socket option resize"); - asio::detail::throw_exception(ex); - } - ipv6_value_ = ipv4_value_ ? 1 : 0; - } - } - -private: - ipv4_value_type ipv4_value_; - ipv6_value_type ipv6_value_; -}; - -// Helper template for implementing unicast hops options. -template -class unicast_hops -{ -public: - // Default constructor. - unicast_hops() - : value_(0) - { - } - - // Construct with a specific option value. - explicit unicast_hops(int v) - : value_(v) - { - } - - // Set the value of the option. - unicast_hops& operator=(int v) - { - value_ = v; - return *this; - } - - // Get the current value of the option. - int value() const - { - return value_; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the data. - template - int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the data. - template - const int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - - // Set the size of the data. - template - void resize(const Protocol&, std::size_t s) - { - if (s != sizeof(value_)) - { - std::length_error ex("unicast hops socket option resize"); - asio::detail::throw_exception(ex); - } -#if defined(__hpux) - if (value_ < 0) - value_ = value_ & 0xFF; -#endif - } - -private: - int value_; -}; - -// Helper template for implementing multicast hops options. -template -class multicast_hops -{ -public: -#if defined(ASIO_WINDOWS) && defined(UNDER_CE) - typedef int ipv4_value_type; -#else - typedef unsigned char ipv4_value_type; -#endif - typedef int ipv6_value_type; - - // Default constructor. - multicast_hops() - : ipv4_value_(0), - ipv6_value_(0) - { - } - - // Construct with a specific option value. - explicit multicast_hops(int v) - { - if (v < 0 || v > 255) - { - std::out_of_range ex("multicast hops value out of range"); - asio::detail::throw_exception(ex); - } - ipv4_value_ = (ipv4_value_type)v; - ipv6_value_ = v; - } - - // Set the value of the option. - multicast_hops& operator=(int v) - { - if (v < 0 || v > 255) - { - std::out_of_range ex("multicast hops value out of range"); - asio::detail::throw_exception(ex); - } - ipv4_value_ = (ipv4_value_type)v; - ipv6_value_ = v; - return *this; - } - - // Get the current value of the option. - int value() const - { - return ipv6_value_; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the data. - template - void* data(const Protocol& protocol) - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the address of the data. - template - const void* data(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the size of the data. - template - std::size_t size(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return sizeof(ipv6_value_); - return sizeof(ipv4_value_); - } - - // Set the size of the data. - template - void resize(const Protocol& protocol, std::size_t s) - { - if (protocol.family() == PF_INET6) - { - if (s != sizeof(ipv6_value_)) - { - std::length_error ex("multicast hops socket option resize"); - asio::detail::throw_exception(ex); - } - if (ipv6_value_ < 0) - ipv4_value_ = 0; - else if (ipv6_value_ > 255) - ipv4_value_ = 255; - else - ipv4_value_ = (ipv4_value_type)ipv6_value_; - } - else - { - if (s != sizeof(ipv4_value_)) - { - std::length_error ex("multicast hops socket option resize"); - asio::detail::throw_exception(ex); - } - ipv6_value_ = ipv4_value_; - } - } - -private: - ipv4_value_type ipv4_value_; - ipv6_value_type ipv6_value_; -}; - -// Helper template for implementing ip_mreq-based options. -template -class multicast_request -{ -public: - // Default constructor. - multicast_request() - : ipv4_value_(), // Zero-initialisation gives the "any" address. - ipv6_value_() // Zero-initialisation gives the "any" address. - { - } - - // Construct with multicast address only. - explicit multicast_request(const address& multicast_address) - : ipv4_value_(), // Zero-initialisation gives the "any" address. - ipv6_value_() // Zero-initialisation gives the "any" address. - { - if (multicast_address.is_v6()) - { - using namespace std; // For memcpy. - address_v6 ipv6_address = multicast_address.to_v6(); - address_v6::bytes_type bytes = ipv6_address.to_bytes(); - memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.data(), 16); - ipv6_value_.ipv6mr_interface = ipv6_address.scope_id(); - } - else - { - ipv4_value_.imr_multiaddr.s_addr = - asio::detail::socket_ops::host_to_network_long( - multicast_address.to_v4().to_uint()); - ipv4_value_.imr_interface.s_addr = - asio::detail::socket_ops::host_to_network_long( - address_v4::any().to_uint()); - } - } - - // Construct with multicast address and IPv4 address specifying an interface. - explicit multicast_request(const address_v4& multicast_address, - const address_v4& network_interface = address_v4::any()) - : ipv6_value_() // Zero-initialisation gives the "any" address. - { - ipv4_value_.imr_multiaddr.s_addr = - asio::detail::socket_ops::host_to_network_long( - multicast_address.to_uint()); - ipv4_value_.imr_interface.s_addr = - asio::detail::socket_ops::host_to_network_long( - network_interface.to_uint()); - } - - // Construct with multicast address and IPv6 network interface index. - explicit multicast_request( - const address_v6& multicast_address, - unsigned long network_interface = 0) - : ipv4_value_() // Zero-initialisation gives the "any" address. - { - using namespace std; // For memcpy. - address_v6::bytes_type bytes = multicast_address.to_bytes(); - memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.data(), 16); - if (network_interface) - ipv6_value_.ipv6mr_interface = network_interface; - else - ipv6_value_.ipv6mr_interface = multicast_address.scope_id(); - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the option data. - template - const void* data(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the size of the option data. - template - std::size_t size(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return sizeof(ipv6_value_); - return sizeof(ipv4_value_); - } - -private: - asio::detail::in4_mreq_type ipv4_value_; - asio::detail::in6_mreq_type ipv6_value_; -}; - -// Helper template for implementing options that specify a network interface. -template -class network_interface -{ -public: - // Default constructor. - network_interface() - { - ipv4_value_.s_addr = - asio::detail::socket_ops::host_to_network_long( - address_v4::any().to_uint()); - ipv6_value_ = 0; - } - - // Construct with IPv4 interface. - explicit network_interface(const address_v4& ipv4_interface) - { - ipv4_value_.s_addr = - asio::detail::socket_ops::host_to_network_long( - ipv4_interface.to_uint()); - ipv6_value_ = 0; - } - - // Construct with IPv6 interface. - explicit network_interface(unsigned int ipv6_interface) - { - ipv4_value_.s_addr = - asio::detail::socket_ops::host_to_network_long( - address_v4::any().to_uint()); - ipv6_value_ = ipv6_interface; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the option data. - template - const void* data(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the size of the option data. - template - std::size_t size(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return sizeof(ipv6_value_); - return sizeof(ipv4_value_); - } - -private: - asio::detail::in4_addr_type ipv4_value_; - unsigned int ipv6_value_; -}; - -} // namespace socket_option -} // namespace detail -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_DETAIL_SOCKET_OPTION_HPP diff --git a/scout_sdk/asio/asio/ip/host_name.hpp b/scout_sdk/asio/asio/ip/host_name.hpp deleted file mode 100644 index d06de50..0000000 --- a/scout_sdk/asio/asio/ip/host_name.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// -// ip/host_name.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_HOST_NAME_HPP -#define ASIO_IP_HOST_NAME_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/error_code.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Get the current host name. -ASIO_DECL std::string host_name(); - -/// Get the current host name. -ASIO_DECL std::string host_name(asio::error_code& ec); - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/ip/impl/host_name.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_IP_HOST_NAME_HPP diff --git a/scout_sdk/asio/asio/ip/icmp.hpp b/scout_sdk/asio/asio/ip/icmp.hpp deleted file mode 100644 index 92e1953..0000000 --- a/scout_sdk/asio/asio/ip/icmp.hpp +++ /dev/null @@ -1,115 +0,0 @@ -// -// ip/icmp.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ICMP_HPP -#define ASIO_IP_ICMP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/basic_raw_socket.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Encapsulates the flags needed for ICMP. -/** - * The asio::ip::icmp class contains flags necessary for ICMP sockets. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol, InternetProtocol. - */ -class icmp -{ -public: - /// The type of a ICMP endpoint. - typedef basic_endpoint endpoint; - - /// Construct to represent the IPv4 ICMP protocol. - static icmp v4() - { - return icmp(ASIO_OS_DEF(IPPROTO_ICMP), - ASIO_OS_DEF(AF_INET)); - } - - /// Construct to represent the IPv6 ICMP protocol. - static icmp v6() - { - return icmp(ASIO_OS_DEF(IPPROTO_ICMPV6), - ASIO_OS_DEF(AF_INET6)); - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return ASIO_OS_DEF(SOCK_RAW); - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return protocol_; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// The ICMP socket type. - typedef basic_raw_socket socket; - - /// The ICMP resolver type. - typedef basic_resolver resolver; - - /// Compare two protocols for equality. - friend bool operator==(const icmp& p1, const icmp& p2) - { - return p1.protocol_ == p2.protocol_ && p1.family_ == p2.family_; - } - - /// Compare two protocols for inequality. - friend bool operator!=(const icmp& p1, const icmp& p2) - { - return p1.protocol_ != p2.protocol_ || p1.family_ != p2.family_; - } - -private: - // Construct with a specific family. - explicit icmp(int protocol_id, int protocol_family) - : protocol_(protocol_id), - family_(protocol_family) - { - } - - int protocol_; - int family_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ICMP_HPP diff --git a/scout_sdk/asio/asio/ip/impl/address.hpp b/scout_sdk/asio/asio/ip/impl/address.hpp deleted file mode 100644 index 085b93f..0000000 --- a/scout_sdk/asio/asio/ip/impl/address.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// ip/impl/address.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_ADDRESS_HPP -#define ASIO_IP_IMPL_ADDRESS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -#if !defined(ASIO_NO_DEPRECATED) - -inline address address::from_string(const char* str) -{ - return asio::ip::make_address(str); -} - -inline address address::from_string( - const char* str, asio::error_code& ec) -{ - return asio::ip::make_address(str, ec); -} - -inline address address::from_string(const std::string& str) -{ - return asio::ip::make_address(str); -} - -inline address address::from_string( - const std::string& str, asio::error_code& ec) -{ - return asio::ip::make_address(str, ec); -} - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address& addr) -{ - return os << addr.to_string().c_str(); -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_IP_IMPL_ADDRESS_HPP diff --git a/scout_sdk/asio/asio/ip/impl/address.ipp b/scout_sdk/asio/asio/ip/impl/address.ipp deleted file mode 100644 index 0523071..0000000 --- a/scout_sdk/asio/asio/ip/impl/address.ipp +++ /dev/null @@ -1,234 +0,0 @@ -// -// ip/impl/address.ipp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_ADDRESS_IPP -#define ASIO_IP_IMPL_ADDRESS_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/throw_error.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/error.hpp" -#include "asio/ip/address.hpp" -#include "asio/ip/bad_address_cast.hpp" -#include "asio/system_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -address::address() - : type_(ipv4), - ipv4_address_(), - ipv6_address_() -{ -} - -address::address(const asio::ip::address_v4& ipv4_address) - : type_(ipv4), - ipv4_address_(ipv4_address), - ipv6_address_() -{ -} - -address::address(const asio::ip::address_v6& ipv6_address) - : type_(ipv6), - ipv4_address_(), - ipv6_address_(ipv6_address) -{ -} - -address::address(const address& other) - : type_(other.type_), - ipv4_address_(other.ipv4_address_), - ipv6_address_(other.ipv6_address_) -{ -} - -#if defined(ASIO_HAS_MOVE) -address::address(address&& other) - : type_(other.type_), - ipv4_address_(other.ipv4_address_), - ipv6_address_(other.ipv6_address_) -{ -} -#endif // defined(ASIO_HAS_MOVE) - -address& address::operator=(const address& other) -{ - type_ = other.type_; - ipv4_address_ = other.ipv4_address_; - ipv6_address_ = other.ipv6_address_; - return *this; -} - -#if defined(ASIO_HAS_MOVE) -address& address::operator=(address&& other) -{ - type_ = other.type_; - ipv4_address_ = other.ipv4_address_; - ipv6_address_ = other.ipv6_address_; - return *this; -} -#endif // defined(ASIO_HAS_MOVE) - -address& address::operator=(const asio::ip::address_v4& ipv4_address) -{ - type_ = ipv4; - ipv4_address_ = ipv4_address; - ipv6_address_ = asio::ip::address_v6(); - return *this; -} - -address& address::operator=(const asio::ip::address_v6& ipv6_address) -{ - type_ = ipv6; - ipv4_address_ = asio::ip::address_v4(); - ipv6_address_ = ipv6_address; - return *this; -} - -address make_address(const char* str) -{ - asio::error_code ec; - address addr = make_address(str, ec); - asio::detail::throw_error(ec); - return addr; -} - -address make_address(const char* str, asio::error_code& ec) -{ - asio::ip::address_v6 ipv6_address = - asio::ip::make_address_v6(str, ec); - if (!ec) - return address(ipv6_address); - - asio::ip::address_v4 ipv4_address = - asio::ip::make_address_v4(str, ec); - if (!ec) - return address(ipv4_address); - - return address(); -} - -address make_address(const std::string& str) -{ - return make_address(str.c_str()); -} - -address make_address(const std::string& str, - asio::error_code& ec) -{ - return make_address(str.c_str(), ec); -} - -#if defined(ASIO_HAS_STRING_VIEW) - -address make_address(string_view str) -{ - return make_address(static_cast(str)); -} - -address make_address(string_view str, - asio::error_code& ec) -{ - return make_address(static_cast(str), ec); -} - -#endif // defined(ASIO_HAS_STRING_VIEW) - -asio::ip::address_v4 address::to_v4() const -{ - if (type_ != ipv4) - { - bad_address_cast ex; - asio::detail::throw_exception(ex); - } - return ipv4_address_; -} - -asio::ip::address_v6 address::to_v6() const -{ - if (type_ != ipv6) - { - bad_address_cast ex; - asio::detail::throw_exception(ex); - } - return ipv6_address_; -} - -std::string address::to_string() const -{ - if (type_ == ipv6) - return ipv6_address_.to_string(); - return ipv4_address_.to_string(); -} - -#if !defined(ASIO_NO_DEPRECATED) -std::string address::to_string(asio::error_code& ec) const -{ - if (type_ == ipv6) - return ipv6_address_.to_string(ec); - return ipv4_address_.to_string(ec); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -bool address::is_loopback() const -{ - return (type_ == ipv4) - ? ipv4_address_.is_loopback() - : ipv6_address_.is_loopback(); -} - -bool address::is_unspecified() const -{ - return (type_ == ipv4) - ? ipv4_address_.is_unspecified() - : ipv6_address_.is_unspecified(); -} - -bool address::is_multicast() const -{ - return (type_ == ipv4) - ? ipv4_address_.is_multicast() - : ipv6_address_.is_multicast(); -} - -bool operator==(const address& a1, const address& a2) -{ - if (a1.type_ != a2.type_) - return false; - if (a1.type_ == address::ipv6) - return a1.ipv6_address_ == a2.ipv6_address_; - return a1.ipv4_address_ == a2.ipv4_address_; -} - -bool operator<(const address& a1, const address& a2) -{ - if (a1.type_ < a2.type_) - return true; - if (a1.type_ > a2.type_) - return false; - if (a1.type_ == address::ipv6) - return a1.ipv6_address_ < a2.ipv6_address_; - return a1.ipv4_address_ < a2.ipv4_address_; -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_IMPL_ADDRESS_IPP diff --git a/scout_sdk/asio/asio/ip/impl/address_v4.hpp b/scout_sdk/asio/asio/ip/impl/address_v4.hpp deleted file mode 100644 index d1cf407..0000000 --- a/scout_sdk/asio/asio/ip/impl/address_v4.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// ip/impl/address_v4.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_ADDRESS_V4_HPP -#define ASIO_IP_IMPL_ADDRESS_V4_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -#if !defined(ASIO_NO_DEPRECATED) - -inline address_v4 address_v4::from_string(const char* str) -{ - return asio::ip::make_address_v4(str); -} - -inline address_v4 address_v4::from_string( - const char* str, asio::error_code& ec) -{ - return asio::ip::make_address_v4(str, ec); -} - -inline address_v4 address_v4::from_string(const std::string& str) -{ - return asio::ip::make_address_v4(str); -} - -inline address_v4 address_v4::from_string( - const std::string& str, asio::error_code& ec) -{ - return asio::ip::make_address_v4(str, ec); -} - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address_v4& addr) -{ - return os << addr.to_string().c_str(); -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_IP_IMPL_ADDRESS_V4_HPP diff --git a/scout_sdk/asio/asio/ip/impl/address_v4.ipp b/scout_sdk/asio/asio/ip/impl/address_v4.ipp deleted file mode 100644 index 9559add..0000000 --- a/scout_sdk/asio/asio/ip/impl/address_v4.ipp +++ /dev/null @@ -1,210 +0,0 @@ -// -// ip/impl/address_v4.ipp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_ADDRESS_V4_IPP -#define ASIO_IP_IMPL_ADDRESS_V4_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include "asio/error.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/ip/address_v4.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -address_v4::address_v4(const address_v4::bytes_type& bytes) -{ -#if UCHAR_MAX > 0xFF - if (bytes[0] > 0xFF || bytes[1] > 0xFF - || bytes[2] > 0xFF || bytes[3] > 0xFF) - { - std::out_of_range ex("address_v4 from bytes_type"); - asio::detail::throw_exception(ex); - } -#endif // UCHAR_MAX > 0xFF - - using namespace std; // For memcpy. - memcpy(&addr_.s_addr, bytes.data(), 4); -} - -address_v4::address_v4(address_v4::uint_type addr) -{ - if ((std::numeric_limits::max)() > 0xFFFFFFFF) - { - std::out_of_range ex("address_v4 from unsigned integer"); - asio::detail::throw_exception(ex); - } - - addr_.s_addr = asio::detail::socket_ops::host_to_network_long( - static_cast(addr)); -} - -address_v4::bytes_type address_v4::to_bytes() const -{ - using namespace std; // For memcpy. - bytes_type bytes; -#if defined(ASIO_HAS_STD_ARRAY) - memcpy(bytes.data(), &addr_.s_addr, 4); -#else // defined(ASIO_HAS_STD_ARRAY) - memcpy(bytes.elems, &addr_.s_addr, 4); -#endif // defined(ASIO_HAS_STD_ARRAY) - return bytes; -} - -address_v4::uint_type address_v4::to_uint() const -{ - return asio::detail::socket_ops::network_to_host_long(addr_.s_addr); -} - -#if !defined(ASIO_NO_DEPRECATED) -unsigned long address_v4::to_ulong() const -{ - return asio::detail::socket_ops::network_to_host_long(addr_.s_addr); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -std::string address_v4::to_string() const -{ - asio::error_code ec; - char addr_str[asio::detail::max_addr_v4_str_len]; - const char* addr = - asio::detail::socket_ops::inet_ntop( - ASIO_OS_DEF(AF_INET), &addr_, addr_str, - asio::detail::max_addr_v4_str_len, 0, ec); - if (addr == 0) - asio::detail::throw_error(ec); - return addr; -} - -#if !defined(ASIO_NO_DEPRECATED) -std::string address_v4::to_string(asio::error_code& ec) const -{ - char addr_str[asio::detail::max_addr_v4_str_len]; - const char* addr = - asio::detail::socket_ops::inet_ntop( - ASIO_OS_DEF(AF_INET), &addr_, addr_str, - asio::detail::max_addr_v4_str_len, 0, ec); - if (addr == 0) - return std::string(); - return addr; -} -#endif // !defined(ASIO_NO_DEPRECATED) - -bool address_v4::is_loopback() const -{ - return (to_uint() & 0xFF000000) == 0x7F000000; -} - -bool address_v4::is_unspecified() const -{ - return to_uint() == 0; -} - -#if !defined(ASIO_NO_DEPRECATED) -bool address_v4::is_class_a() const -{ - return (to_uint() & 0x80000000) == 0; -} - -bool address_v4::is_class_b() const -{ - return (to_uint() & 0xC0000000) == 0x80000000; -} - -bool address_v4::is_class_c() const -{ - return (to_uint() & 0xE0000000) == 0xC0000000; -} -#endif // !defined(ASIO_NO_DEPRECATED) - -bool address_v4::is_multicast() const -{ - return (to_uint() & 0xF0000000) == 0xE0000000; -} - -#if !defined(ASIO_NO_DEPRECATED) -address_v4 address_v4::broadcast(const address_v4& addr, const address_v4& mask) -{ - return address_v4(addr.to_uint() | (mask.to_uint() ^ 0xFFFFFFFF)); -} - -address_v4 address_v4::netmask(const address_v4& addr) -{ - if (addr.is_class_a()) - return address_v4(0xFF000000); - if (addr.is_class_b()) - return address_v4(0xFFFF0000); - if (addr.is_class_c()) - return address_v4(0xFFFFFF00); - return address_v4(0xFFFFFFFF); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -address_v4 make_address_v4(const char* str) -{ - asio::error_code ec; - address_v4 addr = make_address_v4(str, ec); - asio::detail::throw_error(ec); - return addr; -} - -address_v4 make_address_v4( - const char* str, asio::error_code& ec) -{ - address_v4::bytes_type bytes; - if (asio::detail::socket_ops::inet_pton( - ASIO_OS_DEF(AF_INET), str, &bytes, 0, ec) <= 0) - return address_v4(); - return address_v4(bytes); -} - -address_v4 make_address_v4(const std::string& str) -{ - return make_address_v4(str.c_str()); -} - -address_v4 make_address_v4( - const std::string& str, asio::error_code& ec) -{ - return make_address_v4(str.c_str(), ec); -} - -#if defined(ASIO_HAS_STRING_VIEW) - -address_v4 make_address_v4(string_view str) -{ - return make_address_v4(static_cast(str)); -} - -address_v4 make_address_v4(string_view str, - asio::error_code& ec) -{ - return make_address_v4(static_cast(str), ec); -} - -#endif // defined(ASIO_HAS_STRING_VIEW) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_IMPL_ADDRESS_V4_IPP diff --git a/scout_sdk/asio/asio/ip/impl/address_v6.hpp b/scout_sdk/asio/asio/ip/impl/address_v6.hpp deleted file mode 100644 index 330eafd..0000000 --- a/scout_sdk/asio/asio/ip/impl/address_v6.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// ip/impl/address_v6.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_ADDRESS_V6_HPP -#define ASIO_IP_IMPL_ADDRESS_V6_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -#if !defined(ASIO_NO_DEPRECATED) - -inline address_v6 address_v6::from_string(const char* str) -{ - return asio::ip::make_address_v6(str); -} - -inline address_v6 address_v6::from_string( - const char* str, asio::error_code& ec) -{ - return asio::ip::make_address_v6(str, ec); -} - -inline address_v6 address_v6::from_string(const std::string& str) -{ - return asio::ip::make_address_v6(str); -} - -inline address_v6 address_v6::from_string( - const std::string& str, asio::error_code& ec) -{ - return asio::ip::make_address_v6(str, ec); -} - -#endif // !defined(ASIO_NO_DEPRECATED) - -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address_v6& addr) -{ - return os << addr.to_string().c_str(); -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_IP_IMPL_ADDRESS_V6_HPP diff --git a/scout_sdk/asio/asio/ip/impl/address_v6.ipp b/scout_sdk/asio/asio/ip/impl/address_v6.ipp deleted file mode 100644 index 36bd68c..0000000 --- a/scout_sdk/asio/asio/ip/impl/address_v6.ipp +++ /dev/null @@ -1,350 +0,0 @@ -// -// ip/impl/address_v6.ipp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_ADDRESS_V6_IPP -#define ASIO_IP_IMPL_ADDRESS_V6_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/error.hpp" -#include "asio/ip/address_v6.hpp" -#include "asio/ip/bad_address_cast.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -address_v6::address_v6() - : addr_(), - scope_id_(0) -{ -} - -address_v6::address_v6(const address_v6::bytes_type& bytes, - unsigned long scope) - : scope_id_(scope) -{ -#if UCHAR_MAX > 0xFF - for (std::size_t i = 0; i < bytes.size(); ++i) - { - if (bytes[i] > 0xFF) - { - std::out_of_range ex("address_v6 from bytes_type"); - asio::detail::throw_exception(ex); - } - } -#endif // UCHAR_MAX > 0xFF - - using namespace std; // For memcpy. - memcpy(addr_.s6_addr, bytes.data(), 16); -} - -address_v6::address_v6(const address_v6& other) - : addr_(other.addr_), - scope_id_(other.scope_id_) -{ -} - -#if defined(ASIO_HAS_MOVE) -address_v6::address_v6(address_v6&& other) - : addr_(other.addr_), - scope_id_(other.scope_id_) -{ -} -#endif // defined(ASIO_HAS_MOVE) - -address_v6& address_v6::operator=(const address_v6& other) -{ - addr_ = other.addr_; - scope_id_ = other.scope_id_; - return *this; -} - -#if defined(ASIO_HAS_MOVE) -address_v6& address_v6::operator=(address_v6&& other) -{ - addr_ = other.addr_; - scope_id_ = other.scope_id_; - return *this; -} -#endif // defined(ASIO_HAS_MOVE) - -address_v6::bytes_type address_v6::to_bytes() const -{ - using namespace std; // For memcpy. - bytes_type bytes; -#if defined(ASIO_HAS_STD_ARRAY) - memcpy(bytes.data(), addr_.s6_addr, 16); -#else // defined(ASIO_HAS_STD_ARRAY) - memcpy(bytes.elems, addr_.s6_addr, 16); -#endif // defined(ASIO_HAS_STD_ARRAY) - return bytes; -} - -std::string address_v6::to_string() const -{ - asio::error_code ec; - char addr_str[asio::detail::max_addr_v6_str_len]; - const char* addr = - asio::detail::socket_ops::inet_ntop( - ASIO_OS_DEF(AF_INET6), &addr_, addr_str, - asio::detail::max_addr_v6_str_len, scope_id_, ec); - if (addr == 0) - asio::detail::throw_error(ec); - return addr; -} - -#if !defined(ASIO_NO_DEPRECATED) -std::string address_v6::to_string(asio::error_code& ec) const -{ - char addr_str[asio::detail::max_addr_v6_str_len]; - const char* addr = - asio::detail::socket_ops::inet_ntop( - ASIO_OS_DEF(AF_INET6), &addr_, addr_str, - asio::detail::max_addr_v6_str_len, scope_id_, ec); - if (addr == 0) - return std::string(); - return addr; -} - -address_v4 address_v6::to_v4() const -{ - if (!is_v4_mapped() && !is_v4_compatible()) - { - bad_address_cast ex; - asio::detail::throw_exception(ex); - } - - address_v4::bytes_type v4_bytes = { { addr_.s6_addr[12], - addr_.s6_addr[13], addr_.s6_addr[14], addr_.s6_addr[15] } }; - return address_v4(v4_bytes); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -bool address_v6::is_loopback() const -{ - return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) - && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) - && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) - && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) - && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) - && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) - && (addr_.s6_addr[12] == 0) && (addr_.s6_addr[13] == 0) - && (addr_.s6_addr[14] == 0) && (addr_.s6_addr[15] == 1)); -} - -bool address_v6::is_unspecified() const -{ - return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) - && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) - && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) - && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) - && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) - && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) - && (addr_.s6_addr[12] == 0) && (addr_.s6_addr[13] == 0) - && (addr_.s6_addr[14] == 0) && (addr_.s6_addr[15] == 0)); -} - -bool address_v6::is_link_local() const -{ - return ((addr_.s6_addr[0] == 0xfe) && ((addr_.s6_addr[1] & 0xc0) == 0x80)); -} - -bool address_v6::is_site_local() const -{ - return ((addr_.s6_addr[0] == 0xfe) && ((addr_.s6_addr[1] & 0xc0) == 0xc0)); -} - -bool address_v6::is_v4_mapped() const -{ - return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) - && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) - && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) - && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) - && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) - && (addr_.s6_addr[10] == 0xff) && (addr_.s6_addr[11] == 0xff)); -} - -#if !defined(ASIO_NO_DEPRECATED) -bool address_v6::is_v4_compatible() const -{ - return ((addr_.s6_addr[0] == 0) && (addr_.s6_addr[1] == 0) - && (addr_.s6_addr[2] == 0) && (addr_.s6_addr[3] == 0) - && (addr_.s6_addr[4] == 0) && (addr_.s6_addr[5] == 0) - && (addr_.s6_addr[6] == 0) && (addr_.s6_addr[7] == 0) - && (addr_.s6_addr[8] == 0) && (addr_.s6_addr[9] == 0) - && (addr_.s6_addr[10] == 0) && (addr_.s6_addr[11] == 0) - && !((addr_.s6_addr[12] == 0) - && (addr_.s6_addr[13] == 0) - && (addr_.s6_addr[14] == 0) - && ((addr_.s6_addr[15] == 0) || (addr_.s6_addr[15] == 1)))); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -bool address_v6::is_multicast() const -{ - return (addr_.s6_addr[0] == 0xff); -} - -bool address_v6::is_multicast_global() const -{ - return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x0e)); -} - -bool address_v6::is_multicast_link_local() const -{ - return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x02)); -} - -bool address_v6::is_multicast_node_local() const -{ - return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x01)); -} - -bool address_v6::is_multicast_org_local() const -{ - return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x08)); -} - -bool address_v6::is_multicast_site_local() const -{ - return ((addr_.s6_addr[0] == 0xff) && ((addr_.s6_addr[1] & 0x0f) == 0x05)); -} - -bool operator==(const address_v6& a1, const address_v6& a2) -{ - using namespace std; // For memcmp. - return memcmp(&a1.addr_, &a2.addr_, - sizeof(asio::detail::in6_addr_type)) == 0 - && a1.scope_id_ == a2.scope_id_; -} - -bool operator<(const address_v6& a1, const address_v6& a2) -{ - using namespace std; // For memcmp. - int memcmp_result = memcmp(&a1.addr_, &a2.addr_, - sizeof(asio::detail::in6_addr_type)); - if (memcmp_result < 0) - return true; - if (memcmp_result > 0) - return false; - return a1.scope_id_ < a2.scope_id_; -} - -address_v6 address_v6::loopback() -{ - address_v6 tmp; - tmp.addr_.s6_addr[15] = 1; - return tmp; -} - -#if !defined(ASIO_NO_DEPRECATED) -address_v6 address_v6::v4_mapped(const address_v4& addr) -{ - address_v4::bytes_type v4_bytes = addr.to_bytes(); - bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, - v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; - return address_v6(v6_bytes); -} - -address_v6 address_v6::v4_compatible(const address_v4& addr) -{ - address_v4::bytes_type v4_bytes = addr.to_bytes(); - bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; - return address_v6(v6_bytes); -} -#endif // !defined(ASIO_NO_DEPRECATED) - -address_v6 make_address_v6(const char* str) -{ - asio::error_code ec; - address_v6 addr = make_address_v6(str, ec); - asio::detail::throw_error(ec); - return addr; -} - -address_v6 make_address_v6( - const char* str, asio::error_code& ec) -{ - address_v6::bytes_type bytes; - unsigned long scope_id = 0; - if (asio::detail::socket_ops::inet_pton( - ASIO_OS_DEF(AF_INET6), str, &bytes[0], &scope_id, ec) <= 0) - return address_v6(); - return address_v6(bytes, scope_id); -} - -address_v6 make_address_v6(const std::string& str) -{ - return make_address_v6(str.c_str()); -} - -address_v6 make_address_v6( - const std::string& str, asio::error_code& ec) -{ - return make_address_v6(str.c_str(), ec); -} - -#if defined(ASIO_HAS_STRING_VIEW) - -address_v6 make_address_v6(string_view str) -{ - return make_address_v6(static_cast(str)); -} - -address_v6 make_address_v6(string_view str, - asio::error_code& ec) -{ - return make_address_v6(static_cast(str), ec); -} - -#endif // defined(ASIO_HAS_STRING_VIEW) - -address_v4 make_address_v4( - v4_mapped_t, const address_v6& v6_addr) -{ - if (!v6_addr.is_v4_mapped()) - { - bad_address_cast ex; - asio::detail::throw_exception(ex); - } - - address_v6::bytes_type v6_bytes = v6_addr.to_bytes(); - address_v4::bytes_type v4_bytes = { { v6_bytes[12], - v6_bytes[13], v6_bytes[14], v6_bytes[15] } }; - return address_v4(v4_bytes); -} - -address_v6 make_address_v6( - v4_mapped_t, const address_v4& v4_addr) -{ - address_v4::bytes_type v4_bytes = v4_addr.to_bytes(); - address_v6::bytes_type v6_bytes = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0xFF, 0xFF, v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] } }; - return address_v6(v6_bytes); -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_IMPL_ADDRESS_V6_IPP diff --git a/scout_sdk/asio/asio/ip/impl/basic_endpoint.hpp b/scout_sdk/asio/asio/ip/impl/basic_endpoint.hpp deleted file mode 100644 index 5680a43..0000000 --- a/scout_sdk/asio/asio/ip/impl/basic_endpoint.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// ip/impl/basic_endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_BASIC_ENDPOINT_HPP -#define ASIO_IP_IMPL_BASIC_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template -std::basic_ostream& operator<<( - std::basic_ostream& os, - const basic_endpoint& endpoint) -{ - asio::ip::detail::endpoint tmp_ep(endpoint.address(), endpoint.port()); - return os << tmp_ep.to_string().c_str(); -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_IP_IMPL_BASIC_ENDPOINT_HPP diff --git a/scout_sdk/asio/asio/ip/impl/host_name.ipp b/scout_sdk/asio/asio/ip/impl/host_name.ipp deleted file mode 100644 index 932ab1c..0000000 --- a/scout_sdk/asio/asio/ip/impl/host_name.ipp +++ /dev/null @@ -1,54 +0,0 @@ -// -// ip/impl/host_name.ipp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_HOST_NAME_IPP -#define ASIO_IP_IMPL_HOST_NAME_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/winsock_init.hpp" -#include "asio/ip/host_name.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -std::string host_name() -{ - char name[1024]; - asio::error_code ec; - if (asio::detail::socket_ops::gethostname(name, sizeof(name), ec) != 0) - { - asio::detail::throw_error(ec); - return std::string(); - } - return std::string(name); -} - -std::string host_name(asio::error_code& ec) -{ - char name[1024]; - if (asio::detail::socket_ops::gethostname(name, sizeof(name), ec) != 0) - return std::string(); - return std::string(name); -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_IMPL_HOST_NAME_IPP diff --git a/scout_sdk/asio/asio/ip/impl/network_v4.hpp b/scout_sdk/asio/asio/ip/impl/network_v4.hpp deleted file mode 100644 index 911a45c..0000000 --- a/scout_sdk/asio/asio/ip/impl/network_v4.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// ip/impl/network_v4.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_NETWORK_V4_HPP -#define ASIO_IP_IMPL_NETWORK_V4_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const network_v4& addr) -{ - asio::error_code ec; - std::string s = addr.to_string(ec); - if (ec) - { - if (os.exceptions() & std::basic_ostream::failbit) - asio::detail::throw_error(ec); - else - os.setstate(std::basic_ostream::failbit); - } - else - for (std::string::iterator i = s.begin(); i != s.end(); ++i) - os << os.widen(*i); - return os; -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_IP_IMPL_NETWORK_V4_HPP diff --git a/scout_sdk/asio/asio/ip/impl/network_v4.ipp b/scout_sdk/asio/asio/ip/impl/network_v4.ipp deleted file mode 100644 index 4b27887..0000000 --- a/scout_sdk/asio/asio/ip/impl/network_v4.ipp +++ /dev/null @@ -1,216 +0,0 @@ -// -// ip/impl/network_v4.ipp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_NETWORK_V4_IPP -#define ASIO_IP_IMPL_NETWORK_V4_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include -#include "asio/error.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/ip/network_v4.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -network_v4::network_v4(const address_v4& addr, unsigned short prefix_len) - : address_(addr), - prefix_length_(prefix_len) -{ - if (prefix_len > 32) - { - std::out_of_range ex("prefix length too large"); - asio::detail::throw_exception(ex); - } -} - -network_v4::network_v4(const address_v4& addr, const address_v4& mask) - : address_(addr), - prefix_length_(0) -{ - address_v4::bytes_type mask_bytes = mask.to_bytes(); - bool finished = false; - for (std::size_t i = 0; i < mask_bytes.size(); ++i) - { - if (finished) - { - if (mask_bytes[i]) - { - std::invalid_argument ex("non-contiguous netmask"); - asio::detail::throw_exception(ex); - } - continue; - } - else - { - switch (mask_bytes[i]) - { - case 255: - prefix_length_ += 8; - break; - case 254: // prefix_length_ += 7 - prefix_length_ += 1; - case 252: // prefix_length_ += 6 - prefix_length_ += 1; - case 248: // prefix_length_ += 5 - prefix_length_ += 1; - case 240: // prefix_length_ += 4 - prefix_length_ += 1; - case 224: // prefix_length_ += 3 - prefix_length_ += 1; - case 192: // prefix_length_ += 2 - prefix_length_ += 1; - case 128: // prefix_length_ += 1 - prefix_length_ += 1; - case 0: // nbits += 0 - finished = true; - break; - default: - std::out_of_range ex("non-contiguous netmask"); - asio::detail::throw_exception(ex); - } - } - } -} - -address_v4 network_v4::netmask() const ASIO_NOEXCEPT -{ - uint32_t nmbits = 0xffffffff; - if (prefix_length_ == 0) - nmbits = 0; - else - nmbits = nmbits << (32 - prefix_length_); - return address_v4(nmbits); -} - -address_v4_range network_v4::hosts() const ASIO_NOEXCEPT -{ - return is_host() - ? address_v4_range(address_, address_v4(address_.to_uint() + 1)) - : address_v4_range(address_v4(network().to_uint() + 1), broadcast()); -} - -bool network_v4::is_subnet_of(const network_v4& other) const -{ - if (other.prefix_length_ >= prefix_length_) - return false; // Only real subsets are allowed. - const network_v4 me(address_, other.prefix_length_); - return other.canonical() == me.canonical(); -} - -std::string network_v4::to_string() const -{ - asio::error_code ec; - std::string addr = to_string(ec); - asio::detail::throw_error(ec); - return addr; -} - -std::string network_v4::to_string(asio::error_code& ec) const -{ - using namespace std; // For sprintf. - ec = asio::error_code(); - char prefix_len[16]; -#if defined(ASIO_HAS_SECURE_RTL) - sprintf_s(prefix_len, sizeof(prefix_len), "/%u", prefix_length_); -#else // defined(ASIO_HAS_SECURE_RTL) - sprintf(prefix_len, "/%u", prefix_length_); -#endif // defined(ASIO_HAS_SECURE_RTL) - return address_.to_string() + prefix_len; -} - -network_v4 make_network_v4(const char* str) -{ - return make_network_v4(std::string(str)); -} - -network_v4 make_network_v4(const char* str, asio::error_code& ec) -{ - return make_network_v4(std::string(str), ec); -} - -network_v4 make_network_v4(const std::string& str) -{ - asio::error_code ec; - network_v4 net = make_network_v4(str, ec); - asio::detail::throw_error(ec); - return net; -} - -network_v4 make_network_v4(const std::string& str, - asio::error_code& ec) -{ - std::string::size_type pos = str.find_first_of("/"); - - if (pos == std::string::npos) - { - ec = asio::error::invalid_argument; - return network_v4(); - } - - if (pos == str.size() - 1) - { - ec = asio::error::invalid_argument; - return network_v4(); - } - - std::string::size_type end = str.find_first_not_of("0123456789", pos + 1); - if (end != std::string::npos) - { - ec = asio::error::invalid_argument; - return network_v4(); - } - - const address_v4 addr = make_address_v4(str.substr(0, pos), ec); - if (ec) - return network_v4(); - - const int prefix_len = std::atoi(str.substr(pos + 1).c_str()); - if (prefix_len < 0 || prefix_len > 32) - { - ec = asio::error::invalid_argument; - return network_v4(); - } - - return network_v4(addr, static_cast(prefix_len)); -} - -#if defined(ASIO_HAS_STRING_VIEW) - -network_v4 make_network_v4(string_view str) -{ - return make_network_v4(static_cast(str)); -} - -network_v4 make_network_v4(string_view str, - asio::error_code& ec) -{ - return make_network_v4(static_cast(str), ec); -} - -#endif // defined(ASIO_HAS_STRING_VIEW) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_IMPL_NETWORK_V4_IPP diff --git a/scout_sdk/asio/asio/ip/impl/network_v6.hpp b/scout_sdk/asio/asio/ip/impl/network_v6.hpp deleted file mode 100644 index b0eedad..0000000 --- a/scout_sdk/asio/asio/ip/impl/network_v6.hpp +++ /dev/null @@ -1,53 +0,0 @@ -// -// ip/impl/network_v6.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_NETWORK_V6_HPP -#define ASIO_IP_IMPL_NETWORK_V6_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#if !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const network_v6& addr) -{ - asio::error_code ec; - std::string s = addr.to_string(ec); - if (ec) - { - if (os.exceptions() & std::basic_ostream::failbit) - asio::detail::throw_error(ec); - else - os.setstate(std::basic_ostream::failbit); - } - else - for (std::string::iterator i = s.begin(); i != s.end(); ++i) - os << os.widen(*i); - return os; -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_IP_IMPL_NETWORK_V6_HPP diff --git a/scout_sdk/asio/asio/ip/impl/network_v6.ipp b/scout_sdk/asio/asio/ip/impl/network_v6.ipp deleted file mode 100644 index 2e37a99..0000000 --- a/scout_sdk/asio/asio/ip/impl/network_v6.ipp +++ /dev/null @@ -1,185 +0,0 @@ -// -// ip/impl/network_v6.ipp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_IMPL_NETWORK_V6_IPP -#define ASIO_IP_IMPL_NETWORK_V6_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include -#include -#include "asio/error.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/throw_exception.hpp" -#include "asio/ip/network_v6.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -network_v6::network_v6(const address_v6& addr, unsigned short prefix_len) - : address_(addr), - prefix_length_(prefix_len) -{ - if (prefix_len > 128) - { - std::out_of_range ex("prefix length too large"); - asio::detail::throw_exception(ex); - } -} - -ASIO_DECL address_v6 network_v6::network() const ASIO_NOEXCEPT -{ - address_v6::bytes_type bytes(address_.to_bytes()); - for (std::size_t i = 0; i < 16; ++i) - { - if (prefix_length_ <= i * 8) - bytes[i] = 0; - else if (prefix_length_ < (i + 1) * 8) - bytes[i] &= 0xFF00 >> (prefix_length_ % 8); - } - return address_v6(bytes, address_.scope_id()); -} - -address_v6_range network_v6::hosts() const ASIO_NOEXCEPT -{ - address_v6::bytes_type begin_bytes(address_.to_bytes()); - address_v6::bytes_type end_bytes(address_.to_bytes()); - for (std::size_t i = 0; i < 16; ++i) - { - if (prefix_length_ <= i * 8) - { - begin_bytes[i] = 0; - end_bytes[i] = 0xFF; - } - else if (prefix_length_ < (i + 1) * 8) - { - begin_bytes[i] &= 0xFF00 >> (prefix_length_ % 8); - end_bytes[i] |= 0xFF >> (prefix_length_ % 8); - } - } - return address_v6_range( - address_v6_iterator(address_v6(begin_bytes, address_.scope_id())), - ++address_v6_iterator(address_v6(end_bytes, address_.scope_id()))); -} - -bool network_v6::is_subnet_of(const network_v6& other) const -{ - if (other.prefix_length_ >= prefix_length_) - return false; // Only real subsets are allowed. - const network_v6 me(address_, other.prefix_length_); - return other.canonical() == me.canonical(); -} - -std::string network_v6::to_string() const -{ - asio::error_code ec; - std::string addr = to_string(ec); - asio::detail::throw_error(ec); - return addr; -} - -std::string network_v6::to_string(asio::error_code& ec) const -{ - using namespace std; // For sprintf. - ec = asio::error_code(); - char prefix_len[16]; -#if defined(ASIO_HAS_SECURE_RTL) - sprintf_s(prefix_len, sizeof(prefix_len), "/%u", prefix_length_); -#else // defined(ASIO_HAS_SECURE_RTL) - sprintf(prefix_len, "/%u", prefix_length_); -#endif // defined(ASIO_HAS_SECURE_RTL) - return address_.to_string() + prefix_len; -} - -network_v6 make_network_v6(const char* str) -{ - return make_network_v6(std::string(str)); -} - -network_v6 make_network_v6(const char* str, asio::error_code& ec) -{ - return make_network_v6(std::string(str), ec); -} - -network_v6 make_network_v6(const std::string& str) -{ - asio::error_code ec; - network_v6 net = make_network_v6(str, ec); - asio::detail::throw_error(ec); - return net; -} - -network_v6 make_network_v6(const std::string& str, - asio::error_code& ec) -{ - std::string::size_type pos = str.find_first_of("/"); - - if (pos == std::string::npos) - { - ec = asio::error::invalid_argument; - return network_v6(); - } - - if (pos == str.size() - 1) - { - ec = asio::error::invalid_argument; - return network_v6(); - } - - std::string::size_type end = str.find_first_not_of("0123456789", pos + 1); - if (end != std::string::npos) - { - ec = asio::error::invalid_argument; - return network_v6(); - } - - const address_v6 addr = make_address_v6(str.substr(0, pos), ec); - if (ec) - return network_v6(); - - const int prefix_len = std::atoi(str.substr(pos + 1).c_str()); - if (prefix_len < 0 || prefix_len > 128) - { - ec = asio::error::invalid_argument; - return network_v6(); - } - - return network_v6(addr, static_cast(prefix_len)); -} - -#if defined(ASIO_HAS_STRING_VIEW) - -network_v6 make_network_v6(string_view str) -{ - return make_network_v6(static_cast(str)); -} - -network_v6 make_network_v6(string_view str, - asio::error_code& ec) -{ - return make_network_v6(static_cast(str), ec); -} - -#endif // defined(ASIO_HAS_STRING_VIEW) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_IMPL_NETWORK_V6_IPP diff --git a/scout_sdk/asio/asio/ip/multicast.hpp b/scout_sdk/asio/asio/ip/multicast.hpp deleted file mode 100644 index ea624e1..0000000 --- a/scout_sdk/asio/asio/ip/multicast.hpp +++ /dev/null @@ -1,191 +0,0 @@ -// -// ip/multicast.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_MULTICAST_HPP -#define ASIO_IP_MULTICAST_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/ip/detail/socket_option.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { -namespace multicast { - -/// Socket option to join a multicast group on a specified interface. -/** - * Implements the IPPROTO_IP/IP_ADD_MEMBERSHIP socket option. - * - * @par Examples - * Setting the option to join a multicast group: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::address multicast_address = - * asio::ip::address::from_string("225.0.0.1"); - * asio::ip::multicast::join_group option(multicast_address); - * socket.set_option(option); - * @endcode - * - * @par Concepts: - * SettableSocketOption. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined join_group; -#else -typedef asio::ip::detail::socket_option::multicast_request< - ASIO_OS_DEF(IPPROTO_IP), - ASIO_OS_DEF(IP_ADD_MEMBERSHIP), - ASIO_OS_DEF(IPPROTO_IPV6), - ASIO_OS_DEF(IPV6_JOIN_GROUP)> join_group; -#endif - -/// Socket option to leave a multicast group on a specified interface. -/** - * Implements the IPPROTO_IP/IP_DROP_MEMBERSHIP socket option. - * - * @par Examples - * Setting the option to leave a multicast group: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::address multicast_address = - * asio::ip::address::from_string("225.0.0.1"); - * asio::ip::multicast::leave_group option(multicast_address); - * socket.set_option(option); - * @endcode - * - * @par Concepts: - * SettableSocketOption. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined leave_group; -#else -typedef asio::ip::detail::socket_option::multicast_request< - ASIO_OS_DEF(IPPROTO_IP), - ASIO_OS_DEF(IP_DROP_MEMBERSHIP), - ASIO_OS_DEF(IPPROTO_IPV6), - ASIO_OS_DEF(IPV6_LEAVE_GROUP)> leave_group; -#endif - -/// Socket option for local interface to use for outgoing multicast packets. -/** - * Implements the IPPROTO_IP/IP_MULTICAST_IF socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::address_v4 local_interface = - * asio::ip::address_v4::from_string("1.2.3.4"); - * asio::ip::multicast::outbound_interface option(local_interface); - * socket.set_option(option); - * @endcode - * - * @par Concepts: - * SettableSocketOption. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined outbound_interface; -#else -typedef asio::ip::detail::socket_option::network_interface< - ASIO_OS_DEF(IPPROTO_IP), - ASIO_OS_DEF(IP_MULTICAST_IF), - ASIO_OS_DEF(IPPROTO_IPV6), - ASIO_OS_DEF(IPV6_MULTICAST_IF)> outbound_interface; -#endif - -/// Socket option for time-to-live associated with outgoing multicast packets. -/** - * Implements the IPPROTO_IP/IP_MULTICAST_TTL socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::multicast::hops option(4); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::multicast::hops option; - * socket.get_option(option); - * int ttl = option.value(); - * @endcode - * - * @par Concepts: - * GettableSocketOption, SettableSocketOption. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined hops; -#else -typedef asio::ip::detail::socket_option::multicast_hops< - ASIO_OS_DEF(IPPROTO_IP), - ASIO_OS_DEF(IP_MULTICAST_TTL), - ASIO_OS_DEF(IPPROTO_IPV6), - ASIO_OS_DEF(IPV6_MULTICAST_HOPS)> hops; -#endif - -/// Socket option determining whether outgoing multicast packets will be -/// received on the same socket if it is a member of the multicast group. -/** - * Implements the IPPROTO_IP/IP_MULTICAST_LOOP socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::multicast::enable_loopback option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::multicast::enable_loopback option; - * socket.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * GettableSocketOption, SettableSocketOption. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined enable_loopback; -#else -typedef asio::ip::detail::socket_option::multicast_enable_loopback< - ASIO_OS_DEF(IPPROTO_IP), - ASIO_OS_DEF(IP_MULTICAST_LOOP), - ASIO_OS_DEF(IPPROTO_IPV6), - ASIO_OS_DEF(IPV6_MULTICAST_LOOP)> enable_loopback; -#endif - -} // namespace multicast -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_MULTICAST_HPP diff --git a/scout_sdk/asio/asio/ip/network_v4.hpp b/scout_sdk/asio/asio/ip/network_v4.hpp deleted file mode 100644 index e38f60f..0000000 --- a/scout_sdk/asio/asio/ip/network_v4.hpp +++ /dev/null @@ -1,261 +0,0 @@ -// -// ip/network_v4.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_NETWORK_V4_HPP -#define ASIO_IP_NETWORK_V4_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/string_view.hpp" -#include "asio/error_code.hpp" -#include "asio/ip/address_v4_range.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Represents an IPv4 network. -/** - * The asio::ip::network_v4 class provides the ability to use and - * manipulate IP version 4 networks. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class network_v4 -{ -public: - /// Default constructor. - network_v4() ASIO_NOEXCEPT - : address_(), - prefix_length_(0) - { - } - - /// Construct a network based on the specified address and prefix length. - ASIO_DECL network_v4(const address_v4& addr, - unsigned short prefix_len); - - /// Construct network based on the specified address and netmask. - ASIO_DECL network_v4(const address_v4& addr, - const address_v4& mask); - - /// Copy constructor. - network_v4(const network_v4& other) ASIO_NOEXCEPT - : address_(other.address_), - prefix_length_(other.prefix_length_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - network_v4(network_v4&& other) ASIO_NOEXCEPT - : address_(ASIO_MOVE_CAST(address_v4)(other.address_)), - prefix_length_(other.prefix_length_) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from another network. - network_v4& operator=(const network_v4& other) ASIO_NOEXCEPT - { - address_ = other.address_; - prefix_length_ = other.prefix_length_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move-assign from another network. - network_v4& operator=(network_v4&& other) ASIO_NOEXCEPT - { - address_ = ASIO_MOVE_CAST(address_v4)(other.address_); - prefix_length_ = other.prefix_length_; - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// Obtain the address object specified when the network object was created. - address_v4 address() const ASIO_NOEXCEPT - { - return address_; - } - - /// Obtain the prefix length that was specified when the network object was - /// created. - unsigned short prefix_length() const ASIO_NOEXCEPT - { - return prefix_length_; - } - - /// Obtain the netmask that was specified when the network object was created. - ASIO_DECL address_v4 netmask() const ASIO_NOEXCEPT; - - /// Obtain an address object that represents the network address. - address_v4 network() const ASIO_NOEXCEPT - { - return address_v4(address_.to_uint() & netmask().to_uint()); - } - - /// Obtain an address object that represents the network's broadcast address. - address_v4 broadcast() const ASIO_NOEXCEPT - { - return address_v4(network().to_uint() | (netmask().to_uint() ^ 0xFFFFFFFF)); - } - - /// Obtain an address range corresponding to the hosts in the network. - ASIO_DECL address_v4_range hosts() const ASIO_NOEXCEPT; - - /// Obtain the true network address, omitting any host bits. - network_v4 canonical() const ASIO_NOEXCEPT - { - return network_v4(network(), netmask()); - } - - /// Test if network is a valid host address. - bool is_host() const ASIO_NOEXCEPT - { - return prefix_length_ == 32; - } - - /// Test if a network is a real subnet of another network. - ASIO_DECL bool is_subnet_of(const network_v4& other) const; - - /// Get the network as an address in dotted decimal format. - ASIO_DECL std::string to_string() const; - - /// Get the network as an address in dotted decimal format. - ASIO_DECL std::string to_string(asio::error_code& ec) const; - - /// Compare two networks for equality. - friend bool operator==(const network_v4& a, const network_v4& b) - { - return a.address_ == b.address_ && a.prefix_length_ == b.prefix_length_; - } - - /// Compare two networks for inequality. - friend bool operator!=(const network_v4& a, const network_v4& b) - { - return !(a == b); - } - -private: - address_v4 address_; - unsigned short prefix_length_; -}; - -/// Create an IPv4 network from an address and prefix length. -/** - * @relates address_v4 - */ -inline network_v4 make_network_v4( - const address_v4& addr, unsigned short prefix_len) -{ - return network_v4(addr, prefix_len); -} - -/// Create an IPv4 network from an address and netmask. -/** - * @relates address_v4 - */ -inline network_v4 make_network_v4( - const address_v4& addr, const address_v4& mask) -{ - return network_v4(addr, mask); -} - -/// Create an IPv4 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v4 - */ -ASIO_DECL network_v4 make_network_v4(const char* str); - -/// Create an IPv4 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v4 - */ -ASIO_DECL network_v4 make_network_v4( - const char* str, asio::error_code& ec); - -/// Create an IPv4 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v4 - */ -ASIO_DECL network_v4 make_network_v4(const std::string& str); - -/// Create an IPv4 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v4 - */ -ASIO_DECL network_v4 make_network_v4( - const std::string& str, asio::error_code& ec); - -#if defined(ASIO_HAS_STRING_VIEW) \ - || defined(GENERATING_DOCUMENTATION) - -/// Create an IPv4 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v4 - */ -ASIO_DECL network_v4 make_network_v4(string_view str); - -/// Create an IPv4 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v4 - */ -ASIO_DECL network_v4 make_network_v4( - string_view str, asio::error_code& ec); - -#endif // defined(ASIO_HAS_STRING_VIEW) - // || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_NO_IOSTREAM) - -/// Output a network as a string. -/** - * Used to output a human-readable string for a specified network. - * - * @param os The output stream to which the string will be written. - * - * @param net The network to be written. - * - * @return The output stream. - * - * @relates asio::ip::address_v4 - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const network_v4& net); - -#endif // !defined(ASIO_NO_IOSTREAM) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/impl/network_v4.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/ip/impl/network_v4.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_IP_NETWORK_V4_HPP diff --git a/scout_sdk/asio/asio/ip/network_v6.hpp b/scout_sdk/asio/asio/ip/network_v6.hpp deleted file mode 100644 index 7b6b7e6..0000000 --- a/scout_sdk/asio/asio/ip/network_v6.hpp +++ /dev/null @@ -1,235 +0,0 @@ -// -// ip/network_v6.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2014 Oliver Kowalke (oliver dot kowalke at gmail dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_NETWORK_V6_HPP -#define ASIO_IP_NETWORK_V6_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/string_view.hpp" -#include "asio/error_code.hpp" -#include "asio/ip/address_v6_range.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Represents an IPv6 network. -/** - * The asio::ip::network_v6 class provides the ability to use and - * manipulate IP version 6 networks. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class network_v6 -{ -public: - /// Default constructor. - network_v6() ASIO_NOEXCEPT - : address_(), - prefix_length_(0) - { - } - - /// Construct a network based on the specified address and prefix length. - ASIO_DECL network_v6(const address_v6& addr, - unsigned short prefix_len); - - /// Copy constructor. - network_v6(const network_v6& other) ASIO_NOEXCEPT - : address_(other.address_), - prefix_length_(other.prefix_length_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - network_v6(network_v6&& other) ASIO_NOEXCEPT - : address_(ASIO_MOVE_CAST(address_v6)(other.address_)), - prefix_length_(other.prefix_length_) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from another network. - network_v6& operator=(const network_v6& other) ASIO_NOEXCEPT - { - address_ = other.address_; - prefix_length_ = other.prefix_length_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move-assign from another network. - network_v6& operator=(network_v6&& other) ASIO_NOEXCEPT - { - address_ = ASIO_MOVE_CAST(address_v6)(other.address_); - prefix_length_ = other.prefix_length_; - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// Obtain the address object specified when the network object was created. - address_v6 address() const ASIO_NOEXCEPT - { - return address_; - } - - /// Obtain the prefix length that was specified when the network object was - /// created. - unsigned short prefix_length() const ASIO_NOEXCEPT - { - return prefix_length_; - } - - /// Obtain an address object that represents the network address. - ASIO_DECL address_v6 network() const ASIO_NOEXCEPT; - - /// Obtain an address range corresponding to the hosts in the network. - ASIO_DECL address_v6_range hosts() const ASIO_NOEXCEPT; - - /// Obtain the true network address, omitting any host bits. - network_v6 canonical() const ASIO_NOEXCEPT - { - return network_v6(network(), prefix_length()); - } - - /// Test if network is a valid host address. - bool is_host() const ASIO_NOEXCEPT - { - return prefix_length_ == 128; - } - - /// Test if a network is a real subnet of another network. - ASIO_DECL bool is_subnet_of(const network_v6& other) const; - - /// Get the network as an address in dotted decimal format. - ASIO_DECL std::string to_string() const; - - /// Get the network as an address in dotted decimal format. - ASIO_DECL std::string to_string(asio::error_code& ec) const; - - /// Compare two networks for equality. - friend bool operator==(const network_v6& a, const network_v6& b) - { - return a.address_ == b.address_ && a.prefix_length_ == b.prefix_length_; - } - - /// Compare two networks for inequality. - friend bool operator!=(const network_v6& a, const network_v6& b) - { - return !(a == b); - } - -private: - address_v6 address_; - unsigned short prefix_length_; -}; - -/// Create an IPv6 network from an address and prefix length. -/** - * @relates address_v6 - */ -inline network_v6 make_network_v6( - const address_v6& addr, unsigned short prefix_len) -{ - return network_v6(addr, prefix_len); -} - -/// Create an IPv6 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v6 - */ -ASIO_DECL network_v6 make_network_v6(const char* str); - -/// Create an IPv6 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v6 - */ -ASIO_DECL network_v6 make_network_v6( - const char* str, asio::error_code& ec); - -/// Create an IPv6 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v6 - */ -ASIO_DECL network_v6 make_network_v6(const std::string& str); - -/// Create an IPv6 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v6 - */ -ASIO_DECL network_v6 make_network_v6( - const std::string& str, asio::error_code& ec); - -#if defined(ASIO_HAS_STRING_VIEW) \ - || defined(GENERATING_DOCUMENTATION) - -/// Create an IPv6 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v6 - */ -ASIO_DECL network_v6 make_network_v6(string_view str); - -/// Create an IPv6 network from a string containing IP address and prefix -/// length. -/** - * @relates network_v6 - */ -ASIO_DECL network_v6 make_network_v6( - string_view str, asio::error_code& ec); - -#endif // defined(ASIO_HAS_STRING_VIEW) - // || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_NO_IOSTREAM) - -/// Output a network as a string. -/** - * Used to output a human-readable string for a specified network. - * - * @param os The output stream to which the string will be written. - * - * @param net The network to be written. - * - * @return The output stream. - * - * @relates asio::ip::address_v6 - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const network_v6& net); - -#endif // !defined(ASIO_NO_IOSTREAM) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/impl/network_v6.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/ip/impl/network_v6.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_IP_NETWORK_V6_HPP diff --git a/scout_sdk/asio/asio/ip/resolver_base.hpp b/scout_sdk/asio/asio/ip/resolver_base.hpp deleted file mode 100644 index d32c911..0000000 --- a/scout_sdk/asio/asio/ip/resolver_base.hpp +++ /dev/null @@ -1,129 +0,0 @@ -// -// ip/resolver_base.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_RESOLVER_BASE_HPP -#define ASIO_IP_RESOLVER_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// The resolver_base class is used as a base for the basic_resolver class -/// templates to provide a common place to define the flag constants. -class resolver_base -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// A bitmask type (C++ Std [lib.bitmask.types]). - typedef unspecified flags; - - /// Determine the canonical name of the host specified in the query. - static const flags canonical_name = implementation_defined; - - /// Indicate that returned endpoint is intended for use as a locally bound - /// socket endpoint. - static const flags passive = implementation_defined; - - /// Host name should be treated as a numeric string defining an IPv4 or IPv6 - /// address and no name resolution should be attempted. - static const flags numeric_host = implementation_defined; - - /// Service name should be treated as a numeric string defining a port number - /// and no name resolution should be attempted. - static const flags numeric_service = implementation_defined; - - /// If the query protocol family is specified as IPv6, return IPv4-mapped - /// IPv6 addresses on finding no IPv6 addresses. - static const flags v4_mapped = implementation_defined; - - /// If used with v4_mapped, return all matching IPv6 and IPv4 addresses. - static const flags all_matching = implementation_defined; - - /// Only return IPv4 addresses if a non-loopback IPv4 address is configured - /// for the system. Only return IPv6 addresses if a non-loopback IPv6 address - /// is configured for the system. - static const flags address_configured = implementation_defined; -#else - enum flags - { - canonical_name = ASIO_OS_DEF(AI_CANONNAME), - passive = ASIO_OS_DEF(AI_PASSIVE), - numeric_host = ASIO_OS_DEF(AI_NUMERICHOST), - numeric_service = ASIO_OS_DEF(AI_NUMERICSERV), - v4_mapped = ASIO_OS_DEF(AI_V4MAPPED), - all_matching = ASIO_OS_DEF(AI_ALL), - address_configured = ASIO_OS_DEF(AI_ADDRCONFIG) - }; - - // Implement bitmask operations as shown in C++ Std [lib.bitmask.types]. - - friend flags operator&(flags x, flags y) - { - return static_cast( - static_cast(x) & static_cast(y)); - } - - friend flags operator|(flags x, flags y) - { - return static_cast( - static_cast(x) | static_cast(y)); - } - - friend flags operator^(flags x, flags y) - { - return static_cast( - static_cast(x) ^ static_cast(y)); - } - - friend flags operator~(flags x) - { - return static_cast(~static_cast(x)); - } - - friend flags& operator&=(flags& x, flags y) - { - x = x & y; - return x; - } - - friend flags& operator|=(flags& x, flags y) - { - x = x | y; - return x; - } - - friend flags& operator^=(flags& x, flags y) - { - x = x ^ y; - return x; - } -#endif - -protected: - /// Protected destructor to prevent deletion through this type. - ~resolver_base() - { - } -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_RESOLVER_BASE_HPP diff --git a/scout_sdk/asio/asio/ip/resolver_query_base.hpp b/scout_sdk/asio/asio/ip/resolver_query_base.hpp deleted file mode 100644 index be36858..0000000 --- a/scout_sdk/asio/asio/ip/resolver_query_base.hpp +++ /dev/null @@ -1,43 +0,0 @@ -// -// ip/resolver_query_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_RESOLVER_QUERY_BASE_HPP -#define ASIO_IP_RESOLVER_QUERY_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ip/resolver_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// The resolver_query_base class is used as a base for the -/// basic_resolver_query class templates to provide a common place to define -/// the flag constants. -class resolver_query_base : public resolver_base -{ -protected: - /// Protected destructor to prevent deletion through this type. - ~resolver_query_base() - { - } -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_RESOLVER_QUERY_BASE_HPP diff --git a/scout_sdk/asio/asio/ip/resolver_service.hpp b/scout_sdk/asio/asio/ip/resolver_service.hpp deleted file mode 100644 index 519d72d..0000000 --- a/scout_sdk/asio/asio/ip/resolver_service.hpp +++ /dev/null @@ -1,200 +0,0 @@ -// -// ip/resolver_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_RESOLVER_SERVICE_HPP -#define ASIO_IP_RESOLVER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/async_result.hpp" -#include "asio/error_code.hpp" -#include "asio/io_context.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/basic_resolver_results.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/winrt_resolver_service.hpp" -#else -# include "asio/detail/resolver_service.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Default service implementation for a resolver. -template -class resolver_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base< - resolver_service > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The protocol type. - typedef InternetProtocol protocol_type; - - /// The endpoint type. - typedef typename InternetProtocol::endpoint endpoint_type; - - /// The query type. - typedef basic_resolver_query query_type; - - /// The iterator type. - typedef basic_resolver_iterator iterator_type; - - /// The results type. - typedef basic_resolver_results results_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_WINDOWS_RUNTIME) - typedef asio::detail::winrt_resolver_service - service_impl_type; -#else - typedef asio::detail::resolver_service - service_impl_type; -#endif - -public: - /// The type of a resolver implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// Construct a new resolver service for the specified io_context. - explicit resolver_service(asio::io_context& io_context) - : asio::detail::service_base< - resolver_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new resolver implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new resolver implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another resolver implementation. - void move_assign(implementation_type& impl, - resolver_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a resolver implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Cancel pending asynchronous operations. - void cancel(implementation_type& impl) - { - service_impl_.cancel(impl); - } - - /// Resolve a query to a list of entries. - results_type resolve(implementation_type& impl, const query_type& query, - asio::error_code& ec) - { - return service_impl_.resolve(impl, query, ec); - } - - /// Asynchronously resolve a query to a list of entries. - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(implementation_type& impl, const query_type& query, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_resolve(impl, query, init.completion_handler); - - return init.result.get(); - } - - /// Resolve an endpoint to a list of entries. - results_type resolve(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - return service_impl_.resolve(impl, endpoint, ec); - } - - /// Asynchronously resolve an endpoint to a list of entries. - template - ASIO_INITFN_RESULT_TYPE(ResolveHandler, - void (asio::error_code, results_type)) - async_resolve(implementation_type& impl, const endpoint_type& endpoint, - ASIO_MOVE_ARG(ResolveHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_resolve(impl, endpoint, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // Perform any fork-related housekeeping. - void notify_fork(asio::io_context::fork_event event) - { - service_impl_.notify_fork(event); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_IP_RESOLVER_SERVICE_HPP diff --git a/scout_sdk/asio/asio/ip/tcp.hpp b/scout_sdk/asio/asio/ip/tcp.hpp deleted file mode 100644 index f1adeb0..0000000 --- a/scout_sdk/asio/asio/ip/tcp.hpp +++ /dev/null @@ -1,155 +0,0 @@ -// -// ip/tcp.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_TCP_HPP -#define ASIO_IP_TCP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/basic_socket_acceptor.hpp" -#include "asio/basic_socket_iostream.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/detail/socket_option.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Encapsulates the flags needed for TCP. -/** - * The asio::ip::tcp class contains flags necessary for TCP sockets. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol, InternetProtocol. - */ -class tcp -{ -public: - /// The type of a TCP endpoint. - typedef basic_endpoint endpoint; - - /// Construct to represent the IPv4 TCP protocol. - static tcp v4() - { - return tcp(ASIO_OS_DEF(AF_INET)); - } - - /// Construct to represent the IPv6 TCP protocol. - static tcp v6() - { - return tcp(ASIO_OS_DEF(AF_INET6)); - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return ASIO_OS_DEF(SOCK_STREAM); - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return ASIO_OS_DEF(IPPROTO_TCP); - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// The TCP socket type. - typedef basic_stream_socket socket; - - /// The TCP acceptor type. - typedef basic_socket_acceptor acceptor; - - /// The TCP resolver type. - typedef basic_resolver resolver; - -#if !defined(ASIO_NO_IOSTREAM) - /// The TCP iostream type. - typedef basic_socket_iostream iostream; -#endif // !defined(ASIO_NO_IOSTREAM) - - /// Socket option for disabling the Nagle algorithm. - /** - * Implements the IPPROTO_TCP/TCP_NODELAY socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::no_delay option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::tcp::no_delay option; - * socket.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined no_delay; -#else - typedef asio::detail::socket_option::boolean< - ASIO_OS_DEF(IPPROTO_TCP), ASIO_OS_DEF(TCP_NODELAY)> no_delay; -#endif - - /// Compare two protocols for equality. - friend bool operator==(const tcp& p1, const tcp& p2) - { - return p1.family_ == p2.family_; - } - - /// Compare two protocols for inequality. - friend bool operator!=(const tcp& p1, const tcp& p2) - { - return p1.family_ != p2.family_; - } - -private: - // Construct with a specific family. - explicit tcp(int protocol_family) - : family_(protocol_family) - { - } - - int family_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_TCP_HPP diff --git a/scout_sdk/asio/asio/ip/udp.hpp b/scout_sdk/asio/asio/ip/udp.hpp deleted file mode 100644 index 1c93f9b..0000000 --- a/scout_sdk/asio/asio/ip/udp.hpp +++ /dev/null @@ -1,111 +0,0 @@ -// -// ip/udp.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_UDP_HPP -#define ASIO_IP_UDP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/basic_datagram_socket.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Encapsulates the flags needed for UDP. -/** - * The asio::ip::udp class contains flags necessary for UDP sockets. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol, InternetProtocol. - */ -class udp -{ -public: - /// The type of a UDP endpoint. - typedef basic_endpoint endpoint; - - /// Construct to represent the IPv4 UDP protocol. - static udp v4() - { - return udp(ASIO_OS_DEF(AF_INET)); - } - - /// Construct to represent the IPv6 UDP protocol. - static udp v6() - { - return udp(ASIO_OS_DEF(AF_INET6)); - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return ASIO_OS_DEF(SOCK_DGRAM); - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return ASIO_OS_DEF(IPPROTO_UDP); - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// The UDP socket type. - typedef basic_datagram_socket socket; - - /// The UDP resolver type. - typedef basic_resolver resolver; - - /// Compare two protocols for equality. - friend bool operator==(const udp& p1, const udp& p2) - { - return p1.family_ == p2.family_; - } - - /// Compare two protocols for inequality. - friend bool operator!=(const udp& p1, const udp& p2) - { - return p1.family_ != p2.family_; - } - -private: - // Construct with a specific family. - explicit udp(int protocol_family) - : family_(protocol_family) - { - } - - int family_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_UDP_HPP diff --git a/scout_sdk/asio/asio/ip/unicast.hpp b/scout_sdk/asio/asio/ip/unicast.hpp deleted file mode 100644 index 14e3e48..0000000 --- a/scout_sdk/asio/asio/ip/unicast.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// ip/unicast.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_UNICAST_HPP -#define ASIO_IP_UNICAST_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/ip/detail/socket_option.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { -namespace unicast { - -/// Socket option for time-to-live associated with outgoing unicast packets. -/** - * Implements the IPPROTO_IP/IP_UNICAST_TTL socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::unicast::hops option(4); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::ip::unicast::hops option; - * socket.get_option(option); - * int ttl = option.value(); - * @endcode - * - * @par Concepts: - * GettableSocketOption, SettableSocketOption. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined hops; -#else -typedef asio::ip::detail::socket_option::unicast_hops< - ASIO_OS_DEF(IPPROTO_IP), - ASIO_OS_DEF(IP_TTL), - ASIO_OS_DEF(IPPROTO_IPV6), - ASIO_OS_DEF(IPV6_UNICAST_HOPS)> hops; -#endif - -} // namespace unicast -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_UNICAST_HPP diff --git a/scout_sdk/asio/asio/ip/v6_only.hpp b/scout_sdk/asio/asio/ip/v6_only.hpp deleted file mode 100644 index ac7234e..0000000 --- a/scout_sdk/asio/asio/ip/v6_only.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// -// ip/v6_only.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_V6_ONLY_HPP -#define ASIO_IP_V6_ONLY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/socket_option.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ip { - -/// Socket option for determining whether an IPv6 socket supports IPv6 -/// communication only. -/** - * Implements the IPPROTO_IPV6/IP_V6ONLY socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::v6_only option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::ip::v6_only option; - * socket.get_option(option); - * bool v6_only = option.value(); - * @endcode - * - * @par Concepts: - * GettableSocketOption, SettableSocketOption. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined v6_only; -#elif defined(IPV6_V6ONLY) -typedef asio::detail::socket_option::boolean< - IPPROTO_IPV6, IPV6_V6ONLY> v6_only; -#else -typedef asio::detail::socket_option::boolean< - asio::detail::custom_socket_option_level, - asio::detail::always_fail_option> v6_only; -#endif - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_V6_ONLY_HPP diff --git a/scout_sdk/asio/asio/is_executor.hpp b/scout_sdk/asio/asio/is_executor.hpp deleted file mode 100644 index a1661ec..0000000 --- a/scout_sdk/asio/asio/is_executor.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// is_executor.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IS_EXECUTOR_HPP -#define ASIO_IS_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/is_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// The is_executor trait detects whether a type T meets the Executor type -/// requirements. -/** - * Class template @c is_executor is a UnaryTypeTrait that is derived from @c - * true_type if the type @c T meets the syntactic requirements for Executor, - * otherwise @c false_type. - */ -template -struct is_executor -#if defined(GENERATING_DOCUMENTATION) - : integral_constant -#else // defined(GENERATING_DOCUMENTATION) - : asio::detail::is_executor -#endif // defined(GENERATING_DOCUMENTATION) -{ -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IS_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/is_read_buffered.hpp b/scout_sdk/asio/asio/is_read_buffered.hpp deleted file mode 100644 index c5a67b2..0000000 --- a/scout_sdk/asio/asio/is_read_buffered.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// is_read_buffered.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IS_READ_BUFFERED_HPP -#define ASIO_IS_READ_BUFFERED_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/buffered_read_stream_fwd.hpp" -#include "asio/buffered_stream_fwd.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail { - -template -char is_read_buffered_helper(buffered_stream* s); - -template -char is_read_buffered_helper(buffered_read_stream* s); - -struct is_read_buffered_big_type { char data[10]; }; -is_read_buffered_big_type is_read_buffered_helper(...); - -} // namespace detail - -/// The is_read_buffered class is a traits class that may be used to determine -/// whether a stream type supports buffering of read data. -template -class is_read_buffered -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The value member is true only if the Stream type supports buffering of - /// read data. - static const bool value; -#else - ASIO_STATIC_CONSTANT(bool, - value = sizeof(detail::is_read_buffered_helper((Stream*)0)) == 1); -#endif -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IS_READ_BUFFERED_HPP diff --git a/scout_sdk/asio/asio/is_write_buffered.hpp b/scout_sdk/asio/asio/is_write_buffered.hpp deleted file mode 100644 index e237dd6..0000000 --- a/scout_sdk/asio/asio/is_write_buffered.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// is_write_buffered.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IS_WRITE_BUFFERED_HPP -#define ASIO_IS_WRITE_BUFFERED_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/buffered_stream_fwd.hpp" -#include "asio/buffered_write_stream_fwd.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail { - -template -char is_write_buffered_helper(buffered_stream* s); - -template -char is_write_buffered_helper(buffered_write_stream* s); - -struct is_write_buffered_big_type { char data[10]; }; -is_write_buffered_big_type is_write_buffered_helper(...); - -} // namespace detail - -/// The is_write_buffered class is a traits class that may be used to determine -/// whether a stream type supports buffering of written data. -template -class is_write_buffered -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The value member is true only if the Stream type supports buffering of - /// written data. - static const bool value; -#else - ASIO_STATIC_CONSTANT(bool, - value = sizeof(detail::is_write_buffered_helper((Stream*)0)) == 1); -#endif -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IS_WRITE_BUFFERED_HPP diff --git a/scout_sdk/asio/asio/local/basic_endpoint.hpp b/scout_sdk/asio/asio/local/basic_endpoint.hpp deleted file mode 100644 index 94e470a..0000000 --- a/scout_sdk/asio/asio/local/basic_endpoint.hpp +++ /dev/null @@ -1,239 +0,0 @@ -// -// local/basic_endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Derived from a public domain implementation written by Daniel Casimiro. -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_LOCAL_BASIC_ENDPOINT_HPP -#define ASIO_LOCAL_BASIC_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/local/detail/endpoint.hpp" - -#if !defined(ASIO_NO_IOSTREAM) -# include -#endif // !defined(ASIO_NO_IOSTREAM) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace local { - -/// Describes an endpoint for a UNIX socket. -/** - * The asio::local::basic_endpoint class template describes an endpoint - * that may be associated with a particular UNIX socket. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Endpoint. - */ -template -class basic_endpoint -{ -public: - /// The protocol type associated with the endpoint. - typedef Protocol protocol_type; - - /// The type of the endpoint structure. This type is dependent on the - /// underlying implementation of the socket layer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined data_type; -#else - typedef asio::detail::socket_addr_type data_type; -#endif - - /// Default constructor. - basic_endpoint() - { - } - - /// Construct an endpoint using the specified path name. - basic_endpoint(const char* path_name) - : impl_(path_name) - { - } - - /// Construct an endpoint using the specified path name. - basic_endpoint(const std::string& path_name) - : impl_(path_name) - { - } - - /// Copy constructor. - basic_endpoint(const basic_endpoint& other) - : impl_(other.impl_) - { - } - -#if defined(ASIO_HAS_MOVE) - /// Move constructor. - basic_endpoint(basic_endpoint&& other) - : impl_(other.impl_) - { - } -#endif // defined(ASIO_HAS_MOVE) - - /// Assign from another endpoint. - basic_endpoint& operator=(const basic_endpoint& other) - { - impl_ = other.impl_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) - /// Move-assign from another endpoint. - basic_endpoint& operator=(basic_endpoint&& other) - { - impl_ = other.impl_; - return *this; - } -#endif // defined(ASIO_HAS_MOVE) - - /// The protocol associated with the endpoint. - protocol_type protocol() const - { - return protocol_type(); - } - - /// Get the underlying endpoint in the native type. - data_type* data() - { - return impl_.data(); - } - - /// Get the underlying endpoint in the native type. - const data_type* data() const - { - return impl_.data(); - } - - /// Get the underlying size of the endpoint in the native type. - std::size_t size() const - { - return impl_.size(); - } - - /// Set the underlying size of the endpoint in the native type. - void resize(std::size_t new_size) - { - impl_.resize(new_size); - } - - /// Get the capacity of the endpoint in the native type. - std::size_t capacity() const - { - return impl_.capacity(); - } - - /// Get the path associated with the endpoint. - std::string path() const - { - return impl_.path(); - } - - /// Set the path associated with the endpoint. - void path(const char* p) - { - impl_.path(p); - } - - /// Set the path associated with the endpoint. - void path(const std::string& p) - { - impl_.path(p); - } - - /// Compare two endpoints for equality. - friend bool operator==(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.impl_ == e2.impl_; - } - - /// Compare two endpoints for inequality. - friend bool operator!=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e1.impl_ == e2.impl_); - } - - /// Compare endpoints for ordering. - friend bool operator<(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.impl_ < e2.impl_; - } - - /// Compare endpoints for ordering. - friend bool operator>(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e2.impl_ < e1.impl_; - } - - /// Compare endpoints for ordering. - friend bool operator<=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e2 < e1); - } - - /// Compare endpoints for ordering. - friend bool operator>=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return !(e1 < e2); - } - -private: - // The underlying UNIX domain endpoint. - asio::local::detail::endpoint impl_; -}; - -/// Output an endpoint as a string. -/** - * Used to output a human-readable string for a specified endpoint. - * - * @param os The output stream to which the string will be written. - * - * @param endpoint The endpoint to be written. - * - * @return The output stream. - * - * @relates asio::local::basic_endpoint - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, - const basic_endpoint& endpoint) -{ - os << endpoint.path(); - return os; -} - -} // namespace local -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_LOCAL_BASIC_ENDPOINT_HPP diff --git a/scout_sdk/asio/asio/local/connect_pair.hpp b/scout_sdk/asio/asio/local/connect_pair.hpp deleted file mode 100644 index 2f7c090..0000000 --- a/scout_sdk/asio/asio/local/connect_pair.hpp +++ /dev/null @@ -1,106 +0,0 @@ -// -// local/connect_pair.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_LOCAL_CONNECT_PAIR_HPP -#define ASIO_LOCAL_CONNECT_PAIR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_socket.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/local/basic_endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace local { - -/// Create a pair of connected sockets. -template -void connect_pair( - basic_socket& socket1, - basic_socket& socket2); - -/// Create a pair of connected sockets. -template -ASIO_SYNC_OP_VOID connect_pair( - basic_socket& socket1, - basic_socket& socket2, - asio::error_code& ec); - -template -inline void connect_pair( - basic_socket& socket1, - basic_socket& socket2) -{ - asio::error_code ec; - connect_pair(socket1, socket2, ec); - asio::detail::throw_error(ec, "connect_pair"); -} - -template -inline ASIO_SYNC_OP_VOID connect_pair( - basic_socket& socket1, - basic_socket& socket2, - asio::error_code& ec) -{ - // Check that this function is only being used with a UNIX domain socket. - asio::local::basic_endpoint* tmp - = static_cast(0); - (void)tmp; - - Protocol protocol; - asio::detail::socket_type sv[2]; - if (asio::detail::socket_ops::socketpair(protocol.family(), - protocol.type(), protocol.protocol(), sv, ec) - == asio::detail::socket_error_retval) - ASIO_SYNC_OP_VOID_RETURN(ec); - - socket1.assign(protocol, sv[0], ec); - if (ec) - { - asio::error_code temp_ec; - asio::detail::socket_ops::state_type state[2] = { 0, 0 }; - asio::detail::socket_ops::close(sv[0], state[0], true, temp_ec); - asio::detail::socket_ops::close(sv[1], state[1], true, temp_ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - socket2.assign(protocol, sv[1], ec); - if (ec) - { - asio::error_code temp_ec; - socket1.close(temp_ec); - asio::detail::socket_ops::state_type state = 0; - asio::detail::socket_ops::close(sv[1], state, true, temp_ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -} // namespace local -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_LOCAL_CONNECT_PAIR_HPP diff --git a/scout_sdk/asio/asio/local/datagram_protocol.hpp b/scout_sdk/asio/asio/local/datagram_protocol.hpp deleted file mode 100644 index b87df2e..0000000 --- a/scout_sdk/asio/asio/local/datagram_protocol.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// -// local/datagram_protocol.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_LOCAL_DATAGRAM_PROTOCOL_HPP -#define ASIO_LOCAL_DATAGRAM_PROTOCOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_datagram_socket.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/local/basic_endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace local { - -/// Encapsulates the flags needed for datagram-oriented UNIX sockets. -/** - * The asio::local::datagram_protocol class contains flags necessary for - * datagram-oriented UNIX domain sockets. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class datagram_protocol -{ -public: - /// Obtain an identifier for the type of the protocol. - int type() const - { - return SOCK_DGRAM; - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return 0; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return AF_UNIX; - } - - /// The type of a UNIX domain endpoint. - typedef basic_endpoint endpoint; - - /// The UNIX domain socket type. - typedef basic_datagram_socket socket; -}; - -} // namespace local -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_LOCAL_DATAGRAM_PROTOCOL_HPP diff --git a/scout_sdk/asio/asio/local/detail/endpoint.hpp b/scout_sdk/asio/asio/local/detail/endpoint.hpp deleted file mode 100644 index 4870f3b..0000000 --- a/scout_sdk/asio/asio/local/detail/endpoint.hpp +++ /dev/null @@ -1,133 +0,0 @@ -// -// local/detail/endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Derived from a public domain implementation written by Daniel Casimiro. -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_LOCAL_DETAIL_ENDPOINT_HPP -#define ASIO_LOCAL_DETAIL_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) - -#include -#include -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace local { -namespace detail { - -// Helper class for implementing a UNIX domain endpoint. -class endpoint -{ -public: - // Default constructor. - ASIO_DECL endpoint(); - - // Construct an endpoint using the specified path name. - ASIO_DECL endpoint(const char* path_name); - - // Construct an endpoint using the specified path name. - ASIO_DECL endpoint(const std::string& path_name); - - // Copy constructor. - endpoint(const endpoint& other) - : data_(other.data_), - path_length_(other.path_length_) - { - } - - // Assign from another endpoint. - endpoint& operator=(const endpoint& other) - { - data_ = other.data_; - path_length_ = other.path_length_; - return *this; - } - - // Get the underlying endpoint in the native type. - asio::detail::socket_addr_type* data() - { - return &data_.base; - } - - // Get the underlying endpoint in the native type. - const asio::detail::socket_addr_type* data() const - { - return &data_.base; - } - - // Get the underlying size of the endpoint in the native type. - std::size_t size() const - { - return path_length_ - + offsetof(asio::detail::sockaddr_un_type, sun_path); - } - - // Set the underlying size of the endpoint in the native type. - ASIO_DECL void resize(std::size_t size); - - // Get the capacity of the endpoint in the native type. - std::size_t capacity() const - { - return sizeof(asio::detail::sockaddr_un_type); - } - - // Get the path associated with the endpoint. - ASIO_DECL std::string path() const; - - // Set the path associated with the endpoint. - ASIO_DECL void path(const char* p); - - // Set the path associated with the endpoint. - ASIO_DECL void path(const std::string& p); - - // Compare two endpoints for equality. - ASIO_DECL friend bool operator==( - const endpoint& e1, const endpoint& e2); - - // Compare endpoints for ordering. - ASIO_DECL friend bool operator<( - const endpoint& e1, const endpoint& e2); - -private: - // The underlying UNIX socket address. - union data_union - { - asio::detail::socket_addr_type base; - asio::detail::sockaddr_un_type local; - } data_; - - // The length of the path associated with the endpoint. - std::size_t path_length_; - - // Initialise with a specified path. - ASIO_DECL void init(const char* path, std::size_t path_length); -}; - -} // namespace detail -} // namespace local -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/local/detail/impl/endpoint.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) - -#endif // ASIO_LOCAL_DETAIL_ENDPOINT_HPP diff --git a/scout_sdk/asio/asio/local/detail/impl/endpoint.ipp b/scout_sdk/asio/asio/local/detail/impl/endpoint.ipp deleted file mode 100644 index d5bbf50..0000000 --- a/scout_sdk/asio/asio/local/detail/impl/endpoint.ipp +++ /dev/null @@ -1,129 +0,0 @@ -// -// local/detail/impl/endpoint.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Derived from a public domain implementation written by Daniel Casimiro. -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP -#define ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) - -#include -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/local/detail/endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace local { -namespace detail { - -endpoint::endpoint() -{ - init("", 0); -} - -endpoint::endpoint(const char* path_name) -{ - using namespace std; // For strlen. - init(path_name, strlen(path_name)); -} - -endpoint::endpoint(const std::string& path_name) -{ - init(path_name.data(), path_name.length()); -} - -void endpoint::resize(std::size_t new_size) -{ - if (new_size > sizeof(asio::detail::sockaddr_un_type)) - { - asio::error_code ec(asio::error::invalid_argument); - asio::detail::throw_error(ec); - } - else if (new_size == 0) - { - path_length_ = 0; - } - else - { - path_length_ = new_size - - offsetof(asio::detail::sockaddr_un_type, sun_path); - - // The path returned by the operating system may be NUL-terminated. - if (path_length_ > 0 && data_.local.sun_path[path_length_ - 1] == 0) - --path_length_; - } -} - -std::string endpoint::path() const -{ - return std::string(data_.local.sun_path, path_length_); -} - -void endpoint::path(const char* p) -{ - using namespace std; // For strlen. - init(p, strlen(p)); -} - -void endpoint::path(const std::string& p) -{ - init(p.data(), p.length()); -} - -bool operator==(const endpoint& e1, const endpoint& e2) -{ - return e1.path() == e2.path(); -} - -bool operator<(const endpoint& e1, const endpoint& e2) -{ - return e1.path() < e2.path(); -} - -void endpoint::init(const char* path_name, std::size_t path_length) -{ - if (path_length > sizeof(data_.local.sun_path) - 1) - { - // The buffer is not large enough to store this address. - asio::error_code ec(asio::error::name_too_long); - asio::detail::throw_error(ec); - } - - using namespace std; // For memcpy. - data_.local = asio::detail::sockaddr_un_type(); - data_.local.sun_family = AF_UNIX; - if (path_length > 0) - memcpy(data_.local.sun_path, path_name, path_length); - path_length_ = path_length; - - // NUL-terminate normal path names. Names that start with a NUL are in the - // UNIX domain protocol's "abstract namespace" and are not NUL-terminated. - if (path_length > 0 && data_.local.sun_path[0] == 0) - data_.local.sun_path[path_length] = 0; -} - -} // namespace detail -} // namespace local -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) - -#endif // ASIO_LOCAL_DETAIL_IMPL_ENDPOINT_IPP diff --git a/scout_sdk/asio/asio/local/stream_protocol.hpp b/scout_sdk/asio/asio/local/stream_protocol.hpp deleted file mode 100644 index e2ef5f3..0000000 --- a/scout_sdk/asio/asio/local/stream_protocol.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// local/stream_protocol.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_LOCAL_STREAM_PROTOCOL_HPP -#define ASIO_LOCAL_STREAM_PROTOCOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_LOCAL_SOCKETS) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_socket_acceptor.hpp" -#include "asio/basic_socket_iostream.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/local/basic_endpoint.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace local { - -/// Encapsulates the flags needed for stream-oriented UNIX sockets. -/** - * The asio::local::stream_protocol class contains flags necessary for - * stream-oriented UNIX domain sockets. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class stream_protocol -{ -public: - /// Obtain an identifier for the type of the protocol. - int type() const - { - return SOCK_STREAM; - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return 0; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return AF_UNIX; - } - - /// The type of a UNIX domain endpoint. - typedef basic_endpoint endpoint; - - /// The UNIX domain socket type. - typedef basic_stream_socket socket; - - /// The UNIX domain acceptor type. - typedef basic_socket_acceptor acceptor; - -#if !defined(ASIO_NO_IOSTREAM) - /// The UNIX domain iostream type. - typedef basic_socket_iostream iostream; -#endif // !defined(ASIO_NO_IOSTREAM) -}; - -} // namespace local -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_LOCAL_SOCKETS) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_LOCAL_STREAM_PROTOCOL_HPP diff --git a/scout_sdk/asio/asio/packaged_task.hpp b/scout_sdk/asio/asio/packaged_task.hpp deleted file mode 100644 index 1e20b42..0000000 --- a/scout_sdk/asio/asio/packaged_task.hpp +++ /dev/null @@ -1,126 +0,0 @@ -// -// packaged_task.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_PACKAGED_TASK_HPP -#define ASIO_PACKAGED_TASK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_FUTURE) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/detail/variadic_templates.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if defined(ASIO_HAS_VARIADIC_TEMPLATES) \ - || defined(GENERATING_DOCUMENTATION) - -/// Partial specialisation of @c async_result for @c std::packaged_task. -template -class async_result, Signature> -{ -public: - /// The packaged task is the concrete completion handler type. - typedef std::packaged_task completion_handler_type; - - /// The return type of the initiating function is the future obtained from - /// the packaged task. - typedef std::future return_type; - - /// The constructor extracts the future from the packaged task. - explicit async_result(completion_handler_type& h) - : future_(h.get_future()) - { - } - - /// Returns the packaged task's future. - return_type get() - { - return std::move(future_); - } - -private: - return_type future_; -}; - -#else // defined(ASIO_HAS_VARIADIC_TEMPLATES) - // || defined(GENERATING_DOCUMENTATION) - -template -struct async_result, Signature> -{ - typedef std::packaged_task completion_handler_type; - typedef std::future return_type; - - explicit async_result(completion_handler_type& h) - : future_(h.get_future()) - { - } - - return_type get() - { - return std::move(future_); - } - -private: - return_type future_; -}; - -#define ASIO_PRIVATE_ASYNC_RESULT_DEF(n) \ - template \ - class async_result< \ - std::packaged_task, Signature> \ - { \ - public: \ - typedef std::packaged_task< \ - Result(ASIO_VARIADIC_TARGS(n))> \ - completion_handler_type; \ - \ - typedef std::future return_type; \ - \ - explicit async_result(completion_handler_type& h) \ - : future_(h.get_future()) \ - { \ - } \ - \ - return_type get() \ - { \ - return std::move(future_); \ - } \ - \ - private: \ - return_type future_; \ - }; \ - /**/ - ASIO_VARIADIC_GENERATE(ASIO_PRIVATE_ASYNC_RESULT_DEF) -#undef ASIO_PRIVATE_ASYNC_RESULT_DEF - -#endif // defined(ASIO_HAS_VARIADIC_TEMPLATES) - // || defined(GENERATING_DOCUMENTATION) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_STD_FUTURE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_PACKAGED_TASK_HPP diff --git a/scout_sdk/asio/asio/placeholders.hpp b/scout_sdk/asio/asio/placeholders.hpp deleted file mode 100644 index e71a21e..0000000 --- a/scout_sdk/asio/asio/placeholders.hpp +++ /dev/null @@ -1,151 +0,0 @@ -// -// placeholders.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_PLACEHOLDERS_HPP -#define ASIO_PLACEHOLDERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_BIND) -# include -#endif // defined(ASIO_HAS_BOOST_BIND) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace placeholders { - -#if defined(GENERATING_DOCUMENTATION) - -/// An argument placeholder, for use with boost::bind(), that corresponds to -/// the error argument of a handler for any of the asynchronous functions. -unspecified error; - -/// An argument placeholder, for use with boost::bind(), that corresponds to -/// the bytes_transferred argument of a handler for asynchronous functions such -/// as asio::basic_stream_socket::async_write_some or -/// asio::async_write. -unspecified bytes_transferred; - -/// An argument placeholder, for use with boost::bind(), that corresponds to -/// the iterator argument of a handler for asynchronous functions such as -/// asio::async_connect. -unspecified iterator; - -/// An argument placeholder, for use with boost::bind(), that corresponds to -/// the results argument of a handler for asynchronous functions such as -/// asio::basic_resolver::async_resolve. -unspecified results; - -/// An argument placeholder, for use with boost::bind(), that corresponds to -/// the results argument of a handler for asynchronous functions such as -/// asio::async_connect. -unspecified endpoint; - -/// An argument placeholder, for use with boost::bind(), that corresponds to -/// the signal_number argument of a handler for asynchronous functions such as -/// asio::signal_set::async_wait. -unspecified signal_number; - -#elif defined(ASIO_HAS_BOOST_BIND) -# if defined(__BORLANDC__) || defined(__GNUC__) - -inline boost::arg<1> error() -{ - return boost::arg<1>(); -} - -inline boost::arg<2> bytes_transferred() -{ - return boost::arg<2>(); -} - -inline boost::arg<2> iterator() -{ - return boost::arg<2>(); -} - -inline boost::arg<2> results() -{ - return boost::arg<2>(); -} - -inline boost::arg<2> endpoint() -{ - return boost::arg<2>(); -} - -inline boost::arg<2> signal_number() -{ - return boost::arg<2>(); -} - -# else - -namespace detail -{ - template - struct placeholder - { - static boost::arg& get() - { - static boost::arg result; - return result; - } - }; -} - -# if defined(ASIO_MSVC) && (ASIO_MSVC < 1400) - -static boost::arg<1>& error - = asio::placeholders::detail::placeholder<1>::get(); -static boost::arg<2>& bytes_transferred - = asio::placeholders::detail::placeholder<2>::get(); -static boost::arg<2>& iterator - = asio::placeholders::detail::placeholder<2>::get(); -static boost::arg<2>& results - = asio::placeholders::detail::placeholder<2>::get(); -static boost::arg<2>& endpoint - = asio::placeholders::detail::placeholder<2>::get(); -static boost::arg<2>& signal_number - = asio::placeholders::detail::placeholder<2>::get(); - -# else - -namespace -{ - boost::arg<1>& error - = asio::placeholders::detail::placeholder<1>::get(); - boost::arg<2>& bytes_transferred - = asio::placeholders::detail::placeholder<2>::get(); - boost::arg<2>& iterator - = asio::placeholders::detail::placeholder<2>::get(); - boost::arg<2>& results - = asio::placeholders::detail::placeholder<2>::get(); - boost::arg<2>& endpoint - = asio::placeholders::detail::placeholder<2>::get(); - boost::arg<2>& signal_number - = asio::placeholders::detail::placeholder<2>::get(); -} // namespace - -# endif -# endif -#endif - -} // namespace placeholders -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_PLACEHOLDERS_HPP diff --git a/scout_sdk/asio/asio/posix/basic_descriptor.hpp b/scout_sdk/asio/asio/posix/basic_descriptor.hpp deleted file mode 100644 index c15da63..0000000 --- a/scout_sdk/asio/asio/posix/basic_descriptor.hpp +++ /dev/null @@ -1,582 +0,0 @@ -// -// posix/basic_descriptor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_POSIX_BASIC_DESCRIPTOR_HPP -#define ASIO_POSIX_BASIC_DESCRIPTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_io_object.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/posix/descriptor_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace posix { - -/// Provides POSIX descriptor functionality. -/** - * The posix::basic_descriptor class template provides the ability to wrap a - * POSIX descriptor. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_descriptor - : public basic_io_object, - public descriptor_base -{ -public: - /// The native representation of a descriptor. - typedef typename DescriptorService::native_handle_type native_handle_type; - - /// A basic_descriptor is always the lowest layer. - typedef basic_descriptor lowest_layer_type; - - /// Construct a basic_descriptor without opening it. - /** - * This constructor creates a descriptor without opening it. - * - * @param io_context The io_context object that the descriptor will use to - * dispatch handlers for any asynchronous operations performed on the - * descriptor. - */ - explicit basic_descriptor(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct a basic_descriptor on an existing native descriptor. - /** - * This constructor creates a descriptor object to hold an existing native - * descriptor. - * - * @param io_context The io_context object that the descriptor will use to - * dispatch handlers for any asynchronous operations performed on the - * descriptor. - * - * @param native_descriptor A native descriptor. - * - * @throws asio::system_error Thrown on failure. - */ - basic_descriptor(asio::io_context& io_context, - const native_handle_type& native_descriptor) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_descriptor, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_descriptor from another. - /** - * This constructor moves a descriptor from one object to another. - * - * @param other The other basic_descriptor object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_descriptor(io_context&) constructor. - */ - basic_descriptor(basic_descriptor&& other) - : basic_io_object( - ASIO_MOVE_CAST(basic_descriptor)(other)) - { - } - - /// Move-assign a basic_descriptor from another. - /** - * This assignment operator moves a descriptor from one object to another. - * - * @param other The other basic_descriptor object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_descriptor(io_context&) constructor. - */ - basic_descriptor& operator=(basic_descriptor&& other) - { - basic_io_object::operator=( - ASIO_MOVE_CAST(basic_descriptor)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since a basic_descriptor cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since a basic_descriptor cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } - - /// Assign an existing native descriptor to the descriptor. - /* - * This function opens the descriptor to hold an existing native descriptor. - * - * @param native_descriptor A native descriptor. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const native_handle_type& native_descriptor) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_descriptor, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native descriptor to the descriptor. - /* - * This function opens the descriptor to hold an existing native descriptor. - * - * @param native_descriptor A native descriptor. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const native_handle_type& native_descriptor, - asio::error_code& ec) - { - this->get_service().assign( - this->get_implementation(), native_descriptor, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the descriptor is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the descriptor. - /** - * This function is used to close the descriptor. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. Note that, even if - * the function indicates an error, the underlying descriptor is closed. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the descriptor. - /** - * This function is used to close the descriptor. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. Note that, even if - * the function indicates an error, the underlying descriptor is closed. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native descriptor representation. - /** - * This function may be used to obtain the underlying representation of the - * descriptor. This is intended to allow access to native descriptor - * functionality that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Release ownership of the native descriptor implementation. - /** - * This function may be used to obtain the underlying representation of the - * descriptor. After calling this function, @c is_open() returns false. The - * caller is responsible for closing the descriptor. - * - * All outstanding asynchronous read or write operations will finish - * immediately, and the handlers for cancelled operations will be passed the - * asio::error::operation_aborted error. - */ - native_handle_type release() - { - return this->get_service().release(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the descriptor. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the descriptor. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the descriptor. - /** - * This function is used to execute an IO control command on the descriptor. - * - * @param command The IO control command to be performed on the descriptor. - * - * @throws asio::system_error Thrown on failure. - * - * @sa IoControlCommand @n - * asio::posix::descriptor_base::bytes_readable @n - * asio::posix::descriptor_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * asio::posix::stream_descriptor::bytes_readable command; - * descriptor.io_control(command); - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - void io_control(IoControlCommand& command) - { - asio::error_code ec; - this->get_service().io_control(this->get_implementation(), command, ec); - asio::detail::throw_error(ec, "io_control"); - } - - /// Perform an IO control command on the descriptor. - /** - * This function is used to execute an IO control command on the descriptor. - * - * @param command The IO control command to be performed on the descriptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa IoControlCommand @n - * asio::posix::descriptor_base::bytes_readable @n - * asio::posix::descriptor_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * asio::posix::stream_descriptor::bytes_readable command; - * asio::error_code ec; - * descriptor.io_control(command, ec); - * if (ec) - * { - * // An error occurred. - * } - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, - asio::error_code& ec) - { - this->get_service().io_control(this->get_implementation(), command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the descriptor. - /** - * @returns @c true if the descriptor's synchronous operations will fail with - * asio::error::would_block if they are unable to perform the requested - * operation immediately. If @c false, synchronous operations will block - * until complete. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - bool non_blocking() const - { - return this->get_service().non_blocking(this->get_implementation()); - } - - /// Sets the non-blocking mode of the descriptor. - /** - * @param mode If @c true, the descriptor's synchronous operations will fail - * with asio::error::would_block if they are unable to perform the - * requested operation immediately. If @c false, synchronous operations will - * block until complete. - * - * @throws asio::system_error Thrown on failure. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - void non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().non_blocking(this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "non_blocking"); - } - - /// Sets the non-blocking mode of the descriptor. - /** - * @param mode If @c true, the descriptor's synchronous operations will fail - * with asio::error::would_block if they are unable to perform the - * requested operation immediately. If @c false, synchronous operations will - * block until complete. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - ASIO_SYNC_OP_VOID non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().non_blocking(this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native descriptor implementation. - /** - * This function is used to retrieve the non-blocking mode of the underlying - * native descriptor. This mode has no effect on the behaviour of the - * descriptor object's synchronous operations. - * - * @returns @c true if the underlying descriptor is in non-blocking mode and - * direct system calls may fail with asio::error::would_block (or the - * equivalent system error). - * - * @note The current non-blocking mode is cached by the descriptor object. - * Consequently, the return value may be incorrect if the non-blocking mode - * was set directly on the native descriptor. - */ - bool native_non_blocking() const - { - return this->get_service().native_non_blocking( - this->get_implementation()); - } - - /// Sets the non-blocking mode of the native descriptor implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native descriptor. It has no effect on the behaviour of the descriptor - * object's synchronous operations. - * - * @param mode If @c true, the underlying descriptor is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @throws asio::system_error Thrown on failure. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - */ - void native_non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "native_non_blocking"); - } - - /// Sets the non-blocking mode of the native descriptor implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native descriptor. It has no effect on the behaviour of the descriptor - * object's synchronous operations. - * - * @param mode If @c true, the underlying descriptor is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @param ec Set to indicate what error occurred, if any. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - */ - ASIO_SYNC_OP_VOID native_non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the descriptor to become ready to read, ready to write, or to - /// have pending error conditions. - /** - * This function is used to perform a blocking wait for a descriptor to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired descriptor state. - * - * @par Example - * Waiting for a descriptor to become readable. - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * descriptor.wait(asio::posix::stream_descriptor::wait_read); - * @endcode - */ - void wait(wait_type w) - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), w, ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Wait for the descriptor to become ready to read, ready to write, or to - /// have pending error conditions. - /** - * This function is used to perform a blocking wait for a descriptor to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired descriptor state. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * Waiting for a descriptor to become readable. - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * asio::error_code ec; - * descriptor.wait(asio::posix::stream_descriptor::wait_read, ec); - * @endcode - */ - ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the descriptor to become ready to read, ready to - /// write, or to have pending error conditions. - /** - * This function is used to perform an asynchronous wait for a descriptor to - * enter a ready to read, write or error condition state. - * - * @param w Specifies the desired descriptor state. - * - * @param handler The handler to be called when the wait operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void wait_handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Wait succeeded. - * } - * } - * - * ... - * - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * descriptor.async_wait( - * asio::posix::stream_descriptor::wait_read, - * wait_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WaitHandler. - ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; - - return this->get_service().async_wait(this->get_implementation(), - w, ASIO_MOVE_CAST(WaitHandler)(handler)); - } - -protected: - /// Protected destructor to prevent deletion through this type. - ~basic_descriptor() - { - } -}; - -} // namespace posix -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_POSIX_BASIC_DESCRIPTOR_HPP diff --git a/scout_sdk/asio/asio/posix/basic_stream_descriptor.hpp b/scout_sdk/asio/asio/posix/basic_stream_descriptor.hpp deleted file mode 100644 index acd5cb6..0000000 --- a/scout_sdk/asio/asio/posix/basic_stream_descriptor.hpp +++ /dev/null @@ -1,362 +0,0 @@ -// -// posix/basic_stream_descriptor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP -#define ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/posix/basic_descriptor.hpp" -#include "asio/posix/stream_descriptor_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace posix { - -/// Provides stream-oriented descriptor functionality. -/** - * The posix::basic_stream_descriptor class template provides asynchronous and - * blocking stream-oriented descriptor functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -template -class basic_stream_descriptor - : public basic_descriptor -{ -public: - /// The native representation of a descriptor. - typedef typename StreamDescriptorService::native_handle_type - native_handle_type; - - /// Construct a basic_stream_descriptor without opening it. - /** - * This constructor creates a stream descriptor without opening it. The - * descriptor needs to be opened and then connected or accepted before data - * can be sent or received on it. - * - * @param io_context The io_context object that the stream descriptor will - * use to dispatch handlers for any asynchronous operations performed on the - * descriptor. - */ - explicit basic_stream_descriptor(asio::io_context& io_context) - : basic_descriptor(io_context) - { - } - - /// Construct a basic_stream_descriptor on an existing native descriptor. - /** - * This constructor creates a stream descriptor object to hold an existing - * native descriptor. - * - * @param io_context The io_context object that the stream descriptor will - * use to dispatch handlers for any asynchronous operations performed on the - * descriptor. - * - * @param native_descriptor The new underlying descriptor implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_stream_descriptor(asio::io_context& io_context, - const native_handle_type& native_descriptor) - : basic_descriptor(io_context, native_descriptor) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_stream_descriptor from another. - /** - * This constructor moves a stream descriptor from one object to another. - * - * @param other The other basic_stream_descriptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_descriptor(io_context&) constructor. - */ - basic_stream_descriptor(basic_stream_descriptor&& other) - : basic_descriptor( - ASIO_MOVE_CAST(basic_stream_descriptor)(other)) - { - } - - /// Move-assign a basic_stream_descriptor from another. - /** - * This assignment operator moves a stream descriptor from one object to - * another. - * - * @param other The other basic_stream_descriptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_descriptor(io_context&) constructor. - */ - basic_stream_descriptor& operator=(basic_stream_descriptor&& other) - { - basic_descriptor::operator=( - ASIO_MOVE_CAST(basic_stream_descriptor)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Write some data to the descriptor. - /** - * This function is used to write data to the stream descriptor. The function - * call will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the descriptor. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "write_some"); - return s; - } - - /// Write some data to the descriptor. - /** - * This function is used to write data to the stream descriptor. The function - * call will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the descriptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().write_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the stream - * descriptor. The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the descriptor. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - return this->get_service().async_write_some(this->get_implementation(), - buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); - } - - /// Read some data from the descriptor. - /** - * This function is used to read data from the stream descriptor. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "read_some"); - return s; - } - - /// Read some data from the descriptor. - /** - * This function is used to read data from the stream descriptor. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().read_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the stream - * descriptor. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - return this->get_service().async_read_some(this->get_implementation(), - buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); - } -}; - -} // namespace posix -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_POSIX_BASIC_STREAM_DESCRIPTOR_HPP diff --git a/scout_sdk/asio/asio/posix/descriptor.hpp b/scout_sdk/asio/asio/posix/descriptor.hpp deleted file mode 100644 index d0cee1a..0000000 --- a/scout_sdk/asio/asio/posix/descriptor.hpp +++ /dev/null @@ -1,644 +0,0 @@ -// -// posix/descriptor.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_POSIX_DESCRIPTOR_HPP -#define ASIO_POSIX_DESCRIPTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/async_result.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/reactive_descriptor_service.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/posix/descriptor_base.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#define ASIO_SVC_T asio::detail::reactive_descriptor_service - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace posix { - -/// Provides POSIX descriptor functionality. -/** - * The posix::descriptor class template provides the ability to wrap a - * POSIX descriptor. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class descriptor - : ASIO_SVC_ACCESS basic_io_object, - public descriptor_base -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The native representation of a descriptor. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef ASIO_SVC_T::native_handle_type native_handle_type; -#endif - - /// A descriptor is always the lowest layer. - typedef descriptor lowest_layer_type; - - /// Construct a descriptor without opening it. - /** - * This constructor creates a descriptor without opening it. - * - * @param io_context The io_context object that the descriptor will use to - * dispatch handlers for any asynchronous operations performed on the - * descriptor. - */ - explicit descriptor(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct a descriptor on an existing native descriptor. - /** - * This constructor creates a descriptor object to hold an existing native - * descriptor. - * - * @param io_context The io_context object that the descriptor will use to - * dispatch handlers for any asynchronous operations performed on the - * descriptor. - * - * @param native_descriptor A native descriptor. - * - * @throws asio::system_error Thrown on failure. - */ - descriptor(asio::io_context& io_context, - const native_handle_type& native_descriptor) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_descriptor, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a descriptor from another. - /** - * This constructor moves a descriptor from one object to another. - * - * @param other The other descriptor object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c descriptor(io_context&) constructor. - */ - descriptor(descriptor&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign a descriptor from another. - /** - * This assignment operator moves a descriptor from one object to another. - * - * @param other The other descriptor object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c descriptor(io_context&) constructor. - */ - descriptor& operator=(descriptor&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since a descriptor cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since a descriptor cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } - - /// Assign an existing native descriptor to the descriptor. - /* - * This function opens the descriptor to hold an existing native descriptor. - * - * @param native_descriptor A native descriptor. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const native_handle_type& native_descriptor) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_descriptor, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native descriptor to the descriptor. - /* - * This function opens the descriptor to hold an existing native descriptor. - * - * @param native_descriptor A native descriptor. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const native_handle_type& native_descriptor, - asio::error_code& ec) - { - this->get_service().assign( - this->get_implementation(), native_descriptor, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the descriptor is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the descriptor. - /** - * This function is used to close the descriptor. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. Note that, even if - * the function indicates an error, the underlying descriptor is closed. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the descriptor. - /** - * This function is used to close the descriptor. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. Note that, even if - * the function indicates an error, the underlying descriptor is closed. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native descriptor representation. - /** - * This function may be used to obtain the underlying representation of the - * descriptor. This is intended to allow access to native descriptor - * functionality that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Release ownership of the native descriptor implementation. - /** - * This function may be used to obtain the underlying representation of the - * descriptor. After calling this function, @c is_open() returns false. The - * caller is responsible for closing the descriptor. - * - * All outstanding asynchronous read or write operations will finish - * immediately, and the handlers for cancelled operations will be passed the - * asio::error::operation_aborted error. - */ - native_handle_type release() - { - return this->get_service().release(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the descriptor. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the descriptor. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the descriptor. - /** - * This function is used to execute an IO control command on the descriptor. - * - * @param command The IO control command to be performed on the descriptor. - * - * @throws asio::system_error Thrown on failure. - * - * @sa IoControlCommand @n - * asio::posix::descriptor_base::bytes_readable @n - * asio::posix::descriptor_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * asio::posix::stream_descriptor::bytes_readable command; - * descriptor.io_control(command); - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - void io_control(IoControlCommand& command) - { - asio::error_code ec; - this->get_service().io_control(this->get_implementation(), command, ec); - asio::detail::throw_error(ec, "io_control"); - } - - /// Perform an IO control command on the descriptor. - /** - * This function is used to execute an IO control command on the descriptor. - * - * @param command The IO control command to be performed on the descriptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa IoControlCommand @n - * asio::posix::descriptor_base::bytes_readable @n - * asio::posix::descriptor_base::non_blocking_io - * - * @par Example - * Getting the number of bytes ready to read: - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * asio::posix::stream_descriptor::bytes_readable command; - * asio::error_code ec; - * descriptor.io_control(command, ec); - * if (ec) - * { - * // An error occurred. - * } - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - ASIO_SYNC_OP_VOID io_control(IoControlCommand& command, - asio::error_code& ec) - { - this->get_service().io_control(this->get_implementation(), command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the descriptor. - /** - * @returns @c true if the descriptor's synchronous operations will fail with - * asio::error::would_block if they are unable to perform the requested - * operation immediately. If @c false, synchronous operations will block - * until complete. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - bool non_blocking() const - { - return this->get_service().non_blocking(this->get_implementation()); - } - - /// Sets the non-blocking mode of the descriptor. - /** - * @param mode If @c true, the descriptor's synchronous operations will fail - * with asio::error::would_block if they are unable to perform the - * requested operation immediately. If @c false, synchronous operations will - * block until complete. - * - * @throws asio::system_error Thrown on failure. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - void non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().non_blocking(this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "non_blocking"); - } - - /// Sets the non-blocking mode of the descriptor. - /** - * @param mode If @c true, the descriptor's synchronous operations will fail - * with asio::error::would_block if they are unable to perform the - * requested operation immediately. If @c false, synchronous operations will - * block until complete. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note The non-blocking mode has no effect on the behaviour of asynchronous - * operations. Asynchronous operations will never fail with the error - * asio::error::would_block. - */ - ASIO_SYNC_OP_VOID non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().non_blocking(this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native descriptor implementation. - /** - * This function is used to retrieve the non-blocking mode of the underlying - * native descriptor. This mode has no effect on the behaviour of the - * descriptor object's synchronous operations. - * - * @returns @c true if the underlying descriptor is in non-blocking mode and - * direct system calls may fail with asio::error::would_block (or the - * equivalent system error). - * - * @note The current non-blocking mode is cached by the descriptor object. - * Consequently, the return value may be incorrect if the non-blocking mode - * was set directly on the native descriptor. - */ - bool native_non_blocking() const - { - return this->get_service().native_non_blocking( - this->get_implementation()); - } - - /// Sets the non-blocking mode of the native descriptor implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native descriptor. It has no effect on the behaviour of the descriptor - * object's synchronous operations. - * - * @param mode If @c true, the underlying descriptor is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @throws asio::system_error Thrown on failure. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - */ - void native_non_blocking(bool mode) - { - asio::error_code ec; - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - asio::detail::throw_error(ec, "native_non_blocking"); - } - - /// Sets the non-blocking mode of the native descriptor implementation. - /** - * This function is used to modify the non-blocking mode of the underlying - * native descriptor. It has no effect on the behaviour of the descriptor - * object's synchronous operations. - * - * @param mode If @c true, the underlying descriptor is put into non-blocking - * mode and direct system calls may fail with asio::error::would_block - * (or the equivalent system error). - * - * @param ec Set to indicate what error occurred, if any. If the @c mode is - * @c false, but the current value of @c non_blocking() is @c true, this - * function fails with asio::error::invalid_argument, as the - * combination does not make sense. - */ - ASIO_SYNC_OP_VOID native_non_blocking( - bool mode, asio::error_code& ec) - { - this->get_service().native_non_blocking( - this->get_implementation(), mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the descriptor to become ready to read, ready to write, or to - /// have pending error conditions. - /** - * This function is used to perform a blocking wait for a descriptor to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired descriptor state. - * - * @par Example - * Waiting for a descriptor to become readable. - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * descriptor.wait(asio::posix::stream_descriptor::wait_read); - * @endcode - */ - void wait(wait_type w) - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), w, ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Wait for the descriptor to become ready to read, ready to write, or to - /// have pending error conditions. - /** - * This function is used to perform a blocking wait for a descriptor to enter - * a ready to read, write or error condition state. - * - * @param w Specifies the desired descriptor state. - * - * @param ec Set to indicate what error occurred, if any. - * - * @par Example - * Waiting for a descriptor to become readable. - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * asio::error_code ec; - * descriptor.wait(asio::posix::stream_descriptor::wait_read, ec); - * @endcode - */ - ASIO_SYNC_OP_VOID wait(wait_type w, asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the descriptor to become ready to read, ready to - /// write, or to have pending error conditions. - /** - * This function is used to perform an asynchronous wait for a descriptor to - * enter a ready to read, write or error condition state. - * - * @param w Specifies the desired descriptor state. - * - * @param handler The handler to be called when the wait operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * @code - * void wait_handler(const asio::error_code& error) - * { - * if (!error) - * { - * // Wait succeeded. - * } - * } - * - * ... - * - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * descriptor.async_wait( - * asio::posix::stream_descriptor::wait_read, - * wait_handler); - * @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(wait_type w, ASIO_MOVE_ARG(WaitHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WaitHandler. - ASIO_WAIT_HANDLER_CHECK(WaitHandler, handler) type_check; - - async_completion init(handler); - - this->get_service().async_wait( - this->get_implementation(), w, init.completion_handler); - - return init.result.get(); - } - -protected: - /// Protected destructor to prevent deletion through this type. - /** - * This function destroys the descriptor, cancelling any outstanding - * asynchronous wait operations associated with the descriptor as if by - * calling @c cancel. - */ - ~descriptor() - { - } -}; - -} // namespace posix -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#undef ASIO_SVC_T - -#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - // || defined(GENERATING_DOCUMENTATION) - -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_POSIX_DESCRIPTOR_HPP diff --git a/scout_sdk/asio/asio/posix/descriptor_base.hpp b/scout_sdk/asio/asio/posix/descriptor_base.hpp deleted file mode 100644 index 4aac04f..0000000 --- a/scout_sdk/asio/asio/posix/descriptor_base.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// posix/descriptor_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_POSIX_DESCRIPTOR_BASE_HPP -#define ASIO_POSIX_DESCRIPTOR_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/detail/io_control.hpp" -#include "asio/detail/socket_option.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace posix { - -/// The descriptor_base class is used as a base for the descriptor class as a -/// place to define the associated IO control commands. -class descriptor_base -{ -public: - /// Wait types. - /** - * For use with descriptor::wait() and descriptor::async_wait(). - */ - enum wait_type - { - /// Wait for a descriptor to become ready to read. - wait_read, - - /// Wait for a descriptor to become ready to write. - wait_write, - - /// Wait for a descriptor to have error conditions pending. - wait_error - }; - - /// IO control command to get the amount of data that can be read without - /// blocking. - /** - * Implements the FIONREAD IO control command. - * - * @par Example - * @code - * asio::posix::stream_descriptor descriptor(io_context); - * ... - * asio::descriptor_base::bytes_readable command(true); - * descriptor.io_control(command); - * std::size_t bytes_readable = command.get(); - * @endcode - * - * @par Concepts: - * IoControlCommand. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined bytes_readable; -#else - typedef asio::detail::io_control::bytes_readable bytes_readable; -#endif - -protected: - /// Protected destructor to prevent deletion through this type. - ~descriptor_base() - { - } -}; - -} // namespace posix -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_POSIX_DESCRIPTOR_BASE_HPP diff --git a/scout_sdk/asio/asio/posix/stream_descriptor.hpp b/scout_sdk/asio/asio/posix/stream_descriptor.hpp deleted file mode 100644 index abb426a..0000000 --- a/scout_sdk/asio/asio/posix/stream_descriptor.hpp +++ /dev/null @@ -1,360 +0,0 @@ -// -// posix/stream_descriptor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_POSIX_STREAM_DESCRIPTOR_HPP -#define ASIO_POSIX_STREAM_DESCRIPTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/posix/descriptor.hpp" - -#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ - || defined(GENERATING_DOCUMENTATION) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/posix/basic_stream_descriptor.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -namespace asio { -namespace posix { - -#if defined(ASIO_ENABLE_OLD_SERVICES) -// Typedef for the typical usage of a stream-oriented descriptor. -typedef basic_stream_descriptor<> stream_descriptor; -#else // defined(ASIO_ENABLE_OLD_SERVICES) -/// Provides stream-oriented descriptor functionality. -/** - * The posix::stream_descriptor class template provides asynchronous and - * blocking stream-oriented descriptor functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -class stream_descriptor - : public descriptor -{ -public: - /// Construct a stream_descriptor without opening it. - /** - * This constructor creates a stream descriptor without opening it. The - * descriptor needs to be opened and then connected or accepted before data - * can be sent or received on it. - * - * @param io_context The io_context object that the stream descriptor will - * use to dispatch handlers for any asynchronous operations performed on the - * descriptor. - */ - explicit stream_descriptor(asio::io_context& io_context) - : descriptor(io_context) - { - } - - /// Construct a stream_descriptor on an existing native descriptor. - /** - * This constructor creates a stream descriptor object to hold an existing - * native descriptor. - * - * @param io_context The io_context object that the stream descriptor will - * use to dispatch handlers for any asynchronous operations performed on the - * descriptor. - * - * @param native_descriptor The new underlying descriptor implementation. - * - * @throws asio::system_error Thrown on failure. - */ - stream_descriptor(asio::io_context& io_context, - const native_handle_type& native_descriptor) - : descriptor(io_context, native_descriptor) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a stream_descriptor from another. - /** - * This constructor moves a stream descriptor from one object to another. - * - * @param other The other stream_descriptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c stream_descriptor(io_context&) constructor. - */ - stream_descriptor(stream_descriptor&& other) - : descriptor(std::move(other)) - { - } - - /// Move-assign a stream_descriptor from another. - /** - * This assignment operator moves a stream descriptor from one object to - * another. - * - * @param other The other stream_descriptor object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c stream_descriptor(io_context&) constructor. - */ - stream_descriptor& operator=(stream_descriptor&& other) - { - descriptor::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Write some data to the descriptor. - /** - * This function is used to write data to the stream descriptor. The function - * call will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the descriptor. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "write_some"); - return s; - } - - /// Write some data to the descriptor. - /** - * This function is used to write data to the stream descriptor. The function - * call will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the descriptor. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().write_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the stream - * descriptor. The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the descriptor. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - asio::async_completion init(handler); - - this->get_service().async_write_some( - this->get_implementation(), buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the descriptor. - /** - * This function is used to read data from the stream descriptor. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "read_some"); - return s; - } - - /// Read some data from the descriptor. - /** - * This function is used to read data from the stream descriptor. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().read_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the stream - * descriptor. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * descriptor.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - asio::async_completion init(handler); - - this->get_service().async_read_some( - this->get_implementation(), buffers, init.completion_handler); - - return init.result.get(); - } -}; -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -} // namespace posix -} // namespace asio - -#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_POSIX_STREAM_DESCRIPTOR_HPP diff --git a/scout_sdk/asio/asio/posix/stream_descriptor_service.hpp b/scout_sdk/asio/asio/posix/stream_descriptor_service.hpp deleted file mode 100644 index 4ffbb96..0000000 --- a/scout_sdk/asio/asio/posix/stream_descriptor_service.hpp +++ /dev/null @@ -1,279 +0,0 @@ -// -// posix/stream_descriptor_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_POSIX_STREAM_DESCRIPTOR_SERVICE_HPP -#define ASIO_POSIX_STREAM_DESCRIPTOR_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/async_result.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/detail/reactive_descriptor_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace posix { - -/// Default service implementation for a stream descriptor. -class stream_descriptor_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - -private: - // The type of the platform-specific implementation. - typedef detail::reactive_descriptor_service service_impl_type; - -public: - /// The type of a stream descriptor implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef service_impl_type::implementation_type implementation_type; -#endif - - /// The native descriptor type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new stream descriptor service for the specified io_context. - explicit stream_descriptor_service(asio::io_context& io_context) - : asio::detail::service_base(io_context), - service_impl_(io_context) - { - } - - /// Construct a new stream descriptor implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new stream descriptor implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another stream descriptor implementation. - void move_assign(implementation_type& impl, - stream_descriptor_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a stream descriptor implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Assign an existing native descriptor to a stream descriptor. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const native_handle_type& native_descriptor, - asio::error_code& ec) - { - service_impl_.assign(impl, native_descriptor, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the descriptor is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a stream descriptor implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native descriptor implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Release ownership of the native descriptor implementation. - native_handle_type release(implementation_type& impl) - { - return service_impl_.release(impl); - } - - /// Cancel all asynchronous operations associated with the descriptor. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the descriptor. - template - ASIO_SYNC_OP_VOID io_control(implementation_type& impl, - IoControlCommand& command, asio::error_code& ec) - { - service_impl_.io_control(impl, command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the descriptor. - bool non_blocking(const implementation_type& impl) const - { - return service_impl_.non_blocking(impl); - } - - /// Sets the non-blocking mode of the descriptor. - ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native descriptor implementation. - bool native_non_blocking(const implementation_type& impl) const - { - return service_impl_.native_non_blocking(impl); - } - - /// Sets the non-blocking mode of the native descriptor implementation. - ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.native_non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the descriptor to become ready to read, ready to write, or to - /// have pending error conditions. - ASIO_SYNC_OP_VOID wait(implementation_type& impl, - descriptor_base::wait_type w, asio::error_code& ec) - { - service_impl_.wait(impl, w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the descriptor to become ready to read, ready to - /// write, or to have pending error conditions. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, descriptor_base::wait_type w, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, w, init.completion_handler); - - return init.result.get(); - } - - /// Write the given data to the stream. - template - std::size_t write_some(implementation_type& impl, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.write_some(impl, buffers, ec); - } - - /// Start an asynchronous write. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(implementation_type& impl, - const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_write_some(impl, buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the stream. - template - std::size_t read_some(implementation_type& impl, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.read_some(impl, buffers, ec); - } - - /// Start an asynchronous read. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(implementation_type& impl, - const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_read_some(impl, buffers, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace posix -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_POSIX_STREAM_DESCRIPTOR) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_POSIX_STREAM_DESCRIPTOR_SERVICE_HPP diff --git a/scout_sdk/asio/asio/post.hpp b/scout_sdk/asio/asio/post.hpp deleted file mode 100644 index 87d7b96..0000000 --- a/scout_sdk/asio/asio/post.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// -// post.hpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_POST_HPP -#define ASIO_POST_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/execution_context.hpp" -#include "asio/is_executor.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Submits a completion token or function object for execution. -/** - * This function submits an object for execution using the object's associated - * executor. The function object is queued for execution, and is never called - * from the current thread prior to returning from post(). - * - * This function has the following effects: - * - * @li Constructs a function object handler of type @c Handler, initialized - * with handler(forward(token)). - * - * @li Constructs an object @c result of type async_result, - * initializing the object as result(handler). - * - * @li Obtains the handler's associated executor object @c ex by performing - * get_associated_executor(handler). - * - * @li Obtains the handler's associated allocator object @c alloc by performing - * get_associated_allocator(handler). - * - * @li Performs ex.post(std::move(handler), alloc). - * - * @li Returns result.get(). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( - ASIO_MOVE_ARG(CompletionToken) token); - -/// Submits a completion token or function object for execution. -/** - * This function submits an object for execution using the specified executor. - * The function object is queued for execution, and is never called from the - * current thread prior to returning from post(). - * - * This function has the following effects: - * - * @li Constructs a function object handler of type @c Handler, initialized - * with handler(forward(token)). - * - * @li Constructs an object @c result of type async_result, - * initializing the object as result(handler). - * - * @li Obtains the handler's associated executor object @c ex1 by performing - * get_associated_executor(handler). - * - * @li Creates a work object @c w by performing make_work(ex1). - * - * @li Obtains the handler's associated allocator object @c alloc by performing - * get_associated_allocator(handler). - * - * @li Constructs a function object @c f with a function call operator that - * performs ex1.dispatch(std::move(handler), alloc) followed by - * w.reset(). - * - * @li Performs Executor(ex).post(std::move(f), alloc). - * - * @li Returns result.get(). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( - const Executor& ex, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type* = 0); - -/// Submits a completion token or function object for execution. -/** - * @returns post(ctx.get_executor(), forward(token)). - */ -template -ASIO_INITFN_RESULT_TYPE(CompletionToken, void()) post( - ExecutionContext& ctx, ASIO_MOVE_ARG(CompletionToken) token, - typename enable_if::value>::type* = 0); - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/post.hpp" - -#endif // ASIO_POST_HPP diff --git a/scout_sdk/asio/asio/raw_socket_service.hpp b/scout_sdk/asio/asio/raw_socket_service.hpp deleted file mode 100644 index 2bccf03..0000000 --- a/scout_sdk/asio/asio/raw_socket_service.hpp +++ /dev/null @@ -1,466 +0,0 @@ -// -// raw_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_RAW_SOCKET_SERVICE_HPP -#define ASIO_RAW_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/null_socket_service.hpp" -#elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_socket_service.hpp" -#else -# include "asio/detail/reactive_socket_service.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a raw socket. -template -class raw_socket_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_WINDOWS_RUNTIME) - typedef detail::null_socket_service service_impl_type; -#elif defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#else - typedef detail::reactive_socket_service service_impl_type; -#endif - -public: - /// The type of a raw socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native socket type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new raw socket service for the specified io_context. - explicit raw_socket_service(asio::io_context& io_context) - : asio::detail::service_base< - raw_socket_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new raw socket implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new raw socket implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another raw socket implementation. - void move_assign(implementation_type& impl, - raw_socket_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } - - // All socket services have access to each other's implementations. - template friend class raw_socket_service; - - /// Move-construct a new raw socket implementation from another protocol - /// type. - template - void converting_move_construct(implementation_type& impl, - raw_socket_service& other_service, - typename raw_socket_service< - Protocol1>::implementation_type& other_impl, - typename enable_if::value>::type* = 0) - { - service_impl_.template converting_move_construct( - impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a raw socket implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - // Open a new raw socket implementation. - ASIO_SYNC_OP_VOID open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - if (protocol.type() == ASIO_OS_DEF(SOCK_RAW)) - service_impl_.open(impl, protocol, ec); - else - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native socket to a raw socket. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_socket, - asio::error_code& ec) - { - service_impl_.assign(impl, protocol, native_socket, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a raw socket implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Release ownership of the underlying socket. - native_handle_type release(implementation_type& impl, - asio::error_code& ec) - { - return service_impl_.release(impl, ec); - } - - /// Get the native socket implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the socket. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is at the out-of-band data mark. - bool at_mark(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.at_mark(impl, ec); - } - - /// Determine the number of bytes available for reading. - std::size_t available(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.available(impl, ec); - } - - // Bind the raw socket to the specified local endpoint. - ASIO_SYNC_OP_VOID bind(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - service_impl_.bind(impl, endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Connect the raw socket to the specified endpoint. - ASIO_SYNC_OP_VOID connect(implementation_type& impl, - const endpoint_type& peer_endpoint, asio::error_code& ec) - { - service_impl_.connect(impl, peer_endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous connect. - template - ASIO_INITFN_RESULT_TYPE(ConnectHandler, - void (asio::error_code)) - async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, - ASIO_MOVE_ARG(ConnectHandler) handler) - { - async_completion init(handler); - - service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); - - return init.result.get(); - } - - /// Set a socket option. - template - ASIO_SYNC_OP_VOID set_option(implementation_type& impl, - const SettableSocketOption& option, asio::error_code& ec) - { - service_impl_.set_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get a socket option. - template - ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, - GettableSocketOption& option, asio::error_code& ec) const - { - service_impl_.get_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the socket. - template - ASIO_SYNC_OP_VOID io_control(implementation_type& impl, - IoControlCommand& command, asio::error_code& ec) - { - service_impl_.io_control(impl, command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the socket. - bool non_blocking(const implementation_type& impl) const - { - return service_impl_.non_blocking(impl); - } - - /// Sets the non-blocking mode of the socket. - ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const implementation_type& impl) const - { - return service_impl_.native_non_blocking(impl); - } - - /// Sets the non-blocking mode of the native socket implementation. - ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.native_non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.local_endpoint(impl, ec); - } - - /// Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.remote_endpoint(impl, ec); - } - - /// Disable sends or receives on the socket. - ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, - socket_base::shutdown_type what, asio::error_code& ec) - { - service_impl_.shutdown(impl, what, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the socket to become ready to read, ready to write, or to have - /// pending error conditions. - ASIO_SYNC_OP_VOID wait(implementation_type& impl, - socket_base::wait_type w, asio::error_code& ec) - { - service_impl_.wait(impl, w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the socket to become ready to read, ready to - /// write, or to have pending error conditions. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, socket_base::wait_type w, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, w, init.completion_handler); - - return init.result.get(); - } - - /// Send the given data to the peer. - template - std::size_t send(implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.send(impl, buffers, flags, ec); - } - - /// Start an asynchronous send. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(implementation_type& impl, const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - async_completion init(handler); - - service_impl_.async_send(impl, buffers, flags, init.completion_handler); - - return init.result.get(); - } - - /// Send raw data to the specified endpoint. - template - std::size_t send_to(implementation_type& impl, - const ConstBufferSequence& buffers, const endpoint_type& destination, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.send_to(impl, buffers, destination, flags, ec); - } - - /// Start an asynchronous send. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send_to(implementation_type& impl, - const ConstBufferSequence& buffers, const endpoint_type& destination, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - async_completion init(handler); - - service_impl_.async_send_to(impl, buffers, - destination, flags, init.completion_handler); - - return init.result.get(); - } - - /// Receive some data from the peer. - template - std::size_t receive(implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.receive(impl, buffers, flags, ec); - } - - /// Start an asynchronous receive. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - async_completion init(handler); - - service_impl_.async_receive(impl, buffers, flags, init.completion_handler); - - return init.result.get(); - } - - /// Receive raw data with the endpoint of the sender. - template - std::size_t receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.receive_from(impl, buffers, sender_endpoint, flags, - ec); - } - - /// Start an asynchronous receive that will get the endpoint of the sender. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive_from(implementation_type& impl, - const MutableBufferSequence& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - async_completion init(handler); - - service_impl_.async_receive_from(impl, buffers, - sender_endpoint, flags, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_RAW_SOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/read.hpp b/scout_sdk/asio/asio/read.hpp deleted file mode 100644 index e77206a..0000000 --- a/scout_sdk/asio/asio/read.hpp +++ /dev/null @@ -1,947 +0,0 @@ -// -// read.hpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_READ_HPP -#define ASIO_READ_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/buffer.hpp" -#include "asio/error.hpp" - -#if !defined(ASIO_NO_EXTENSIONS) -# include "asio/basic_streambuf_fwd.hpp" -#endif // !defined(ASIO_NO_EXTENSIONS) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/** - * @defgroup read asio::read - * - * @brief Attempt to read a certain amount of data from a stream before - * returning. - */ -/*@{*/ - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read(s, asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, buffers, - * asio::transfer_all()); @endcode - */ -template -std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - typename enable_if< - is_mutable_buffer_sequence::value - >::type* = 0); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read(s, asio::buffer(data, size), ec); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, buffers, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - asio::error_code& ec, - typename enable_if< - is_mutable_buffer_sequence::value - >::type* = 0); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's read_some function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read(s, asio::buffer(data, size), - * asio::transfer_at_least(32)); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, - typename enable_if< - is_mutable_buffer_sequence::value - >::type* = 0); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's read_some function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_mutable_buffer_sequence::value - >::type* = 0); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The specified dynamic buffer sequence is full (that is, it has reached - * maximum size). - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, buffers, - * asio::transfer_all()); @endcode - */ -template -std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffer is full (that is, it has reached maximum size). - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, buffers, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The specified dynamic buffer sequence is full (that is, it has reached - * maximum size). - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's read_some function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - */ -template -std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The specified dynamic buffer sequence is full (that is, it has reached - * maximum size). - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's read_some function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t read(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffer is full (that is, it has reached maximum size). - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, b, - * asio::transfer_all()); @endcode - */ -template -std::size_t read(SyncReadStream& s, basic_streambuf& b); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffer is full (that is, it has reached maximum size). - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, b, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t read(SyncReadStream& s, basic_streambuf& b, - asio::error_code& ec); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffer is full (that is, it has reached maximum size). - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's read_some function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - */ -template -std::size_t read(SyncReadStream& s, basic_streambuf& b, - CompletionCondition completion_condition); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffer is full (that is, it has reached maximum size). - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's read_some function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t read(SyncReadStream& s, basic_streambuf& b, - CompletionCondition completion_condition, asio::error_code& ec); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ -/** - * @defgroup async_read asio::async_read - * - * @brief Start an asynchronous operation to read a certain amount of data from - * a stream. - */ -/*@{*/ - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other read operations (such - * as async_read, the stream's async_read_some function, or any other composed - * operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. Although the buffers object may be copied as necessary, ownership of - * the underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into the - * // buffers. If an error occurred, - * // this will be the number of - * // bytes successfully transferred - * // prior to the error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * asio::async_read(s, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::async_read( - * s, buffers, - * asio::transfer_all(), - * handler); @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_mutable_buffer_sequence::value - >::type* = 0); - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. Although the buffers object may be copied as necessary, ownership of - * the underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's async_read_some function. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into the - * // buffers. If an error occurred, - * // this will be the number of - * // bytes successfully transferred - * // prior to the error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::async_read(s, - * asio::buffer(data, size), - * asio::transfer_at_least(32), - * handler); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_mutable_buffer_sequence::value - >::type* = 0); - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The specified dynamic buffer sequence is full (that is, it has reached - * maximum size). - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other read operations (such - * as async_read, the stream's async_read_some function, or any other composed - * operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into the - * // buffers. If an error occurred, - * // this will be the number of - * // bytes successfully transferred - * // prior to the error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note This overload is equivalent to calling: - * @code asio::async_read( - * s, buffers, - * asio::transfer_all(), - * handler); @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The specified dynamic buffer sequence is full (that is, it has reached - * maximum size). - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other read operations (such - * as async_read, the stream's async_read_some function, or any other composed - * operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's async_read_some function. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into the - * // buffers. If an error occurred, - * // this will be the number of - * // bytes successfully transferred - * // prior to the error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The supplied buffer is full (that is, it has reached maximum size). - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other read operations (such - * as async_read, the stream's async_read_some function, or any other composed - * operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param b A basic_streambuf object into which the data will be read. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into the - * // buffers. If an error occurred, - * // this will be the number of - * // bytes successfully transferred - * // prior to the error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note This overload is equivalent to calling: - * @code asio::async_read( - * s, b, - * asio::transfer_all(), - * handler); @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, basic_streambuf& b, - ASIO_MOVE_ARG(ReadHandler) handler); - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The supplied buffer is full (that is, it has reached maximum size). - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other read operations (such - * as async_read, the stream's async_read_some function, or any other composed - * operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param b A basic_streambuf object into which the data will be read. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_read_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the stream's async_read_some function. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into the - * // buffers. If an error occurred, - * // this will be the number of - * // bytes successfully transferred - * // prior to the error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read(AsyncReadStream& s, basic_streambuf& b, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/read.hpp" - -#endif // ASIO_READ_HPP diff --git a/scout_sdk/asio/asio/read_at.hpp b/scout_sdk/asio/asio/read_at.hpp deleted file mode 100644 index df2c628..0000000 --- a/scout_sdk/asio/asio/read_at.hpp +++ /dev/null @@ -1,671 +0,0 @@ -// -// read_at.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_READ_AT_HPP -#define ASIO_READ_AT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/detail/cstdint.hpp" -#include "asio/error.hpp" - -#if !defined(ASIO_NO_EXTENSIONS) -# include "asio/basic_streambuf_fwd.hpp" -#endif // !defined(ASIO_NO_EXTENSIONS) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/** - * @defgroup read_at asio::read_at - * - * @brief Attempt to read a certain amount of data at the specified offset - * before returning. - */ -/*@{*/ - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * device. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read_at(d, 42, asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::read_at( - * d, 42, buffers, - * asio::transfer_all()); @endcode - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers); - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * device. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read_at(d, 42, - * asio::buffer(data, size), ec); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::read_at( - * d, 42, buffers, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - asio::error_code& ec); - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * device. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the device's read_some_at function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read_at(d, 42, asio::buffer(data, size), - * asio::transfer_at_least(32)); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - CompletionCondition completion_condition); - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * device. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the device's read_some_at function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::read_at( - * d, 42, b, - * asio::transfer_all()); @endcode - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, basic_streambuf& b); - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @note This overload is equivalent to calling: - * @code asio::read_at( - * d, 42, b, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, basic_streambuf& b, - asio::error_code& ec); - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the device's read_some_at function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, basic_streambuf& b, - CompletionCondition completion_condition); - -/// Attempt to read a certain amount of data at the specified offset before -/// returning. -/** - * This function is used to read a certain number of bytes of data from a - * random access device at the specified offset. The call will block until one - * of the following conditions is true: - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the SyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest read_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the device's read_some_at function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t read_at(SyncRandomAccessReadDevice& d, - uint64_t offset, basic_streambuf& b, - CompletionCondition completion_condition, asio::error_code& ec); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ -/** - * @defgroup async_read_at asio::async_read_at - * - * @brief Start an asynchronous operation to read a certain amount of data at - * the specified offset. - */ -/*@{*/ - -/// Start an asynchronous operation to read a certain amount of data at the -/// specified offset. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a random access device at the specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * async_read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the AsyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * device. Although the buffers object may be copied as necessary, ownership of - * the underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes copied into the buffers. If an error - * // occurred, this will be the number of bytes successfully - * // transferred prior to the error. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * asio::async_read_at(d, 42, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::async_read_at( - * d, 42, buffers, - * asio::transfer_all(), - * handler); @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, - const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler); - -/// Start an asynchronous operation to read a certain amount of data at the -/// specified offset. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a random access device at the specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * @param d The device from which the data is to be read. The type must support - * the AsyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * device. Although the buffers object may be copied as necessary, ownership of - * the underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_read_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the device's async_read_some_at function. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes copied into the buffers. If an error - * // occurred, this will be the number of bytes successfully - * // transferred prior to the error. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::async_read_at(d, 42, - * asio::buffer(data, size), - * asio::transfer_at_least(32), - * handler); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, - uint64_t offset, const MutableBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Start an asynchronous operation to read a certain amount of data at the -/// specified offset. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a random access device at the specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * async_read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the AsyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param b A basic_streambuf object into which the data will be read. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes copied into the buffers. If an error - * // occurred, this will be the number of bytes successfully - * // transferred prior to the error. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note This overload is equivalent to calling: - * @code asio::async_read_at( - * d, 42, b, - * asio::transfer_all(), - * handler); @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, uint64_t offset, - basic_streambuf& b, ASIO_MOVE_ARG(ReadHandler) handler); - -/// Start an asynchronous operation to read a certain amount of data at the -/// specified offset. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a random access device at the specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * async_read_some_at function. - * - * @param d The device from which the data is to be read. The type must support - * the AsyncRandomAccessReadDevice concept. - * - * @param offset The offset at which the data will be read. - * - * @param b A basic_streambuf object into which the data will be read. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_read_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the read operation is complete. A non-zero - * return value indicates the maximum number of bytes to be read on the next - * call to the device's async_read_some_at function. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes copied into the buffers. If an error - * // occurred, this will be the number of bytes successfully - * // transferred prior to the error. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_at(AsyncRandomAccessReadDevice& d, - uint64_t offset, basic_streambuf& b, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(ReadHandler) handler); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/read_at.hpp" - -#endif // ASIO_READ_AT_HPP diff --git a/scout_sdk/asio/asio/read_until.hpp b/scout_sdk/asio/asio/read_until.hpp deleted file mode 100644 index f413d98..0000000 --- a/scout_sdk/asio/asio/read_until.hpp +++ /dev/null @@ -1,1824 +0,0 @@ -// -// read_until.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_READ_UNTIL_HPP -#define ASIO_READ_UNTIL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include -#include "asio/async_result.hpp" -#include "asio/detail/regex_fwd.hpp" -#include "asio/detail/string_view.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" - -#if !defined(ASIO_NO_EXTENSIONS) -# include "asio/basic_streambuf_fwd.hpp" -#endif // !defined(ASIO_NO_EXTENSIONS) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -namespace detail -{ - char (&has_result_type_helper(...))[2]; - - template - char has_result_type_helper(T*, typename T::result_type* = 0); - - template - struct has_result_type - { - enum { value = (sizeof((has_result_type_helper)((T*)(0))) == 1) }; - }; -} // namespace detail - -/// Type trait used to determine whether a type can be used as a match condition -/// function with read_until and async_read_until. -template -struct is_match_condition -{ -#if defined(GENERATING_DOCUMENTATION) - /// The value member is true if the type may be used as a match condition. - static const bool value; -#else - enum - { - value = asio::is_function< - typename asio::remove_pointer::type>::value - || detail::has_result_type::value - }; -#endif -}; - -/** - * @defgroup read_until asio::read_until - * - * @brief Read data into a dynamic buffer sequence, or into a streambuf, until - * it contains a delimiter, matches a regular expression, or a function object - * indicates a match. - */ -/*@{*/ - -/// Read data into a dynamic buffer sequence until it contains a specified -/// delimiter. -/** - * This function is used to read data into the specified dynamic buffer - * sequence until the dynamic buffer sequence's get area contains the specified - * delimiter. The call will block until one of the following conditions is - * true: - * - * @li The get area of the dynamic buffer sequence contains the specified - * delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the dynamic buffer sequence's get area already - * contains the delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @param delim The delimiter character. - * - * @returns The number of bytes in the dynamic buffer sequence's get area up to - * and including the delimiter. - * - * @throws asio::system_error Thrown on failure. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond the delimiter. An application will - * typically leave that data in the dynamic buffer sequence for a subsequent - * read_until operation to examine. - * - * @par Example - * To read data into a @c std::string until a newline is encountered: - * @code std::string data; - * std::string n = asio::read_until(s, - * asio::dynamic_buffer(data), '\n'); - * std::string line = data.substr(0, n); - * data.erase(0, n); @endcode - * After the @c read_until operation completes successfully, the string @c data - * contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode - * The call to @c substr then extracts the data up to and including the - * delimiter, so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\n' } @endcode - * After the call to @c erase, the remaining data is left in the buffer @c b as - * follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c read_until operation. - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, char delim); - -/// Read data into a dynamic buffer sequence until it contains a specified -/// delimiter. -/** - * This function is used to read data into the specified dynamic buffer - * sequence until the dynamic buffer sequence's get area contains the specified - * delimiter. The call will block until one of the following conditions is - * true: - * - * @li The get area of the dynamic buffer sequence contains the specified - * delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the dynamic buffer sequence's get area already - * contains the delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @param delim The delimiter character. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the dynamic buffer sequence's get area up to - * and including the delimiter. Returns 0 if an error occurred. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond the delimiter. An application will - * typically leave that data in the dynamic buffer sequence for a subsequent - * read_until operation to examine. - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - char delim, asio::error_code& ec); - -/// Read data into a dynamic buffer sequence until it contains a specified -/// delimiter. -/** - * This function is used to read data into the specified dynamic buffer - * sequence until the dynamic buffer sequence's get area contains the specified - * delimiter. The call will block until one of the following conditions is - * true: - * - * @li The get area of the dynamic buffer sequence contains the specified - * delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the dynamic buffer sequence's get area already - * contains the delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @param delim The delimiter string. - * - * @returns The number of bytes in the dynamic buffer sequence's get area up to - * and including the delimiter. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond the delimiter. An application will - * typically leave that data in the dynamic buffer sequence for a subsequent - * read_until operation to examine. - * - * @par Example - * To read data into a @c std::string until a CR-LF sequence is encountered: - * @code std::string data; - * std::string n = asio::read_until(s, - * asio::dynamic_buffer(data), "\r\n"); - * std::string line = data.substr(0, n); - * data.erase(0, n); @endcode - * After the @c read_until operation completes successfully, the string @c data - * contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c substr then extracts the data up to and including the - * delimiter, so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode - * After the call to @c erase, the remaining data is left in the buffer @c b as - * follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c read_until operation. - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_STRING_VIEW_PARAM delim); - -/// Read data into a dynamic buffer sequence until it contains a specified -/// delimiter. -/** - * This function is used to read data into the specified dynamic buffer - * sequence until the dynamic buffer sequence's get area contains the specified - * delimiter. The call will block until one of the following conditions is - * true: - * - * @li The get area of the dynamic buffer sequence contains the specified - * delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the dynamic buffer sequence's get area already - * contains the delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * - * @param delim The delimiter string. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the dynamic buffer sequence's get area up to - * and including the delimiter. Returns 0 if an error occurred. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond the delimiter. An application will - * typically leave that data in the dynamic buffer sequence for a subsequent - * read_until operation to examine. - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_STRING_VIEW_PARAM delim, - asio::error_code& ec); - -#if !defined(ASIO_NO_EXTENSIONS) -#if defined(ASIO_HAS_BOOST_REGEX) \ - || defined(GENERATING_DOCUMENTATION) - -/// Read data into a dynamic buffer sequence until some part of the data it -/// contains matches a regular expression. -/** - * This function is used to read data into the specified dynamic buffer - * sequence until the dynamic buffer sequence's get area contains some data - * that matches a regular expression. The call will block until one of the - * following conditions is true: - * - * @li A substring of the dynamic buffer sequence's get area matches the - * regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the dynamic buffer sequence's get area already - * contains data that matches the regular expression, the function returns - * immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers A dynamic buffer sequence into which the data will be read. - * - * @param expr The regular expression. - * - * @returns The number of bytes in the dynamic buffer sequence's get area up to - * and including the substring that matches the regular expression. - * - * @throws asio::system_error Thrown on failure. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond that which matched the regular - * expression. An application will typically leave that data in the dynamic - * buffer sequence for a subsequent read_until operation to examine. - * - * @par Example - * To read data into a @c std::string until a CR-LF sequence is encountered: - * @code std::string data; - * std::string n = asio::read_until(s, - * asio::dynamic_buffer(data), boost::regex("\r\n")); - * std::string line = data.substr(0, n); - * data.erase(0, n); @endcode - * After the @c read_until operation completes successfully, the string @c data - * contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c substr then extracts the data up to and including the - * delimiter, so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode - * After the call to @c erase, the remaining data is left in the buffer @c b as - * follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c read_until operation. - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - const boost::regex& expr); - -/// Read data into a dynamic buffer sequence until some part of the data it -/// contains matches a regular expression. -/** - * This function is used to read data into the specified dynamic buffer - * sequence until the dynamic buffer sequence's get area contains some data - * that matches a regular expression. The call will block until one of the - * following conditions is true: - * - * @li A substring of the dynamic buffer sequence's get area matches the - * regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the dynamic buffer sequence's get area already - * contains data that matches the regular expression, the function returns - * immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers A dynamic buffer sequence into which the data will be read. - * - * @param expr The regular expression. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the dynamic buffer sequence's get area up to - * and including the substring that matches the regular expression. Returns 0 - * if an error occurred. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond that which matched the regular - * expression. An application will typically leave that data in the dynamic - * buffer sequence for a subsequent read_until operation to examine. - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - const boost::regex& expr, asio::error_code& ec); - -#endif // defined(ASIO_HAS_BOOST_REGEX) - // || defined(GENERATING_DOCUMENTATION) - -/// Read data into a dynamic buffer sequence until a function object indicates a -/// match. - -/** - * This function is used to read data into the specified dynamic buffer - * sequence until a user-defined match condition function object, when applied - * to the data contained in the dynamic buffer sequence, indicates a successful - * match. The call will block until one of the following conditions is true: - * - * @li The match condition function object returns a std::pair where the second - * element evaluates to true. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the match condition function object already indicates - * a match, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers A dynamic buffer sequence into which the data will be read. - * - * @param match_condition The function object to be called to determine whether - * a match exists. The signature of the function object must be: - * @code pair match_condition(iterator begin, iterator end); - * @endcode - * where @c iterator represents the type: - * @code buffers_iterator - * @endcode - * The iterator parameters @c begin and @c end define the range of bytes to be - * scanned to determine whether there is a match. The @c first member of the - * return value is an iterator marking one-past-the-end of the bytes that have - * been consumed by the match function. This iterator is used to calculate the - * @c begin parameter for any subsequent invocation of the match condition. The - * @c second member of the return value is true if a match has been found, false - * otherwise. - * - * @returns The number of bytes in the dynamic_buffer's get area that - * have been fully consumed by the match function. - * - * @throws asio::system_error Thrown on failure. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond that which matched the function object. - * An application will typically leave that data in the dynamic buffer sequence - * for a subsequent read_until operation to examine. - - * @note The default implementation of the @c is_match_condition type trait - * evaluates to true for function pointers and function objects with a - * @c result_type typedef. It must be specialised for other user-defined - * function objects. - * - * @par Examples - * To read data into a dynamic buffer sequence until whitespace is encountered: - * @code typedef asio::buffers_iterator< - * asio::const_buffers_1> iterator; - * - * std::pair - * match_whitespace(iterator begin, iterator end) - * { - * iterator i = begin; - * while (i != end) - * if (std::isspace(*i++)) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * ... - * std::string data; - * asio::read_until(s, data, match_whitespace); - * @endcode - * - * To read data into a @c std::string until a matching character is found: - * @code class match_char - * { - * public: - * explicit match_char(char c) : c_(c) {} - * - * template - * std::pair operator()( - * Iterator begin, Iterator end) const - * { - * Iterator i = begin; - * while (i != end) - * if (c_ == *i++) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * - * private: - * char c_; - * }; - * - * namespace asio { - * template <> struct is_match_condition - * : public boost::true_type {}; - * } // namespace asio - * ... - * std::string data; - * asio::read_until(s, data, match_char('a')); - * @endcode - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - MatchCondition match_condition, - typename enable_if::value>::type* = 0); - -/// Read data into a dynamic buffer sequence until a function object indicates a -/// match. -/** - * This function is used to read data into the specified dynamic buffer - * sequence until a user-defined match condition function object, when applied - * to the data contained in the dynamic buffer sequence, indicates a successful - * match. The call will block until one of the following conditions is true: - * - * @li The match condition function object returns a std::pair where the second - * element evaluates to true. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the match condition function object already indicates - * a match, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param buffers A dynamic buffer sequence into which the data will be read. - * - * @param match_condition The function object to be called to determine whether - * a match exists. The signature of the function object must be: - * @code pair match_condition(iterator begin, iterator end); - * @endcode - * where @c iterator represents the type: - * @code buffers_iterator - * @endcode - * The iterator parameters @c begin and @c end define the range of bytes to be - * scanned to determine whether there is a match. The @c first member of the - * return value is an iterator marking one-past-the-end of the bytes that have - * been consumed by the match function. This iterator is used to calculate the - * @c begin parameter for any subsequent invocation of the match condition. The - * @c second member of the return value is true if a match has been found, false - * otherwise. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the dynamic buffer sequence's get area that - * have been fully consumed by the match function. Returns 0 if an error - * occurred. - * - * @note After a successful read_until operation, the dynamic buffer sequence - * may contain additional data beyond that which matched the function object. - * An application will typically leave that data in the dynamic buffer sequence - * for a subsequent read_until operation to examine. - * - * @note The default implementation of the @c is_match_condition type trait - * evaluates to true for function pointers and function objects with a - * @c result_type typedef. It must be specialised for other user-defined - * function objects. - */ -template -std::size_t read_until(SyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - MatchCondition match_condition, asio::error_code& ec, - typename enable_if::value>::type* = 0); - -#if !defined(ASIO_NO_IOSTREAM) - -/// Read data into a streambuf until it contains a specified delimiter. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter character. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. - * - * @throws asio::system_error Thrown on failure. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond the delimiter. An application will typically leave - * that data in the streambuf for a subsequent read_until operation to examine. - * - * @par Example - * To read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * asio::read_until(s, b, '\n'); - * std::istream is(&b); - * std::string line; - * std::getline(is, line); @endcode - * After the @c read_until operation completes successfully, the buffer @c b - * contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode - * The call to @c std::getline then extracts the data up to and including the - * newline (which is discarded), so that the string @c line contains: - * @code { 'a', 'b', ..., 'c' } @endcode - * The remaining data is left in the buffer @c b as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c read_until operation. - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, char delim); - -/// Read data into a streambuf until it contains a specified delimiter. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter character. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. Returns 0 if an error occurred. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond the delimiter. An application will typically leave - * that data in the streambuf for a subsequent read_until operation to examine. - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, char delim, - asio::error_code& ec); - -/// Read data into a streambuf until it contains a specified delimiter. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter string. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. - * - * @throws asio::system_error Thrown on failure. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond the delimiter. An application will typically leave - * that data in the streambuf for a subsequent read_until operation to examine. - * - * @par Example - * To read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * asio::read_until(s, b, "\r\n"); - * std::istream is(&b); - * std::string line; - * std::getline(is, line); @endcode - * After the @c read_until operation completes successfully, the buffer @c b - * contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c std::getline then extracts the data up to and including the - * newline (which is discarded), so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r' } @endcode - * The remaining data is left in the buffer @c b as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c read_until operation. - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, - ASIO_STRING_VIEW_PARAM delim); - -/// Read data into a streambuf until it contains a specified delimiter. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter string. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. Returns 0 if an error occurred. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond the delimiter. An application will typically leave - * that data in the streambuf for a subsequent read_until operation to examine. - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, - ASIO_STRING_VIEW_PARAM delim, asio::error_code& ec); - -#if defined(ASIO_HAS_BOOST_REGEX) \ - || defined(GENERATING_DOCUMENTATION) - -/// Read data into a streambuf until some part of the data it contains matches -/// a regular expression. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains some data that matches a regular expression. - * The call will block until one of the following conditions is true: - * - * @li A substring of the streambuf's get area matches the regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains data that - * matches the regular expression, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param expr The regular expression. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the substring that matches the regular expression. - * - * @throws asio::system_error Thrown on failure. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond that which matched the regular expression. An - * application will typically leave that data in the streambuf for a subsequent - * read_until operation to examine. - * - * @par Example - * To read data into a streambuf until a CR-LF sequence is encountered: - * @code asio::streambuf b; - * asio::read_until(s, b, boost::regex("\r\n")); - * std::istream is(&b); - * std::string line; - * std::getline(is, line); @endcode - * After the @c read_until operation completes successfully, the buffer @c b - * contains the data which matched the regular expression: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c std::getline then extracts the data up to and including the - * newline (which is discarded), so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r' } @endcode - * The remaining data is left in the buffer @c b as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c read_until operation. - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, const boost::regex& expr); - -/// Read data into a streambuf until some part of the data it contains matches -/// a regular expression. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains some data that matches a regular expression. - * The call will block until one of the following conditions is true: - * - * @li A substring of the streambuf's get area matches the regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains data that - * matches the regular expression, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param expr The regular expression. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the substring that matches the regular expression. Returns 0 if an error - * occurred. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond that which matched the regular expression. An - * application will typically leave that data in the streambuf for a subsequent - * read_until operation to examine. - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, const boost::regex& expr, - asio::error_code& ec); - -#endif // defined(ASIO_HAS_BOOST_REGEX) - // || defined(GENERATING_DOCUMENTATION) - -/// Read data into a streambuf until a function object indicates a match. -/** - * This function is used to read data into the specified streambuf until a - * user-defined match condition function object, when applied to the data - * contained in the streambuf, indicates a successful match. The call will - * block until one of the following conditions is true: - * - * @li The match condition function object returns a std::pair where the second - * element evaluates to true. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the match condition function object already indicates - * a match, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param match_condition The function object to be called to determine whether - * a match exists. The signature of the function object must be: - * @code pair match_condition(iterator begin, iterator end); - * @endcode - * where @c iterator represents the type: - * @code buffers_iterator::const_buffers_type> - * @endcode - * The iterator parameters @c begin and @c end define the range of bytes to be - * scanned to determine whether there is a match. The @c first member of the - * return value is an iterator marking one-past-the-end of the bytes that have - * been consumed by the match function. This iterator is used to calculate the - * @c begin parameter for any subsequent invocation of the match condition. The - * @c second member of the return value is true if a match has been found, false - * otherwise. - * - * @returns The number of bytes in the streambuf's get area that have been fully - * consumed by the match function. - * - * @throws asio::system_error Thrown on failure. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond that which matched the function object. An application - * will typically leave that data in the streambuf for a subsequent read_until - * operation to examine. - * - * @note The default implementation of the @c is_match_condition type trait - * evaluates to true for function pointers and function objects with a - * @c result_type typedef. It must be specialised for other user-defined - * function objects. - * - * @par Examples - * To read data into a streambuf until whitespace is encountered: - * @code typedef asio::buffers_iterator< - * asio::streambuf::const_buffers_type> iterator; - * - * std::pair - * match_whitespace(iterator begin, iterator end) - * { - * iterator i = begin; - * while (i != end) - * if (std::isspace(*i++)) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * ... - * asio::streambuf b; - * asio::read_until(s, b, match_whitespace); - * @endcode - * - * To read data into a streambuf until a matching character is found: - * @code class match_char - * { - * public: - * explicit match_char(char c) : c_(c) {} - * - * template - * std::pair operator()( - * Iterator begin, Iterator end) const - * { - * Iterator i = begin; - * while (i != end) - * if (c_ == *i++) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * - * private: - * char c_; - * }; - * - * namespace asio { - * template <> struct is_match_condition - * : public boost::true_type {}; - * } // namespace asio - * ... - * asio::streambuf b; - * asio::read_until(s, b, match_char('a')); - * @endcode - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, MatchCondition match_condition, - typename enable_if::value>::type* = 0); - -/// Read data into a streambuf until a function object indicates a match. -/** - * This function is used to read data into the specified streambuf until a - * user-defined match condition function object, when applied to the data - * contained in the streambuf, indicates a successful match. The call will - * block until one of the following conditions is true: - * - * @li The match condition function object returns a std::pair where the second - * element evaluates to true. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the match condition function object already indicates - * a match, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the SyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param match_condition The function object to be called to determine whether - * a match exists. The signature of the function object must be: - * @code pair match_condition(iterator begin, iterator end); - * @endcode - * where @c iterator represents the type: - * @code buffers_iterator::const_buffers_type> - * @endcode - * The iterator parameters @c begin and @c end define the range of bytes to be - * scanned to determine whether there is a match. The @c first member of the - * return value is an iterator marking one-past-the-end of the bytes that have - * been consumed by the match function. This iterator is used to calculate the - * @c begin parameter for any subsequent invocation of the match condition. The - * @c second member of the return value is true if a match has been found, false - * otherwise. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes in the streambuf's get area that have been fully - * consumed by the match function. Returns 0 if an error occurred. - * - * @note After a successful read_until operation, the streambuf may contain - * additional data beyond that which matched the function object. An application - * will typically leave that data in the streambuf for a subsequent read_until - * operation to examine. - * - * @note The default implementation of the @c is_match_condition type trait - * evaluates to true for function pointers and function objects with a - * @c result_type typedef. It must be specialised for other user-defined - * function objects. - */ -template -std::size_t read_until(SyncReadStream& s, - asio::basic_streambuf& b, - MatchCondition match_condition, asio::error_code& ec, - typename enable_if::value>::type* = 0); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ -/** - * @defgroup async_read_until asio::async_read_until - * - * @brief Start an asynchronous operation to read data into a dynamic buffer - * sequence, or into a streambuf, until it contains a delimiter, matches a - * regular expression, or a function object indicates a match. - */ -/*@{*/ - -/// Start an asynchronous operation to read data into a dynamic buffer sequence -/// until it contains a specified delimiter. -/** - * This function is used to asynchronously read data into the specified dynamic - * buffer sequence until the dynamic buffer sequence's get area contains the - * specified delimiter. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li The get area of the dynamic buffer sequence contains the specified - * delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the dynamic buffer sequence's get area already contains the delimiter, this - * asynchronous operation completes immediately. The program must ensure that - * the stream performs no other read operations (such as async_read, - * async_read_until, the stream's async_read_some function, or any other - * composed operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param delim The delimiter character. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the dynamic buffer sequence's - * // get area up to and including the delimiter. - * // 0 if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the dynamic buffer - * sequence may contain additional data beyond the delimiter. An application - * will typically leave that data in the dynamic buffer sequence for a - * subsequent async_read_until operation to examine. - * - * @par Example - * To asynchronously read data into a @c std::string until a newline is - * encountered: - * @code std::string data; - * ... - * void handler(const asio::error_code& e, std::size_t size) - * { - * if (!e) - * { - * std::string line = data.substr(0, n); - * data.erase(0, n); - * ... - * } - * } - * ... - * asio::async_read_until(s, data, '\n', handler); @endcode - * After the @c async_read_until operation completes successfully, the buffer - * @c data contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode - * The call to @c substr then extracts the data up to and including the - * delimiter, so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\n' } @endcode - * After the call to @c erase, the remaining data is left in the buffer @c data - * as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c async_read_until operation. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - char delim, ASIO_MOVE_ARG(ReadHandler) handler); - -/// Start an asynchronous operation to read data into a dynamic buffer sequence -/// until it contains a specified delimiter. -/** - * This function is used to asynchronously read data into the specified dynamic - * buffer sequence until the dynamic buffer sequence's get area contains the - * specified delimiter. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li The get area of the dynamic buffer sequence contains the specified - * delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the dynamic buffer sequence's get area already contains the delimiter, this - * asynchronous operation completes immediately. The program must ensure that - * the stream performs no other read operations (such as async_read, - * async_read_until, the stream's async_read_some function, or any other - * composed operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param delim The delimiter string. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the dynamic buffer sequence's - * // get area up to and including the delimiter. - * // 0 if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the dynamic buffer - * sequence may contain additional data beyond the delimiter. An application - * will typically leave that data in the dynamic buffer sequence for a - * subsequent async_read_until operation to examine. - * - * @par Example - * To asynchronously read data into a @c std::string until a CR-LF sequence is - * encountered: - * @code std::string data; - * ... - * void handler(const asio::error_code& e, std::size_t size) - * { - * if (!e) - * { - * std::string line = data.substr(0, n); - * data.erase(0, n); - * ... - * } - * } - * ... - * asio::async_read_until(s, data, "\r\n", handler); @endcode - * After the @c async_read_until operation completes successfully, the string - * @c data contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c substr then extracts the data up to and including the - * delimiter, so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode - * After the call to @c erase, the remaining data is left in the string @c data - * as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c async_read_until operation. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_STRING_VIEW_PARAM delim, - ASIO_MOVE_ARG(ReadHandler) handler); - -#if !defined(ASIO_NO_EXTENSIONS) -#if defined(ASIO_HAS_BOOST_REGEX) \ - || defined(GENERATING_DOCUMENTATION) - -/// Start an asynchronous operation to read data into a dynamic buffer sequence -/// until some part of its data matches a regular expression. -/** - * This function is used to asynchronously read data into the specified dynamic - * buffer sequence until the dynamic buffer sequence's get area contains some - * data that matches a regular expression. The function call always returns - * immediately. The asynchronous operation will continue until one of the - * following conditions is true: - * - * @li A substring of the dynamic buffer sequence's get area matches the regular - * expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the dynamic buffer sequence's get area already contains data that matches - * the regular expression, this asynchronous operation completes immediately. - * The program must ensure that the stream performs no other read operations - * (such as async_read, async_read_until, the stream's async_read_some - * function, or any other composed operations that perform reads) until this - * operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param expr The regular expression. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the dynamic buffer - * // sequence's get area up to and including the - * // substring that matches the regular expression. - * // 0 if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the dynamic buffer - * sequence may contain additional data beyond that which matched the regular - * expression. An application will typically leave that data in the dynamic - * buffer sequence for a subsequent async_read_until operation to examine. - * - * @par Example - * To asynchronously read data into a @c std::string until a CR-LF sequence is - * encountered: - * @code std::string data; - * ... - * void handler(const asio::error_code& e, std::size_t size) - * { - * if (!e) - * { - * std::string line = data.substr(0, n); - * data.erase(0, n); - * ... - * } - * } - * ... - * asio::async_read_until(s, data, - * boost::regex("\r\n"), handler); @endcode - * After the @c async_read_until operation completes successfully, the string - * @c data contains the data which matched the regular expression: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c substr then extracts the data up to and including the match, - * so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r', '\n' } @endcode - * After the call to @c erase, the remaining data is left in the string @c data - * as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c async_read_until operation. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - const boost::regex& expr, - ASIO_MOVE_ARG(ReadHandler) handler); - -#endif // defined(ASIO_HAS_BOOST_REGEX) - // || defined(GENERATING_DOCUMENTATION) - -/// Start an asynchronous operation to read data into a dynamic buffer sequence -/// until a function object indicates a match. -/** - * This function is used to asynchronously read data into the specified dynamic - * buffer sequence until a user-defined match condition function object, when - * applied to the data contained in the dynamic buffer sequence, indicates a - * successful match. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li The match condition function object returns a std::pair where the second - * element evaluates to true. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the match condition function object already indicates a match, this - * asynchronous operation completes immediately. The program must ensure that - * the stream performs no other read operations (such as async_read, - * async_read_until, the stream's async_read_some function, or any other - * composed operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param buffers The dynamic buffer sequence into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param match_condition The function object to be called to determine whether - * a match exists. The signature of the function object must be: - * @code pair match_condition(iterator begin, iterator end); - * @endcode - * where @c iterator represents the type: - * @code buffers_iterator - * @endcode - * The iterator parameters @c begin and @c end define the range of bytes to be - * scanned to determine whether there is a match. The @c first member of the - * return value is an iterator marking one-past-the-end of the bytes that have - * been consumed by the match function. This iterator is used to calculate the - * @c begin parameter for any subsequent invocation of the match condition. The - * @c second member of the return value is true if a match has been found, false - * otherwise. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the dynamic buffer sequence's - * // get area that have been fully consumed by the match - * // function. O if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the dynamic buffer - * sequence may contain additional data beyond that which matched the function - * object. An application will typically leave that data in the dynamic buffer - * sequence for a subsequent async_read_until operation to examine. - * - * @note The default implementation of the @c is_match_condition type trait - * evaluates to true for function pointers and function objects with a - * @c result_type typedef. It must be specialised for other user-defined - * function objects. - * - * @par Examples - * To asynchronously read data into a @c std::string until whitespace is - * encountered: - * @code typedef asio::buffers_iterator< - * asio::const_buffers_1> iterator; - * - * std::pair - * match_whitespace(iterator begin, iterator end) - * { - * iterator i = begin; - * while (i != end) - * if (std::isspace(*i++)) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * ... - * void handler(const asio::error_code& e, std::size_t size); - * ... - * std::string data; - * asio::async_read_until(s, data, match_whitespace, handler); - * @endcode - * - * To asynchronously read data into a @c std::string until a matching character - * is found: - * @code class match_char - * { - * public: - * explicit match_char(char c) : c_(c) {} - * - * template - * std::pair operator()( - * Iterator begin, Iterator end) const - * { - * Iterator i = begin; - * while (i != end) - * if (c_ == *i++) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * - * private: - * char c_; - * }; - * - * namespace asio { - * template <> struct is_match_condition - * : public boost::true_type {}; - * } // namespace asio - * ... - * void handler(const asio::error_code& e, std::size_t size); - * ... - * std::string data; - * asio::async_read_until(s, data, match_char('a'), handler); - * @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if::value>::type* = 0); - -#if !defined(ASIO_NO_IOSTREAM) - -/// Start an asynchronous operation to read data into a streambuf until it -/// contains a specified delimiter. -/** - * This function is used to asynchronously read data into the specified - * streambuf until the streambuf's get area contains the specified delimiter. - * The function call always returns immediately. The asynchronous operation - * will continue until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the streambuf's get area already contains the delimiter, this asynchronous - * operation completes immediately. The program must ensure that the stream - * performs no other read operations (such as async_read, async_read_until, the - * stream's async_read_some function, or any other composed operations that - * perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. Ownership of - * the streambuf is retained by the caller, which must guarantee that it remains - * valid until the handler is called. - * - * @param delim The delimiter character. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the streambuf's get - * // area up to and including the delimiter. - * // 0 if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the streambuf may - * contain additional data beyond the delimiter. An application will typically - * leave that data in the streambuf for a subsequent async_read_until operation - * to examine. - * - * @par Example - * To asynchronously read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * ... - * void handler(const asio::error_code& e, std::size_t size) - * { - * if (!e) - * { - * std::istream is(&b); - * std::string line; - * std::getline(is, line); - * ... - * } - * } - * ... - * asio::async_read_until(s, b, '\n', handler); @endcode - * After the @c async_read_until operation completes successfully, the buffer - * @c b contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\n', 'd', 'e', ... } @endcode - * The call to @c std::getline then extracts the data up to and including the - * newline (which is discarded), so that the string @c line contains: - * @code { 'a', 'b', ..., 'c' } @endcode - * The remaining data is left in the buffer @c b as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c async_read_until operation. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, - char delim, ASIO_MOVE_ARG(ReadHandler) handler); - -/// Start an asynchronous operation to read data into a streambuf until it -/// contains a specified delimiter. -/** - * This function is used to asynchronously read data into the specified - * streambuf until the streambuf's get area contains the specified delimiter. - * The function call always returns immediately. The asynchronous operation - * will continue until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the streambuf's get area already contains the delimiter, this asynchronous - * operation completes immediately. The program must ensure that the stream - * performs no other read operations (such as async_read, async_read_until, the - * stream's async_read_some function, or any other composed operations that - * perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. Ownership of - * the streambuf is retained by the caller, which must guarantee that it remains - * valid until the handler is called. - * - * @param delim The delimiter string. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the streambuf's get - * // area up to and including the delimiter. - * // 0 if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the streambuf may - * contain additional data beyond the delimiter. An application will typically - * leave that data in the streambuf for a subsequent async_read_until operation - * to examine. - * - * @par Example - * To asynchronously read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * ... - * void handler(const asio::error_code& e, std::size_t size) - * { - * if (!e) - * { - * std::istream is(&b); - * std::string line; - * std::getline(is, line); - * ... - * } - * } - * ... - * asio::async_read_until(s, b, "\r\n", handler); @endcode - * After the @c async_read_until operation completes successfully, the buffer - * @c b contains the delimiter: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c std::getline then extracts the data up to and including the - * newline (which is discarded), so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r' } @endcode - * The remaining data is left in the buffer @c b as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c async_read_until operation. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, - ASIO_STRING_VIEW_PARAM delim, - ASIO_MOVE_ARG(ReadHandler) handler); - -#if defined(ASIO_HAS_BOOST_REGEX) \ - || defined(GENERATING_DOCUMENTATION) - -/// Start an asynchronous operation to read data into a streambuf until some -/// part of its data matches a regular expression. -/** - * This function is used to asynchronously read data into the specified - * streambuf until the streambuf's get area contains some data that matches a - * regular expression. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li A substring of the streambuf's get area matches the regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the streambuf's get area already contains data that matches the regular - * expression, this asynchronous operation completes immediately. The program - * must ensure that the stream performs no other read operations (such as - * async_read, async_read_until, the stream's async_read_some function, or any - * other composed operations that perform reads) until this operation - * completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. Ownership of - * the streambuf is retained by the caller, which must guarantee that it remains - * valid until the handler is called. - * - * @param expr The regular expression. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the streambuf's get - * // area up to and including the substring - * // that matches the regular. expression. - * // 0 if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the streambuf may - * contain additional data beyond that which matched the regular expression. An - * application will typically leave that data in the streambuf for a subsequent - * async_read_until operation to examine. - * - * @par Example - * To asynchronously read data into a streambuf until a CR-LF sequence is - * encountered: - * @code asio::streambuf b; - * ... - * void handler(const asio::error_code& e, std::size_t size) - * { - * if (!e) - * { - * std::istream is(&b); - * std::string line; - * std::getline(is, line); - * ... - * } - * } - * ... - * asio::async_read_until(s, b, boost::regex("\r\n"), handler); @endcode - * After the @c async_read_until operation completes successfully, the buffer - * @c b contains the data which matched the regular expression: - * @code { 'a', 'b', ..., 'c', '\r', '\n', 'd', 'e', ... } @endcode - * The call to @c std::getline then extracts the data up to and including the - * newline (which is discarded), so that the string @c line contains: - * @code { 'a', 'b', ..., 'c', '\r' } @endcode - * The remaining data is left in the buffer @c b as follows: - * @code { 'd', 'e', ... } @endcode - * This data may be the start of a new line, to be extracted by a subsequent - * @c async_read_until operation. - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, const boost::regex& expr, - ASIO_MOVE_ARG(ReadHandler) handler); - -#endif // defined(ASIO_HAS_BOOST_REGEX) - // || defined(GENERATING_DOCUMENTATION) - -/// Start an asynchronous operation to read data into a streambuf until a -/// function object indicates a match. -/** - * This function is used to asynchronously read data into the specified - * streambuf until a user-defined match condition function object, when applied - * to the data contained in the streambuf, indicates a successful match. The - * function call always returns immediately. The asynchronous operation will - * continue until one of the following conditions is true: - * - * @li The match condition function object returns a std::pair where the second - * element evaluates to true. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function, and is known as a composed operation. If - * the match condition function object already indicates a match, this - * asynchronous operation completes immediately. The program must ensure that - * the stream performs no other read operations (such as async_read, - * async_read_until, the stream's async_read_some function, or any other - * composed operations that perform reads) until this operation completes. - * - * @param s The stream from which the data is to be read. The type must support - * the AsyncReadStream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param match_condition The function object to be called to determine whether - * a match exists. The signature of the function object must be: - * @code pair match_condition(iterator begin, iterator end); - * @endcode - * where @c iterator represents the type: - * @code buffers_iterator::const_buffers_type> - * @endcode - * The iterator parameters @c begin and @c end define the range of bytes to be - * scanned to determine whether there is a match. The @c first member of the - * return value is an iterator marking one-past-the-end of the bytes that have - * been consumed by the match function. This iterator is used to calculate the - * @c begin parameter for any subsequent invocation of the match condition. The - * @c second member of the return value is true if a match has been found, false - * otherwise. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // The number of bytes in the streambuf's get - * // area that have been fully consumed by the - * // match function. O if an error occurred. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note After a successful async_read_until operation, the streambuf may - * contain additional data beyond that which matched the function object. An - * application will typically leave that data in the streambuf for a subsequent - * async_read_until operation to examine. - * - * @note The default implementation of the @c is_match_condition type trait - * evaluates to true for function pointers and function objects with a - * @c result_type typedef. It must be specialised for other user-defined - * function objects. - * - * @par Examples - * To asynchronously read data into a streambuf until whitespace is encountered: - * @code typedef asio::buffers_iterator< - * asio::streambuf::const_buffers_type> iterator; - * - * std::pair - * match_whitespace(iterator begin, iterator end) - * { - * iterator i = begin; - * while (i != end) - * if (std::isspace(*i++)) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * ... - * void handler(const asio::error_code& e, std::size_t size); - * ... - * asio::streambuf b; - * asio::async_read_until(s, b, match_whitespace, handler); - * @endcode - * - * To asynchronously read data into a streambuf until a matching character is - * found: - * @code class match_char - * { - * public: - * explicit match_char(char c) : c_(c) {} - * - * template - * std::pair operator()( - * Iterator begin, Iterator end) const - * { - * Iterator i = begin; - * while (i != end) - * if (c_ == *i++) - * return std::make_pair(i, true); - * return std::make_pair(i, false); - * } - * - * private: - * char c_; - * }; - * - * namespace asio { - * template <> struct is_match_condition - * : public boost::true_type {}; - * } // namespace asio - * ... - * void handler(const asio::error_code& e, std::size_t size); - * ... - * asio::streambuf b; - * asio::async_read_until(s, b, match_char('a'), handler); - * @endcode - */ -template -ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) -async_read_until(AsyncReadStream& s, - asio::basic_streambuf& b, - MatchCondition match_condition, ASIO_MOVE_ARG(ReadHandler) handler, - typename enable_if::value>::type* = 0); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/read_until.hpp" - -#endif // ASIO_READ_UNTIL_HPP diff --git a/scout_sdk/asio/asio/seq_packet_socket_service.hpp b/scout_sdk/asio/asio/seq_packet_socket_service.hpp deleted file mode 100644 index 7e6824d..0000000 --- a/scout_sdk/asio/asio/seq_packet_socket_service.hpp +++ /dev/null @@ -1,416 +0,0 @@ -// -// seq_packet_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SEQ_PACKET_SOCKET_SERVICE_HPP -#define ASIO_SEQ_PACKET_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/null_socket_service.hpp" -#elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_socket_service.hpp" -#else -# include "asio/detail/reactive_socket_service.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a sequenced packet socket. -template -class seq_packet_socket_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base< - seq_packet_socket_service > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_WINDOWS_RUNTIME) - typedef detail::null_socket_service service_impl_type; -#elif defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#else - typedef detail::reactive_socket_service service_impl_type; -#endif - -public: - /// The type of a sequenced packet socket implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native socket type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new sequenced packet socket service for the specified - /// io_context. - explicit seq_packet_socket_service(asio::io_context& io_context) - : asio::detail::service_base< - seq_packet_socket_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new sequenced packet socket implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new sequenced packet socket implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another sequenced packet socket implementation. - void move_assign(implementation_type& impl, - seq_packet_socket_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } - - // All socket services have access to each other's implementations. - template friend class seq_packet_socket_service; - - /// Move-construct a new sequenced packet socket implementation from another - /// protocol type. - template - void converting_move_construct(implementation_type& impl, - seq_packet_socket_service& other_service, - typename seq_packet_socket_service< - Protocol1>::implementation_type& other_impl, - typename enable_if::value>::type* = 0) - { - service_impl_.template converting_move_construct( - impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a sequenced packet socket implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Open a sequenced packet socket. - ASIO_SYNC_OP_VOID open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - if (protocol.type() == ASIO_OS_DEF(SOCK_SEQPACKET)) - service_impl_.open(impl, protocol, ec); - else - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native socket to a sequenced packet socket. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_socket, - asio::error_code& ec) - { - service_impl_.assign(impl, protocol, native_socket, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a sequenced packet socket implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Release ownership of the underlying socket. - native_handle_type release(implementation_type& impl, - asio::error_code& ec) - { - return service_impl_.release(impl, ec); - } - - /// Get the native socket implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the socket. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is at the out-of-band data mark. - bool at_mark(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.at_mark(impl, ec); - } - - /// Determine the number of bytes available for reading. - std::size_t available(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.available(impl, ec); - } - - /// Bind the sequenced packet socket to the specified local endpoint. - ASIO_SYNC_OP_VOID bind(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - service_impl_.bind(impl, endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Connect the sequenced packet socket to the specified endpoint. - ASIO_SYNC_OP_VOID connect(implementation_type& impl, - const endpoint_type& peer_endpoint, asio::error_code& ec) - { - service_impl_.connect(impl, peer_endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous connect. - template - ASIO_INITFN_RESULT_TYPE(ConnectHandler, - void (asio::error_code)) - async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, - ASIO_MOVE_ARG(ConnectHandler) handler) - { - async_completion init(handler); - - service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); - - return init.result.get(); - } - - /// Set a socket option. - template - ASIO_SYNC_OP_VOID set_option(implementation_type& impl, - const SettableSocketOption& option, asio::error_code& ec) - { - service_impl_.set_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get a socket option. - template - ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, - GettableSocketOption& option, asio::error_code& ec) const - { - service_impl_.get_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the socket. - template - ASIO_SYNC_OP_VOID io_control(implementation_type& impl, - IoControlCommand& command, asio::error_code& ec) - { - service_impl_.io_control(impl, command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the socket. - bool non_blocking(const implementation_type& impl) const - { - return service_impl_.non_blocking(impl); - } - - /// Sets the non-blocking mode of the socket. - ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const implementation_type& impl) const - { - return service_impl_.native_non_blocking(impl); - } - - /// Sets the non-blocking mode of the native socket implementation. - ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.native_non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.local_endpoint(impl, ec); - } - - /// Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.remote_endpoint(impl, ec); - } - - /// Disable sends or receives on the socket. - ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, - socket_base::shutdown_type what, asio::error_code& ec) - { - service_impl_.shutdown(impl, what, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the socket to become ready to read, ready to write, or to have - /// pending error conditions. - ASIO_SYNC_OP_VOID wait(implementation_type& impl, - socket_base::wait_type w, asio::error_code& ec) - { - service_impl_.wait(impl, w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the socket to become ready to read, ready to - /// write, or to have pending error conditions. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, socket_base::wait_type w, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, w, init.completion_handler); - - return init.result.get(); - } - - /// Send the given data to the peer. - template - std::size_t send(implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.send(impl, buffers, flags, ec); - } - - /// Start an asynchronous send. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - async_completion init(handler); - - service_impl_.async_send(impl, buffers, flags, init.completion_handler); - - return init.result.get(); - } - - /// Receive some data from the peer. - template - std::size_t receive(implementation_type& impl, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, asio::error_code& ec) - { - return service_impl_.receive_with_flags(impl, - buffers, in_flags, out_flags, ec); - } - - /// Start an asynchronous receive. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(implementation_type& impl, - const MutableBufferSequence& buffers, socket_base::message_flags in_flags, - socket_base::message_flags& out_flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - async_completion init(handler); - - service_impl_.async_receive_with_flags(impl, - buffers, in_flags, out_flags, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_SEQ_PACKET_SOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/serial_port.hpp b/scout_sdk/asio/asio/serial_port.hpp deleted file mode 100644 index 27bb63e..0000000 --- a/scout_sdk/asio/asio/serial_port.hpp +++ /dev/null @@ -1,769 +0,0 @@ -// -// serial_port.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SERIAL_PORT_HPP -#define ASIO_SERIAL_PORT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_SERIAL_PORT) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/async_result.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/serial_port_base.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/basic_serial_port.hpp" -#else // defined(ASIO_ENABLE_OLD_SERVICES) -# if defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_serial_port_service.hpp" -# define ASIO_SVC_T detail::win_iocp_serial_port_service -# else -# include "asio/detail/reactive_serial_port_service.hpp" -# define ASIO_SVC_T detail::reactive_serial_port_service -# endif -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if defined(ASIO_ENABLE_OLD_SERVICES) -// Typedef for the typical usage of a serial port. -typedef basic_serial_port<> serial_port; -#else // defined(ASIO_ENABLE_OLD_SERVICES) -/// Provides serial port functionality. -/** - * The serial_port class provides a wrapper over serial port functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class serial_port - : ASIO_SVC_ACCESS basic_io_object, - public serial_port_base -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The native representation of a serial port. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef ASIO_SVC_T::native_handle_type native_handle_type; -#endif - - /// A basic_serial_port is always the lowest layer. - typedef serial_port lowest_layer_type; - - /// Construct a serial_port without opening it. - /** - * This constructor creates a serial port without opening it. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - */ - explicit serial_port(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct and open a serial_port. - /** - * This constructor creates and opens a serial port for the specified device - * name. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - * - * @param device The platform-specific device name for this serial - * port. - */ - explicit serial_port(asio::io_context& io_context, - const char* device) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), device, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Construct and open a serial_port. - /** - * This constructor creates and opens a serial port for the specified device - * name. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - * - * @param device The platform-specific device name for this serial - * port. - */ - explicit serial_port(asio::io_context& io_context, - const std::string& device) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), device, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Construct a serial_port on an existing native serial port. - /** - * This constructor creates a serial port object to hold an existing native - * serial port. - * - * @param io_context The io_context object that the serial port will use to - * dispatch handlers for any asynchronous operations performed on the port. - * - * @param native_serial_port A native serial port. - * - * @throws asio::system_error Thrown on failure. - */ - serial_port(asio::io_context& io_context, - const native_handle_type& native_serial_port) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_serial_port, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a serial_port from another. - /** - * This constructor moves a serial port from one object to another. - * - * @param other The other serial_port object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c serial_port(io_context&) constructor. - */ - serial_port(serial_port&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign a serial_port from another. - /** - * This assignment operator moves a serial port from one object to another. - * - * @param other The other serial_port object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c serial_port(io_context&) constructor. - */ - serial_port& operator=(serial_port&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroys the serial port. - /** - * This function destroys the serial port, cancelling any outstanding - * asynchronous wait operations associated with the serial port as if by - * calling @c cancel. - */ - ~serial_port() - { - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since a serial_port cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since a serial_port cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } - - /// Open the serial port using the specified device name. - /** - * This function opens the serial port for the specified device name. - * - * @param device The platform-specific device name. - * - * @throws asio::system_error Thrown on failure. - */ - void open(const std::string& device) - { - asio::error_code ec; - this->get_service().open(this->get_implementation(), device, ec); - asio::detail::throw_error(ec, "open"); - } - - /// Open the serial port using the specified device name. - /** - * This function opens the serial port using the given platform-specific - * device name. - * - * @param device The platform-specific device name. - * - * @param ec Set the indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID open(const std::string& device, - asio::error_code& ec) - { - this->get_service().open(this->get_implementation(), device, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native serial port to the serial port. - /* - * This function opens the serial port to hold an existing native serial port. - * - * @param native_serial_port A native serial port. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const native_handle_type& native_serial_port) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), - native_serial_port, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native serial port to the serial port. - /* - * This function opens the serial port to hold an existing native serial port. - * - * @param native_serial_port A native serial port. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const native_handle_type& native_serial_port, - asio::error_code& ec) - { - this->get_service().assign(this->get_implementation(), - native_serial_port, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the serial port is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the serial port. - /** - * This function is used to close the serial port. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the serial port. - /** - * This function is used to close the serial port. Any asynchronous read or - * write operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native serial port representation. - /** - * This function may be used to obtain the underlying representation of the - * serial port. This is intended to allow access to native serial port - * functionality that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the serial port. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the serial port. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Send a break sequence to the serial port. - /** - * This function causes a break sequence of platform-specific duration to be - * sent out the serial port. - * - * @throws asio::system_error Thrown on failure. - */ - void send_break() - { - asio::error_code ec; - this->get_service().send_break(this->get_implementation(), ec); - asio::detail::throw_error(ec, "send_break"); - } - - /// Send a break sequence to the serial port. - /** - * This function causes a break sequence of platform-specific duration to be - * sent out the serial port. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID send_break(asio::error_code& ec) - { - this->get_service().send_break(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Set an option on the serial port. - /** - * This function is used to set an option on the serial port. - * - * @param option The option value to be set on the serial port. - * - * @throws asio::system_error Thrown on failure. - * - * @sa SettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - void set_option(const SettableSerialPortOption& option) - { - asio::error_code ec; - this->get_service().set_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "set_option"); - } - - /// Set an option on the serial port. - /** - * This function is used to set an option on the serial port. - * - * @param option The option value to be set on the serial port. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa SettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - ASIO_SYNC_OP_VOID set_option(const SettableSerialPortOption& option, - asio::error_code& ec) - { - this->get_service().set_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get an option from the serial port. - /** - * This function is used to get the current value of an option on the serial - * port. - * - * @param option The option value to be obtained from the serial port. - * - * @throws asio::system_error Thrown on failure. - * - * @sa GettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - void get_option(GettableSerialPortOption& option) - { - asio::error_code ec; - this->get_service().get_option(this->get_implementation(), option, ec); - asio::detail::throw_error(ec, "get_option"); - } - - /// Get an option from the serial port. - /** - * This function is used to get the current value of an option on the serial - * port. - * - * @param option The option value to be obtained from the serial port. - * - * @param ec Set to indicate what error occurred, if any. - * - * @sa GettableSerialPortOption @n - * asio::serial_port_base::baud_rate @n - * asio::serial_port_base::flow_control @n - * asio::serial_port_base::parity @n - * asio::serial_port_base::stop_bits @n - * asio::serial_port_base::character_size - */ - template - ASIO_SYNC_OP_VOID get_option(GettableSerialPortOption& option, - asio::error_code& ec) - { - this->get_service().get_option(this->get_implementation(), option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Write some data to the serial port. - /** - * This function is used to write data to the serial port. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the serial port. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "write_some"); - return s; - } - - /// Write some data to the serial port. - /** - * This function is used to write data to the serial port. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the serial port. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().write_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the serial port. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the serial port. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - async_completion init(handler); - - this->get_service().async_write_some( - this->get_implementation(), buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the serial port. - /** - * This function is used to read data from the serial port. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "read_some"); - return s; - } - - /// Read some data from the serial port. - /** - * This function is used to read data from the serial port. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().read_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the serial port. - * The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * serial_port.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - async_completion init(handler); - - this->get_service().async_read_some( - this->get_implementation(), buffers, init.completion_handler); - - return init.result.get(); - } -}; -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) -# undef ASIO_SVC_T -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // defined(ASIO_HAS_SERIAL_PORT) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_SERIAL_PORT_HPP diff --git a/scout_sdk/asio/asio/serial_port_base.hpp b/scout_sdk/asio/asio/serial_port_base.hpp deleted file mode 100644 index feb5b9d..0000000 --- a/scout_sdk/asio/asio/serial_port_base.hpp +++ /dev/null @@ -1,167 +0,0 @@ -// -// serial_port_base.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2008 Rep Invariant Systems, Inc. (info@repinvariant.com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SERIAL_PORT_BASE_HPP -#define ASIO_SERIAL_PORT_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_SERIAL_PORT) \ - || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) -# include -#endif // !defined(ASIO_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/socket_types.hpp" -#include "asio/error_code.hpp" - -#if defined(GENERATING_DOCUMENTATION) -# define ASIO_OPTION_STORAGE implementation_defined -#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__) -# define ASIO_OPTION_STORAGE DCB -#else -# define ASIO_OPTION_STORAGE termios -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// The serial_port_base class is used as a base for the basic_serial_port class -/// template so that we have a common place to define the serial port options. -class serial_port_base -{ -public: - /// Serial port option to permit changing the baud rate. - /** - * Implements changing the baud rate for a given serial port. - */ - class baud_rate - { - public: - explicit baud_rate(unsigned int rate = 0); - unsigned int value() const; - ASIO_DECL ASIO_SYNC_OP_VOID store( - ASIO_OPTION_STORAGE& storage, - asio::error_code& ec) const; - ASIO_DECL ASIO_SYNC_OP_VOID load( - const ASIO_OPTION_STORAGE& storage, - asio::error_code& ec); - private: - unsigned int value_; - }; - - /// Serial port option to permit changing the flow control. - /** - * Implements changing the flow control for a given serial port. - */ - class flow_control - { - public: - enum type { none, software, hardware }; - ASIO_DECL explicit flow_control(type t = none); - type value() const; - ASIO_DECL ASIO_SYNC_OP_VOID store( - ASIO_OPTION_STORAGE& storage, - asio::error_code& ec) const; - ASIO_DECL ASIO_SYNC_OP_VOID load( - const ASIO_OPTION_STORAGE& storage, - asio::error_code& ec); - private: - type value_; - }; - - /// Serial port option to permit changing the parity. - /** - * Implements changing the parity for a given serial port. - */ - class parity - { - public: - enum type { none, odd, even }; - ASIO_DECL explicit parity(type t = none); - type value() const; - ASIO_DECL ASIO_SYNC_OP_VOID store( - ASIO_OPTION_STORAGE& storage, - asio::error_code& ec) const; - ASIO_DECL ASIO_SYNC_OP_VOID load( - const ASIO_OPTION_STORAGE& storage, - asio::error_code& ec); - private: - type value_; - }; - - /// Serial port option to permit changing the number of stop bits. - /** - * Implements changing the number of stop bits for a given serial port. - */ - class stop_bits - { - public: - enum type { one, onepointfive, two }; - ASIO_DECL explicit stop_bits(type t = one); - type value() const; - ASIO_DECL ASIO_SYNC_OP_VOID store( - ASIO_OPTION_STORAGE& storage, - asio::error_code& ec) const; - ASIO_DECL ASIO_SYNC_OP_VOID load( - const ASIO_OPTION_STORAGE& storage, - asio::error_code& ec); - private: - type value_; - }; - - /// Serial port option to permit changing the character size. - /** - * Implements changing the character size for a given serial port. - */ - class character_size - { - public: - ASIO_DECL explicit character_size(unsigned int t = 8); - unsigned int value() const; - ASIO_DECL ASIO_SYNC_OP_VOID store( - ASIO_OPTION_STORAGE& storage, - asio::error_code& ec) const; - ASIO_DECL ASIO_SYNC_OP_VOID load( - const ASIO_OPTION_STORAGE& storage, - asio::error_code& ec); - private: - unsigned int value_; - }; - -protected: - /// Protected destructor to prevent deletion through this type. - ~serial_port_base() - { - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#undef ASIO_OPTION_STORAGE - -#include "asio/impl/serial_port_base.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/serial_port_base.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // defined(ASIO_HAS_SERIAL_PORT) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_SERIAL_PORT_BASE_HPP diff --git a/scout_sdk/asio/asio/serial_port_service.hpp b/scout_sdk/asio/asio/serial_port_service.hpp deleted file mode 100644 index 0e20d96..0000000 --- a/scout_sdk/asio/asio/serial_port_service.hpp +++ /dev/null @@ -1,249 +0,0 @@ -// -// serial_port_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SERIAL_PORT_SERVICE_HPP -#define ASIO_SERIAL_PORT_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_SERIAL_PORT) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include -#include "asio/async_result.hpp" -#include "asio/detail/reactive_serial_port_service.hpp" -#include "asio/detail/win_iocp_serial_port_service.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" -#include "asio/serial_port_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a serial port. -class serial_port_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_serial_port_service service_impl_type; -#else - typedef detail::reactive_serial_port_service service_impl_type; -#endif - -public: - /// The type of a serial port implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef service_impl_type::implementation_type implementation_type; -#endif - - /// The native handle type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new serial port service for the specified io_context. - explicit serial_port_service(asio::io_context& io_context) - : asio::detail::service_base(io_context), - service_impl_(io_context) - { - } - - /// Construct a new serial port implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new serial port implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another serial port implementation. - void move_assign(implementation_type& impl, - serial_port_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a serial port implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Open a serial port. - ASIO_SYNC_OP_VOID open(implementation_type& impl, - const std::string& device, asio::error_code& ec) - { - service_impl_.open(impl, device, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native handle to a serial port. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec) - { - service_impl_.assign(impl, handle, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the handle is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a serial port implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native handle implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the handle. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Set a serial port option. - template - ASIO_SYNC_OP_VOID set_option(implementation_type& impl, - const SettableSerialPortOption& option, asio::error_code& ec) - { - service_impl_.set_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get a serial port option. - template - ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, - GettableSerialPortOption& option, asio::error_code& ec) const - { - service_impl_.get_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Send a break sequence to the serial port. - ASIO_SYNC_OP_VOID send_break(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.send_break(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Write the given data to the stream. - template - std::size_t write_some(implementation_type& impl, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.write_some(impl, buffers, ec); - } - - /// Start an asynchronous write. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(implementation_type& impl, - const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - async_completion init(handler); - - service_impl_.async_write_some(impl, buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the stream. - template - std::size_t read_some(implementation_type& impl, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.read_some(impl, buffers, ec); - } - - /// Start an asynchronous read. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(implementation_type& impl, - const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - async_completion init(handler); - - service_impl_.async_read_some(impl, buffers, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_SERIAL_PORT) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_SERIAL_PORT_SERVICE_HPP diff --git a/scout_sdk/asio/asio/signal_set.hpp b/scout_sdk/asio/asio/signal_set.hpp deleted file mode 100644 index 30e5c4e..0000000 --- a/scout_sdk/asio/asio/signal_set.hpp +++ /dev/null @@ -1,447 +0,0 @@ -// -// signal_set.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SIGNAL_SET_HPP -#define ASIO_SIGNAL_SET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/async_result.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/basic_signal_set.hpp" -#else // defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/detail/signal_set_service.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -namespace asio { - -#if defined(ASIO_ENABLE_OLD_SERVICES) -// Typedef for the typical usage of a signal set. -typedef basic_signal_set<> signal_set; -#else // defined(ASIO_ENABLE_OLD_SERVICES) -/// Provides signal functionality. -/** - * The signal_set class provides the ability to perform an asynchronous wait - * for one or more signals to occur. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Example - * Performing an asynchronous wait: - * @code - * void handler( - * const asio::error_code& error, - * int signal_number) - * { - * if (!error) - * { - * // A signal occurred. - * } - * } - * - * ... - * - * // Construct a signal set registered for process termination. - * asio::signal_set signals(io_context, SIGINT, SIGTERM); - * - * // Start an asynchronous wait for one of the signals to occur. - * signals.async_wait(handler); - * @endcode - * - * @par Queueing of signal notifications - * - * If a signal is registered with a signal_set, and the signal occurs when - * there are no waiting handlers, then the signal notification is queued. The - * next async_wait operation on that signal_set will dequeue the notification. - * If multiple notifications are queued, subsequent async_wait operations - * dequeue them one at a time. Signal notifications are dequeued in order of - * ascending signal number. - * - * If a signal number is removed from a signal_set (using the @c remove or @c - * erase member functions) then any queued notifications for that signal are - * discarded. - * - * @par Multiple registration of signals - * - * The same signal number may be registered with different signal_set objects. - * When the signal occurs, one handler is called for each signal_set object. - * - * Note that multiple registration only works for signals that are registered - * using Asio. The application must not also register a signal handler using - * functions such as @c signal() or @c sigaction(). - * - * @par Signal masking on POSIX platforms - * - * POSIX allows signals to be blocked using functions such as @c sigprocmask() - * and @c pthread_sigmask(). For signals to be delivered, programs must ensure - * that any signals registered using signal_set objects are unblocked in at - * least one thread. - */ -class signal_set - : ASIO_SVC_ACCESS basic_io_object -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// Construct a signal set without adding any signals. - /** - * This constructor creates a signal set without registering for any signals. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - */ - explicit signal_set(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct a signal set and add one signal. - /** - * This constructor creates a signal set and registers for one signal. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - * - * @param signal_number_1 The signal number to be added. - * - * @note This constructor is equivalent to performing: - * @code asio::signal_set signals(io_context); - * signals.add(signal_number_1); @endcode - */ - signal_set(asio::io_context& io_context, int signal_number_1) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number_1, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Construct a signal set and add two signals. - /** - * This constructor creates a signal set and registers for two signals. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - * - * @param signal_number_1 The first signal number to be added. - * - * @param signal_number_2 The second signal number to be added. - * - * @note This constructor is equivalent to performing: - * @code asio::signal_set signals(io_context); - * signals.add(signal_number_1); - * signals.add(signal_number_2); @endcode - */ - signal_set(asio::io_context& io_context, int signal_number_1, - int signal_number_2) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number_1, ec); - asio::detail::throw_error(ec, "add"); - this->get_service().add(this->get_implementation(), signal_number_2, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Construct a signal set and add three signals. - /** - * This constructor creates a signal set and registers for three signals. - * - * @param io_context The io_context object that the signal set will use to - * dispatch handlers for any asynchronous operations performed on the set. - * - * @param signal_number_1 The first signal number to be added. - * - * @param signal_number_2 The second signal number to be added. - * - * @param signal_number_3 The third signal number to be added. - * - * @note This constructor is equivalent to performing: - * @code asio::signal_set signals(io_context); - * signals.add(signal_number_1); - * signals.add(signal_number_2); - * signals.add(signal_number_3); @endcode - */ - signal_set(asio::io_context& io_context, int signal_number_1, - int signal_number_2, int signal_number_3) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number_1, ec); - asio::detail::throw_error(ec, "add"); - this->get_service().add(this->get_implementation(), signal_number_2, ec); - asio::detail::throw_error(ec, "add"); - this->get_service().add(this->get_implementation(), signal_number_3, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Destroys the signal set. - /** - * This function destroys the signal set, cancelling any outstanding - * asynchronous wait operations associated with the signal set as if by - * calling @c cancel. - */ - ~signal_set() - { - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } - - /// Add a signal to a signal_set. - /** - * This function adds the specified signal to the set. It has no effect if the - * signal is already in the set. - * - * @param signal_number The signal to be added to the set. - * - * @throws asio::system_error Thrown on failure. - */ - void add(int signal_number) - { - asio::error_code ec; - this->get_service().add(this->get_implementation(), signal_number, ec); - asio::detail::throw_error(ec, "add"); - } - - /// Add a signal to a signal_set. - /** - * This function adds the specified signal to the set. It has no effect if the - * signal is already in the set. - * - * @param signal_number The signal to be added to the set. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID add(int signal_number, - asio::error_code& ec) - { - this->get_service().add(this->get_implementation(), signal_number, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Remove a signal from a signal_set. - /** - * This function removes the specified signal from the set. It has no effect - * if the signal is not in the set. - * - * @param signal_number The signal to be removed from the set. - * - * @throws asio::system_error Thrown on failure. - * - * @note Removes any notifications that have been queued for the specified - * signal number. - */ - void remove(int signal_number) - { - asio::error_code ec; - this->get_service().remove(this->get_implementation(), signal_number, ec); - asio::detail::throw_error(ec, "remove"); - } - - /// Remove a signal from a signal_set. - /** - * This function removes the specified signal from the set. It has no effect - * if the signal is not in the set. - * - * @param signal_number The signal to be removed from the set. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Removes any notifications that have been queued for the specified - * signal number. - */ - ASIO_SYNC_OP_VOID remove(int signal_number, - asio::error_code& ec) - { - this->get_service().remove(this->get_implementation(), signal_number, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Remove all signals from a signal_set. - /** - * This function removes all signals from the set. It has no effect if the set - * is already empty. - * - * @throws asio::system_error Thrown on failure. - * - * @note Removes all queued notifications. - */ - void clear() - { - asio::error_code ec; - this->get_service().clear(this->get_implementation(), ec); - asio::detail::throw_error(ec, "clear"); - } - - /// Remove all signals from a signal_set. - /** - * This function removes all signals from the set. It has no effect if the set - * is already empty. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Removes all queued notifications. - */ - ASIO_SYNC_OP_VOID clear(asio::error_code& ec) - { - this->get_service().clear(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Cancel all operations associated with the signal set. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the signal set. The handler for each cancelled - * operation will be invoked with the asio::error::operation_aborted - * error code. - * - * Cancellation does not alter the set of registered signals. - * - * @throws asio::system_error Thrown on failure. - * - * @note If a registered signal occurred before cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all operations associated with the signal set. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the signal set. The handler for each cancelled - * operation will be invoked with the asio::error::operation_aborted - * error code. - * - * Cancellation does not alter the set of registered signals. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note If a registered signal occurred before cancel() is called, then the - * handlers for asynchronous wait operations will: - * - * @li have already been invoked; or - * - * @li have been queued for invocation in the near future. - * - * These handlers can no longer be cancelled, and therefore are passed an - * error code that indicates the successful completion of the wait operation. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous operation to wait for a signal to be delivered. - /** - * This function may be used to initiate an asynchronous wait against the - * signal set. It always returns immediately. - * - * For each call to async_wait(), the supplied handler will be called exactly - * once. The handler will be called when: - * - * @li One of the registered signals in the signal set occurs; or - * - * @li The signal set was cancelled, in which case the handler is passed the - * error code asio::error::operation_aborted. - * - * @param handler The handler to be called when the signal occurs. Copies - * will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * int signal_number // Indicates which signal occurred. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(SignalHandler, - void (asio::error_code, int)) - async_wait(ASIO_MOVE_ARG(SignalHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a SignalHandler. - ASIO_SIGNAL_HANDLER_CHECK(SignalHandler, handler) type_check; - - async_completion init(handler); - - this->get_service().async_wait(this->get_implementation(), - init.completion_handler); - - return init.result.get(); - } -}; -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -} // namespace asio - -#endif // ASIO_SIGNAL_SET_HPP diff --git a/scout_sdk/asio/asio/signal_set_service.hpp b/scout_sdk/asio/asio/signal_set_service.hpp deleted file mode 100644 index 3285beb..0000000 --- a/scout_sdk/asio/asio/signal_set_service.hpp +++ /dev/null @@ -1,142 +0,0 @@ -// -// signal_set_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SIGNAL_SET_SERVICE_HPP -#define ASIO_SIGNAL_SET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/async_result.hpp" -#include "asio/detail/signal_set_service.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a signal set. -class signal_set_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - -public: - /// The type of a signal set implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef detail::signal_set_service::implementation_type implementation_type; -#endif - - /// Construct a new signal set service for the specified io_context. - explicit signal_set_service(asio::io_context& io_context) - : asio::detail::service_base(io_context), - service_impl_(io_context) - { - } - - /// Construct a new signal set implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a signal set implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Add a signal to a signal_set. - ASIO_SYNC_OP_VOID add(implementation_type& impl, - int signal_number, asio::error_code& ec) - { - service_impl_.add(impl, signal_number, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Remove a signal to a signal_set. - ASIO_SYNC_OP_VOID remove(implementation_type& impl, - int signal_number, asio::error_code& ec) - { - service_impl_.remove(impl, signal_number, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Remove all signals from a signal_set. - ASIO_SYNC_OP_VOID clear(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.clear(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Cancel all operations associated with the signal set. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - // Start an asynchronous operation to wait for a signal to be delivered. - template - ASIO_INITFN_RESULT_TYPE(SignalHandler, - void (asio::error_code, int)) - async_wait(implementation_type& impl, - ASIO_MOVE_ARG(SignalHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // Perform any fork-related housekeeping. - void notify_fork(asio::io_context::fork_event event) - { - service_impl_.notify_fork(event); - } - - // The platform-specific implementation. - detail::signal_set_service service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_SIGNAL_SET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/socket_acceptor_service.hpp b/scout_sdk/asio/asio/socket_acceptor_service.hpp deleted file mode 100644 index cd40fe1..0000000 --- a/scout_sdk/asio/asio/socket_acceptor_service.hpp +++ /dev/null @@ -1,372 +0,0 @@ -// -// socket_acceptor_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SOCKET_ACCEPTOR_SERVICE_HPP -#define ASIO_SOCKET_ACCEPTOR_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/basic_socket.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/null_socket_service.hpp" -#elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_socket_service.hpp" -#else -# include "asio/detail/reactive_socket_service.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a socket acceptor. -template -class socket_acceptor_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename protocol_type::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_WINDOWS_RUNTIME) - typedef detail::null_socket_service service_impl_type; -#elif defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#else - typedef detail::reactive_socket_service service_impl_type; -#endif - -public: - /// The native type of the socket acceptor. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native acceptor type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new socket acceptor service for the specified io_context. - explicit socket_acceptor_service(asio::io_context& io_context) - : asio::detail::service_base< - socket_acceptor_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new socket acceptor implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new socket acceptor implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another socket acceptor implementation. - void move_assign(implementation_type& impl, - socket_acceptor_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } - - // All acceptor services have access to each other's implementations. - template friend class socket_acceptor_service; - - /// Move-construct a new socket acceptor implementation from another protocol - /// type. - template - void converting_move_construct(implementation_type& impl, - socket_acceptor_service& other_service, - typename socket_acceptor_service< - Protocol1>::implementation_type& other_impl, - typename enable_if::value>::type* = 0) - { - service_impl_.template converting_move_construct( - impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a socket acceptor implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Open a new socket acceptor implementation. - ASIO_SYNC_OP_VOID open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - service_impl_.open(impl, protocol, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native acceptor to a socket acceptor. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_acceptor, - asio::error_code& ec) - { - service_impl_.assign(impl, protocol, native_acceptor, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the acceptor is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Cancel all asynchronous operations associated with the acceptor. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Bind the socket acceptor to the specified local endpoint. - ASIO_SYNC_OP_VOID bind(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - service_impl_.bind(impl, endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Place the socket acceptor into the state where it will listen for new - /// connections. - ASIO_SYNC_OP_VOID listen(implementation_type& impl, int backlog, - asio::error_code& ec) - { - service_impl_.listen(impl, backlog, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Close a socket acceptor implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Release ownership of the underlying acceptor. - native_handle_type release(implementation_type& impl, - asio::error_code& ec) - { - return service_impl_.release(impl, ec); - } - - /// Get the native acceptor implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Set a socket option. - template - ASIO_SYNC_OP_VOID set_option(implementation_type& impl, - const SettableSocketOption& option, asio::error_code& ec) - { - service_impl_.set_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get a socket option. - template - ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, - GettableSocketOption& option, asio::error_code& ec) const - { - service_impl_.get_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the socket. - template - ASIO_SYNC_OP_VOID io_control(implementation_type& impl, - IoControlCommand& command, asio::error_code& ec) - { - service_impl_.io_control(impl, command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the acceptor. - bool non_blocking(const implementation_type& impl) const - { - return service_impl_.non_blocking(impl); - } - - /// Sets the non-blocking mode of the acceptor. - ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native acceptor implementation. - bool native_non_blocking(const implementation_type& impl) const - { - return service_impl_.native_non_blocking(impl); - } - - /// Sets the non-blocking mode of the native acceptor implementation. - ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.native_non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.local_endpoint(impl, ec); - } - - /// Wait for the acceptor to become ready to read, ready to write, or to have - /// pending error conditions. - ASIO_SYNC_OP_VOID wait(implementation_type& impl, - socket_base::wait_type w, asio::error_code& ec) - { - service_impl_.wait(impl, w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the acceptor to become ready to read, ready to - /// write, or to have pending error conditions. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, socket_base::wait_type w, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, w, init.completion_handler); - - return init.result.get(); - } - - /// Accept a new connection. - template - ASIO_SYNC_OP_VOID accept(implementation_type& impl, - basic_socket& peer, - endpoint_type* peer_endpoint, asio::error_code& ec, - typename enable_if::value>::type* = 0) - { - service_impl_.accept(impl, peer, peer_endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - -#if defined(ASIO_HAS_MOVE) - /// Accept a new connection. - typename Protocol::socket accept(implementation_type& impl, - io_context* peer_io_context, endpoint_type* peer_endpoint, - asio::error_code& ec) - { - return service_impl_.accept(impl, peer_io_context, peer_endpoint, ec); - } -#endif // defined(ASIO_HAS_MOVE) - - /// Start an asynchronous accept. - template - ASIO_INITFN_RESULT_TYPE(AcceptHandler, - void (asio::error_code)) - async_accept(implementation_type& impl, - basic_socket& peer, - endpoint_type* peer_endpoint, - ASIO_MOVE_ARG(AcceptHandler) handler, - typename enable_if::value>::type* = 0) - { - async_completion init(handler); - - service_impl_.async_accept(impl, - peer, peer_endpoint, init.completion_handler); - - return init.result.get(); - } - -#if defined(ASIO_HAS_MOVE) - /// Start an asynchronous accept. - template - ASIO_INITFN_RESULT_TYPE(MoveAcceptHandler, - void (asio::error_code, typename Protocol::socket)) - async_accept(implementation_type& impl, - asio::io_context* peer_io_context, endpoint_type* peer_endpoint, - ASIO_MOVE_ARG(MoveAcceptHandler) handler) - { - async_completion init(handler); - - service_impl_.async_accept(impl, - peer_io_context, peer_endpoint, init.completion_handler); - - return init.result.get(); - } -#endif // defined(ASIO_HAS_MOVE) - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_SOCKET_ACCEPTOR_SERVICE_HPP diff --git a/scout_sdk/asio/asio/socket_base.hpp b/scout_sdk/asio/asio/socket_base.hpp deleted file mode 100644 index 87ed840..0000000 --- a/scout_sdk/asio/asio/socket_base.hpp +++ /dev/null @@ -1,559 +0,0 @@ -// -// socket_base.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SOCKET_BASE_HPP -#define ASIO_SOCKET_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/io_control.hpp" -#include "asio/detail/socket_option.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// The socket_base class is used as a base for the basic_stream_socket and -/// basic_datagram_socket class templates so that we have a common place to -/// define the shutdown_type and enum. -class socket_base -{ -public: - /// Different ways a socket may be shutdown. - enum shutdown_type - { -#if defined(GENERATING_DOCUMENTATION) - /// Shutdown the receive side of the socket. - shutdown_receive = implementation_defined, - - /// Shutdown the send side of the socket. - shutdown_send = implementation_defined, - - /// Shutdown both send and receive on the socket. - shutdown_both = implementation_defined -#else - shutdown_receive = ASIO_OS_DEF(SHUT_RD), - shutdown_send = ASIO_OS_DEF(SHUT_WR), - shutdown_both = ASIO_OS_DEF(SHUT_RDWR) -#endif - }; - - /// Bitmask type for flags that can be passed to send and receive operations. - typedef int message_flags; - -#if defined(GENERATING_DOCUMENTATION) - /// Peek at incoming data without removing it from the input queue. - static const int message_peek = implementation_defined; - - /// Process out-of-band data. - static const int message_out_of_band = implementation_defined; - - /// Specify that the data should not be subject to routing. - static const int message_do_not_route = implementation_defined; - - /// Specifies that the data marks the end of a record. - static const int message_end_of_record = implementation_defined; -#else - ASIO_STATIC_CONSTANT(int, - message_peek = ASIO_OS_DEF(MSG_PEEK)); - ASIO_STATIC_CONSTANT(int, - message_out_of_band = ASIO_OS_DEF(MSG_OOB)); - ASIO_STATIC_CONSTANT(int, - message_do_not_route = ASIO_OS_DEF(MSG_DONTROUTE)); - ASIO_STATIC_CONSTANT(int, - message_end_of_record = ASIO_OS_DEF(MSG_EOR)); -#endif - - /// Wait types. - /** - * For use with basic_socket::wait() and basic_socket::async_wait(). - */ - enum wait_type - { - /// Wait for a socket to become ready to read. - wait_read, - - /// Wait for a socket to become ready to write. - wait_write, - - /// Wait for a socket to have error conditions pending. - wait_error - }; - - /// Socket option to permit sending of broadcast messages. - /** - * Implements the SOL_SOCKET/SO_BROADCAST socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::socket_base::broadcast option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::socket_base::broadcast option; - * socket.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined broadcast; -#else - typedef asio::detail::socket_option::boolean< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_BROADCAST)> - broadcast; -#endif - - /// Socket option to enable socket-level debugging. - /** - * Implements the SOL_SOCKET/SO_DEBUG socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::debug option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::debug option; - * socket.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined debug; -#else - typedef asio::detail::socket_option::boolean< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DEBUG)> debug; -#endif - - /// Socket option to prevent routing, use local interfaces only. - /** - * Implements the SOL_SOCKET/SO_DONTROUTE socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::socket_base::do_not_route option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_context); - * ... - * asio::socket_base::do_not_route option; - * socket.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined do_not_route; -#else - typedef asio::detail::socket_option::boolean< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_DONTROUTE)> - do_not_route; -#endif - - /// Socket option to send keep-alives. - /** - * Implements the SOL_SOCKET/SO_KEEPALIVE socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::keep_alive option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::keep_alive option; - * socket.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined keep_alive; -#else - typedef asio::detail::socket_option::boolean< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_KEEPALIVE)> keep_alive; -#endif - - /// Socket option for the send buffer size of a socket. - /** - * Implements the SOL_SOCKET/SO_SNDBUF socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::send_buffer_size option(8192); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::send_buffer_size option; - * socket.get_option(option); - * int size = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined send_buffer_size; -#else - typedef asio::detail::socket_option::integer< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDBUF)> - send_buffer_size; -#endif - - /// Socket option for the send low watermark. - /** - * Implements the SOL_SOCKET/SO_SNDLOWAT socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::send_low_watermark option(1024); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::send_low_watermark option; - * socket.get_option(option); - * int size = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined send_low_watermark; -#else - typedef asio::detail::socket_option::integer< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_SNDLOWAT)> - send_low_watermark; -#endif - - /// Socket option for the receive buffer size of a socket. - /** - * Implements the SOL_SOCKET/SO_RCVBUF socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::receive_buffer_size option(8192); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::receive_buffer_size option; - * socket.get_option(option); - * int size = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined receive_buffer_size; -#else - typedef asio::detail::socket_option::integer< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVBUF)> - receive_buffer_size; -#endif - - /// Socket option for the receive low watermark. - /** - * Implements the SOL_SOCKET/SO_RCVLOWAT socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::receive_low_watermark option(1024); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::receive_low_watermark option; - * socket.get_option(option); - * int size = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined receive_low_watermark; -#else - typedef asio::detail::socket_option::integer< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_RCVLOWAT)> - receive_low_watermark; -#endif - - /// Socket option to allow the socket to be bound to an address that is - /// already in use. - /** - * Implements the SOL_SOCKET/SO_REUSEADDR socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::socket_base::reuse_address option(true); - * acceptor.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::socket_base::reuse_address option; - * acceptor.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined reuse_address; -#else - typedef asio::detail::socket_option::boolean< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_REUSEADDR)> - reuse_address; -#endif - - /// Socket option to specify whether the socket lingers on close if unsent - /// data is present. - /** - * Implements the SOL_SOCKET/SO_LINGER socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::linger option(true, 30); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::linger option; - * socket.get_option(option); - * bool is_set = option.enabled(); - * unsigned short timeout = option.timeout(); - * @endcode - * - * @par Concepts: - * Socket_Option, Linger_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined linger; -#else - typedef asio::detail::socket_option::linger< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_LINGER)> - linger; -#endif - - /// Socket option for putting received out-of-band data inline. - /** - * Implements the SOL_SOCKET/SO_OOBINLINE socket option. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::out_of_band_inline option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::out_of_band_inline option; - * socket.get_option(option); - * bool value = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined out_of_band_inline; -#else - typedef asio::detail::socket_option::boolean< - ASIO_OS_DEF(SOL_SOCKET), ASIO_OS_DEF(SO_OOBINLINE)> - out_of_band_inline; -#endif - - /// Socket option to report aborted connections on accept. - /** - * Implements a custom socket option that determines whether or not an accept - * operation is permitted to fail with asio::error::connection_aborted. - * By default the option is false. - * - * @par Examples - * Setting the option: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::socket_base::enable_connection_aborted option(true); - * acceptor.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::acceptor acceptor(io_context); - * ... - * asio::socket_base::enable_connection_aborted option; - * acceptor.get_option(option); - * bool is_set = option.value(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined enable_connection_aborted; -#else - typedef asio::detail::socket_option::boolean< - asio::detail::custom_socket_option_level, - asio::detail::enable_connection_aborted_option> - enable_connection_aborted; -#endif - - /// IO control command to get the amount of data that can be read without - /// blocking. - /** - * Implements the FIONREAD IO control command. - * - * @par Example - * @code - * asio::ip::tcp::socket socket(io_context); - * ... - * asio::socket_base::bytes_readable command(true); - * socket.io_control(command); - * std::size_t bytes_readable = command.get(); - * @endcode - * - * @par Concepts: - * IO_Control_Command, Size_IO_Control_Command. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined bytes_readable; -#else - typedef asio::detail::io_control::bytes_readable bytes_readable; -#endif - - /// The maximum length of the queue of pending incoming connections. -#if defined(GENERATING_DOCUMENTATION) - static const int max_listen_connections = implementation_defined; -#else - ASIO_STATIC_CONSTANT(int, max_listen_connections - = ASIO_OS_DEF(SOMAXCONN)); -#endif - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use max_listen_connections.) The maximum length of the queue - /// of pending incoming connections. -#if defined(GENERATING_DOCUMENTATION) - static const int max_connections = implementation_defined; -#else - ASIO_STATIC_CONSTANT(int, max_connections - = ASIO_OS_DEF(SOMAXCONN)); -#endif -#endif // !defined(ASIO_NO_DEPRECATED) - -protected: - /// Protected destructor to prevent deletion through this type. - ~socket_base() - { - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SOCKET_BASE_HPP diff --git a/scout_sdk/asio/asio/spawn.hpp b/scout_sdk/asio/asio/spawn.hpp deleted file mode 100644 index a91c581..0000000 --- a/scout_sdk/asio/asio/spawn.hpp +++ /dev/null @@ -1,336 +0,0 @@ -// -// spawn.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SPAWN_HPP -#define ASIO_SPAWN_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/bind_executor.hpp" -#include "asio/detail/memory.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/detail/wrapped_handler.hpp" -#include "asio/executor.hpp" -#include "asio/io_context.hpp" -#include "asio/is_executor.hpp" -#include "asio/strand.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Context object the represents the currently executing coroutine. -/** - * The basic_yield_context class is used to represent the currently executing - * stackful coroutine. A basic_yield_context may be passed as a handler to an - * asynchronous operation. For example: - * - * @code template - * void my_coroutine(basic_yield_context yield) - * { - * ... - * std::size_t n = my_socket.async_read_some(buffer, yield); - * ... - * } @endcode - * - * The initiating function (async_read_some in the above example) suspends the - * current coroutine. The coroutine is resumed when the asynchronous operation - * completes, and the result of the operation is returned. - */ -template -class basic_yield_context -{ -public: - /// The coroutine callee type, used by the implementation. - /** - * When using Boost.Coroutine v1, this type is: - * @code typename coroutine @endcode - * When using Boost.Coroutine v2 (unidirectional coroutines), this type is: - * @code push_coroutine @endcode - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined callee_type; -#elif defined(BOOST_COROUTINES_UNIDIRECT) || defined(BOOST_COROUTINES_V2) - typedef boost::coroutines::push_coroutine callee_type; -#else - typedef boost::coroutines::coroutine callee_type; -#endif - - /// The coroutine caller type, used by the implementation. - /** - * When using Boost.Coroutine v1, this type is: - * @code typename coroutine::caller_type @endcode - * When using Boost.Coroutine v2 (unidirectional coroutines), this type is: - * @code pull_coroutine @endcode - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined caller_type; -#elif defined(BOOST_COROUTINES_UNIDIRECT) || defined(BOOST_COROUTINES_V2) - typedef boost::coroutines::pull_coroutine caller_type; -#else - typedef boost::coroutines::coroutine::caller_type caller_type; -#endif - - /// Construct a yield context to represent the specified coroutine. - /** - * Most applications do not need to use this constructor. Instead, the - * spawn() function passes a yield context as an argument to the coroutine - * function. - */ - basic_yield_context( - const detail::weak_ptr& coro, - caller_type& ca, Handler& handler) - : coro_(coro), - ca_(ca), - handler_(handler), - ec_(0) - { - } - - /// Construct a yield context from another yield context type. - /** - * Requires that OtherHandler be convertible to Handler. - */ - template - basic_yield_context(const basic_yield_context& other) - : coro_(other.coro_), - ca_(other.ca_), - handler_(other.handler_), - ec_(other.ec_) - { - } - - /// Return a yield context that sets the specified error_code. - /** - * By default, when a yield context is used with an asynchronous operation, a - * non-success error_code is converted to system_error and thrown. This - * operator may be used to specify an error_code object that should instead be - * set with the asynchronous operation's result. For example: - * - * @code template - * void my_coroutine(basic_yield_context yield) - * { - * ... - * std::size_t n = my_socket.async_read_some(buffer, yield[ec]); - * if (ec) - * { - * // An error occurred. - * } - * ... - * } @endcode - */ - basic_yield_context operator[](asio::error_code& ec) const - { - basic_yield_context tmp(*this); - tmp.ec_ = &ec; - return tmp; - } - -#if defined(GENERATING_DOCUMENTATION) -private: -#endif // defined(GENERATING_DOCUMENTATION) - detail::weak_ptr coro_; - caller_type& ca_; - Handler handler_; - asio::error_code* ec_; -}; - -#if defined(GENERATING_DOCUMENTATION) -/// Context object that represents the currently executing coroutine. -typedef basic_yield_context yield_context; -#else // defined(GENERATING_DOCUMENTATION) -typedef basic_yield_context< - executor_binder > yield_context; -#endif // defined(GENERATING_DOCUMENTATION) - -/** - * @defgroup spawn asio::spawn - * - * @brief Start a new stackful coroutine. - * - * The spawn() function is a high-level wrapper over the Boost.Coroutine - * library. This function enables programs to implement asynchronous logic in a - * synchronous manner, as illustrated by the following example: - * - * @code asio::spawn(my_strand, do_echo); - * - * // ... - * - * void do_echo(asio::yield_context yield) - * { - * try - * { - * char data[128]; - * for (;;) - * { - * std::size_t length = - * my_socket.async_read_some( - * asio::buffer(data), yield); - * - * asio::async_write(my_socket, - * asio::buffer(data, length), yield); - * } - * } - * catch (std::exception& e) - * { - * // ... - * } - * } @endcode - */ -/*@{*/ - -/// Start a new stackful coroutine, calling the specified handler when it -/// completes. -/** - * This function is used to launch a new coroutine. - * - * @param function The coroutine function. The function must have the signature: - * @code void function(basic_yield_context yield); @endcode - * - * @param attributes Boost.Coroutine attributes used to customise the coroutine. - */ -template -void spawn(ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes - = boost::coroutines::attributes()); - -/// Start a new stackful coroutine, calling the specified handler when it -/// completes. -/** - * This function is used to launch a new coroutine. - * - * @param handler A handler to be called when the coroutine exits. More - * importantly, the handler provides an execution context (via the the handler - * invocation hook) for the coroutine. The handler must have the signature: - * @code void handler(); @endcode - * - * @param function The coroutine function. The function must have the signature: - * @code void function(basic_yield_context yield); @endcode - * - * @param attributes Boost.Coroutine attributes used to customise the coroutine. - */ -template -void spawn(ASIO_MOVE_ARG(Handler) handler, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes - = boost::coroutines::attributes(), - typename enable_if::type>::value && - !is_convertible::value>::type* = 0); - -/// Start a new stackful coroutine, inheriting the execution context of another. -/** - * This function is used to launch a new coroutine. - * - * @param ctx Identifies the current coroutine as a parent of the new - * coroutine. This specifies that the new coroutine should inherit the - * execution context of the parent. For example, if the parent coroutine is - * executing in a particular strand, then the new coroutine will execute in the - * same strand. - * - * @param function The coroutine function. The function must have the signature: - * @code void function(basic_yield_context yield); @endcode - * - * @param attributes Boost.Coroutine attributes used to customise the coroutine. - */ -template -void spawn(basic_yield_context ctx, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes - = boost::coroutines::attributes()); - -/// Start a new stackful coroutine that executes on a given executor. -/** - * This function is used to launch a new coroutine. - * - * @param ex Identifies the executor that will run the coroutine. The new - * coroutine is implicitly given its own strand within this executor. - * - * @param function The coroutine function. The function must have the signature: - * @code void function(yield_context yield); @endcode - * - * @param attributes Boost.Coroutine attributes used to customise the coroutine. - */ -template -void spawn(const Executor& ex, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes - = boost::coroutines::attributes(), - typename enable_if::value>::type* = 0); - -/// Start a new stackful coroutine that executes on a given strand. -/** - * This function is used to launch a new coroutine. - * - * @param ex Identifies the strand that will run the coroutine. - * - * @param function The coroutine function. The function must have the signature: - * @code void function(yield_context yield); @endcode - * - * @param attributes Boost.Coroutine attributes used to customise the coroutine. - */ -template -void spawn(const strand& ex, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes - = boost::coroutines::attributes()); - -/// Start a new stackful coroutine that executes in the context of a strand. -/** - * This function is used to launch a new coroutine. - * - * @param s Identifies a strand. By starting multiple coroutines on the same - * strand, the implementation ensures that none of those coroutines can execute - * simultaneously. - * - * @param function The coroutine function. The function must have the signature: - * @code void function(yield_context yield); @endcode - * - * @param attributes Boost.Coroutine attributes used to customise the coroutine. - */ -template -void spawn(const asio::io_context::strand& s, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes - = boost::coroutines::attributes()); - -/// Start a new stackful coroutine that executes on a given execution context. -/** - * This function is used to launch a new coroutine. - * - * @param ctx Identifies the execution context that will run the coroutine. The - * new coroutine is implicitly given its own strand within this execution - * context. - * - * @param function The coroutine function. The function must have the signature: - * @code void function(yield_context yield); @endcode - * - * @param attributes Boost.Coroutine attributes used to customise the coroutine. - */ -template -void spawn(ExecutionContext& ctx, - ASIO_MOVE_ARG(Function) function, - const boost::coroutines::attributes& attributes - = boost::coroutines::attributes(), - typename enable_if::value>::type* = 0); - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/spawn.hpp" - -#endif // ASIO_SPAWN_HPP diff --git a/scout_sdk/asio/asio/ssl.hpp b/scout_sdk/asio/asio/ssl.hpp deleted file mode 100644 index cbad19d..0000000 --- a/scout_sdk/asio/asio/ssl.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// ssl.hpp -// ~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_HPP -#define ASIO_SSL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/ssl/context.hpp" -#include "asio/ssl/context_base.hpp" -#include "asio/ssl/error.hpp" -#include "asio/ssl/rfc2818_verification.hpp" -#include "asio/ssl/stream.hpp" -#include "asio/ssl/stream_base.hpp" -#include "asio/ssl/verify_context.hpp" -#include "asio/ssl/verify_mode.hpp" - -#endif // ASIO_SSL_HPP diff --git a/scout_sdk/asio/asio/ssl/context.hpp b/scout_sdk/asio/asio/ssl/context.hpp deleted file mode 100644 index 9543aab..0000000 --- a/scout_sdk/asio/asio/ssl/context.hpp +++ /dev/null @@ -1,758 +0,0 @@ -// -// ssl/context.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_CONTEXT_HPP -#define ASIO_SSL_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/buffer.hpp" -#include "asio/io_context.hpp" -#include "asio/ssl/context_base.hpp" -#include "asio/ssl/detail/openssl_types.hpp" -#include "asio/ssl/detail/openssl_init.hpp" -#include "asio/ssl/detail/password_callback.hpp" -#include "asio/ssl/detail/verify_callback.hpp" -#include "asio/ssl/verify_mode.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -class context - : public context_base, - private noncopyable -{ -public: - /// The native handle type of the SSL context. - typedef SSL_CTX* native_handle_type; - - /// Constructor. - ASIO_DECL explicit context(method m); - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a context from another. - /** - * This constructor moves an SSL context from one object to another. - * - * @param other The other context object from which the move will occur. - * - * @note Following the move, the following operations only are valid for the - * moved-from object: - * @li Destruction. - * @li As a target for move-assignment. - */ - ASIO_DECL context(context&& other); - - /// Move-assign a context from another. - /** - * This assignment operator moves an SSL context from one object to another. - * - * @param other The other context object from which the move will occur. - * - * @note Following the move, the following operations only are valid for the - * moved-from object: - * @li Destruction. - * @li As a target for move-assignment. - */ - ASIO_DECL context& operator=(context&& other); -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destructor. - ASIO_DECL ~context(); - - /// Get the underlying implementation in the native type. - /** - * This function may be used to obtain the underlying implementation of the - * context. This is intended to allow access to context functionality that is - * not otherwise provided. - */ - ASIO_DECL native_handle_type native_handle(); - - /// Clear options on the context. - /** - * This function may be used to configure the SSL options used by the context. - * - * @param o A bitmask of options. The available option values are defined in - * the context_base class. The specified options, if currently enabled on the - * context, are cleared. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_clear_options. - */ - ASIO_DECL void clear_options(options o); - - /// Clear options on the context. - /** - * This function may be used to configure the SSL options used by the context. - * - * @param o A bitmask of options. The available option values are defined in - * the context_base class. The specified options, if currently enabled on the - * context, are cleared. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_clear_options. - */ - ASIO_DECL ASIO_SYNC_OP_VOID clear_options(options o, - asio::error_code& ec); - - /// Set options on the context. - /** - * This function may be used to configure the SSL options used by the context. - * - * @param o A bitmask of options. The available option values are defined in - * the context_base class. The options are bitwise-ored with any existing - * value for the options. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_options. - */ - ASIO_DECL void set_options(options o); - - /// Set options on the context. - /** - * This function may be used to configure the SSL options used by the context. - * - * @param o A bitmask of options. The available option values are defined in - * the context_base class. The options are bitwise-ored with any existing - * value for the options. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_options. - */ - ASIO_DECL ASIO_SYNC_OP_VOID set_options(options o, - asio::error_code& ec); - - /// Set the peer verification mode. - /** - * This function may be used to configure the peer verification mode used by - * the context. - * - * @param v A bitmask of peer verification modes. See @ref verify_mode for - * available values. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_verify. - */ - ASIO_DECL void set_verify_mode(verify_mode v); - - /// Set the peer verification mode. - /** - * This function may be used to configure the peer verification mode used by - * the context. - * - * @param v A bitmask of peer verification modes. See @ref verify_mode for - * available values. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_verify. - */ - ASIO_DECL ASIO_SYNC_OP_VOID set_verify_mode( - verify_mode v, asio::error_code& ec); - - /// Set the peer verification depth. - /** - * This function may be used to configure the maximum verification depth - * allowed by the context. - * - * @param depth Maximum depth for the certificate chain verification that - * shall be allowed. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_verify_depth. - */ - ASIO_DECL void set_verify_depth(int depth); - - /// Set the peer verification depth. - /** - * This function may be used to configure the maximum verification depth - * allowed by the context. - * - * @param depth Maximum depth for the certificate chain verification that - * shall be allowed. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_verify_depth. - */ - ASIO_DECL ASIO_SYNC_OP_VOID set_verify_depth( - int depth, asio::error_code& ec); - - /// Set the callback used to verify peer certificates. - /** - * This function is used to specify a callback function that will be called - * by the implementation when it needs to verify a peer certificate. - * - * @param callback The function object to be used for verifying a certificate. - * The function signature of the handler must be: - * @code bool verify_callback( - * bool preverified, // True if the certificate passed pre-verification. - * verify_context& ctx // The peer certificate and other context. - * ); @endcode - * The return value of the callback is true if the certificate has passed - * verification, false otherwise. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_verify. - */ - template - void set_verify_callback(VerifyCallback callback); - - /// Set the callback used to verify peer certificates. - /** - * This function is used to specify a callback function that will be called - * by the implementation when it needs to verify a peer certificate. - * - * @param callback The function object to be used for verifying a certificate. - * The function signature of the handler must be: - * @code bool verify_callback( - * bool preverified, // True if the certificate passed pre-verification. - * verify_context& ctx // The peer certificate and other context. - * ); @endcode - * The return value of the callback is true if the certificate has passed - * verification, false otherwise. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_verify. - */ - template - ASIO_SYNC_OP_VOID set_verify_callback(VerifyCallback callback, - asio::error_code& ec); - - /// Load a certification authority file for performing verification. - /** - * This function is used to load one or more trusted certification authorities - * from a file. - * - * @param filename The name of a file containing certification authority - * certificates in PEM format. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_load_verify_locations. - */ - ASIO_DECL void load_verify_file(const std::string& filename); - - /// Load a certification authority file for performing verification. - /** - * This function is used to load the certificates for one or more trusted - * certification authorities from a file. - * - * @param filename The name of a file containing certification authority - * certificates in PEM format. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_load_verify_locations. - */ - ASIO_DECL ASIO_SYNC_OP_VOID load_verify_file( - const std::string& filename, asio::error_code& ec); - - /// Add certification authority for performing verification. - /** - * This function is used to add one trusted certification authority - * from a memory buffer. - * - * @param ca The buffer containing the certification authority certificate. - * The certificate must use the PEM format. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_get_cert_store and @c X509_STORE_add_cert. - */ - ASIO_DECL void add_certificate_authority(const const_buffer& ca); - - /// Add certification authority for performing verification. - /** - * This function is used to add one trusted certification authority - * from a memory buffer. - * - * @param ca The buffer containing the certification authority certificate. - * The certificate must use the PEM format. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_get_cert_store and @c X509_STORE_add_cert. - */ - ASIO_DECL ASIO_SYNC_OP_VOID add_certificate_authority( - const const_buffer& ca, asio::error_code& ec); - - /// Configures the context to use the default directories for finding - /// certification authority certificates. - /** - * This function specifies that the context should use the default, - * system-dependent directories for locating certification authority - * certificates. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_default_verify_paths. - */ - ASIO_DECL void set_default_verify_paths(); - - /// Configures the context to use the default directories for finding - /// certification authority certificates. - /** - * This function specifies that the context should use the default, - * system-dependent directories for locating certification authority - * certificates. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_default_verify_paths. - */ - ASIO_DECL ASIO_SYNC_OP_VOID set_default_verify_paths( - asio::error_code& ec); - - /// Add a directory containing certificate authority files to be used for - /// performing verification. - /** - * This function is used to specify the name of a directory containing - * certification authority certificates. Each file in the directory must - * contain a single certificate. The files must be named using the subject - * name's hash and an extension of ".0". - * - * @param path The name of a directory containing the certificates. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_load_verify_locations. - */ - ASIO_DECL void add_verify_path(const std::string& path); - - /// Add a directory containing certificate authority files to be used for - /// performing verification. - /** - * This function is used to specify the name of a directory containing - * certification authority certificates. Each file in the directory must - * contain a single certificate. The files must be named using the subject - * name's hash and an extension of ".0". - * - * @param path The name of a directory containing the certificates. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_load_verify_locations. - */ - ASIO_DECL ASIO_SYNC_OP_VOID add_verify_path( - const std::string& path, asio::error_code& ec); - - /// Use a certificate from a memory buffer. - /** - * This function is used to load a certificate into the context from a buffer. - * - * @param certificate The buffer containing the certificate. - * - * @param format The certificate format (ASN.1 or PEM). - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_certificate or SSL_CTX_use_certificate_ASN1. - */ - ASIO_DECL void use_certificate( - const const_buffer& certificate, file_format format); - - /// Use a certificate from a memory buffer. - /** - * This function is used to load a certificate into the context from a buffer. - * - * @param certificate The buffer containing the certificate. - * - * @param format The certificate format (ASN.1 or PEM). - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_certificate or SSL_CTX_use_certificate_ASN1. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_certificate( - const const_buffer& certificate, file_format format, - asio::error_code& ec); - - /// Use a certificate from a file. - /** - * This function is used to load a certificate into the context from a file. - * - * @param filename The name of the file containing the certificate. - * - * @param format The file format (ASN.1 or PEM). - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_certificate_file. - */ - ASIO_DECL void use_certificate_file( - const std::string& filename, file_format format); - - /// Use a certificate from a file. - /** - * This function is used to load a certificate into the context from a file. - * - * @param filename The name of the file containing the certificate. - * - * @param format The file format (ASN.1 or PEM). - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_certificate_file. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_certificate_file( - const std::string& filename, file_format format, - asio::error_code& ec); - - /// Use a certificate chain from a memory buffer. - /** - * This function is used to load a certificate chain into the context from a - * buffer. - * - * @param chain The buffer containing the certificate chain. The certificate - * chain must use the PEM format. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_certificate and SSL_CTX_add_extra_chain_cert. - */ - ASIO_DECL void use_certificate_chain(const const_buffer& chain); - - /// Use a certificate chain from a memory buffer. - /** - * This function is used to load a certificate chain into the context from a - * buffer. - * - * @param chain The buffer containing the certificate chain. The certificate - * chain must use the PEM format. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_certificate and SSL_CTX_add_extra_chain_cert. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_certificate_chain( - const const_buffer& chain, asio::error_code& ec); - - /// Use a certificate chain from a file. - /** - * This function is used to load a certificate chain into the context from a - * file. - * - * @param filename The name of the file containing the certificate. The file - * must use the PEM format. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_certificate_chain_file. - */ - ASIO_DECL void use_certificate_chain_file(const std::string& filename); - - /// Use a certificate chain from a file. - /** - * This function is used to load a certificate chain into the context from a - * file. - * - * @param filename The name of the file containing the certificate. The file - * must use the PEM format. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_certificate_chain_file. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_certificate_chain_file( - const std::string& filename, asio::error_code& ec); - - /// Use a private key from a memory buffer. - /** - * This function is used to load a private key into the context from a buffer. - * - * @param private_key The buffer containing the private key. - * - * @param format The private key format (ASN.1 or PEM). - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_PrivateKey or SSL_CTX_use_PrivateKey_ASN1. - */ - ASIO_DECL void use_private_key( - const const_buffer& private_key, file_format format); - - /// Use a private key from a memory buffer. - /** - * This function is used to load a private key into the context from a buffer. - * - * @param private_key The buffer containing the private key. - * - * @param format The private key format (ASN.1 or PEM). - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_PrivateKey or SSL_CTX_use_PrivateKey_ASN1. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_private_key( - const const_buffer& private_key, file_format format, - asio::error_code& ec); - - /// Use a private key from a file. - /** - * This function is used to load a private key into the context from a file. - * - * @param filename The name of the file containing the private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_PrivateKey_file. - */ - ASIO_DECL void use_private_key_file( - const std::string& filename, file_format format); - - /// Use a private key from a file. - /** - * This function is used to load a private key into the context from a file. - * - * @param filename The name of the file containing the private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_PrivateKey_file. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_private_key_file( - const std::string& filename, file_format format, - asio::error_code& ec); - - /// Use an RSA private key from a memory buffer. - /** - * This function is used to load an RSA private key into the context from a - * buffer. - * - * @param private_key The buffer containing the RSA private key. - * - * @param format The private key format (ASN.1 or PEM). - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_RSAPrivateKey or SSL_CTX_use_RSAPrivateKey_ASN1. - */ - ASIO_DECL void use_rsa_private_key( - const const_buffer& private_key, file_format format); - - /// Use an RSA private key from a memory buffer. - /** - * This function is used to load an RSA private key into the context from a - * buffer. - * - * @param private_key The buffer containing the RSA private key. - * - * @param format The private key format (ASN.1 or PEM). - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_RSAPrivateKey or SSL_CTX_use_RSAPrivateKey_ASN1. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_rsa_private_key( - const const_buffer& private_key, file_format format, - asio::error_code& ec); - - /// Use an RSA private key from a file. - /** - * This function is used to load an RSA private key into the context from a - * file. - * - * @param filename The name of the file containing the RSA private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_use_RSAPrivateKey_file. - */ - ASIO_DECL void use_rsa_private_key_file( - const std::string& filename, file_format format); - - /// Use an RSA private key from a file. - /** - * This function is used to load an RSA private key into the context from a - * file. - * - * @param filename The name of the file containing the RSA private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_use_RSAPrivateKey_file. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_rsa_private_key_file( - const std::string& filename, file_format format, - asio::error_code& ec); - - /// Use the specified memory buffer to obtain the temporary Diffie-Hellman - /// parameters. - /** - * This function is used to load Diffie-Hellman parameters into the context - * from a buffer. - * - * @param dh The memory buffer containing the Diffie-Hellman parameters. The - * buffer must use the PEM format. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_tmp_dh. - */ - ASIO_DECL void use_tmp_dh(const const_buffer& dh); - - /// Use the specified memory buffer to obtain the temporary Diffie-Hellman - /// parameters. - /** - * This function is used to load Diffie-Hellman parameters into the context - * from a buffer. - * - * @param dh The memory buffer containing the Diffie-Hellman parameters. The - * buffer must use the PEM format. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_tmp_dh. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_tmp_dh( - const const_buffer& dh, asio::error_code& ec); - - /// Use the specified file to obtain the temporary Diffie-Hellman parameters. - /** - * This function is used to load Diffie-Hellman parameters into the context - * from a file. - * - * @param filename The name of the file containing the Diffie-Hellman - * parameters. The file must use the PEM format. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_tmp_dh. - */ - ASIO_DECL void use_tmp_dh_file(const std::string& filename); - - /// Use the specified file to obtain the temporary Diffie-Hellman parameters. - /** - * This function is used to load Diffie-Hellman parameters into the context - * from a file. - * - * @param filename The name of the file containing the Diffie-Hellman - * parameters. The file must use the PEM format. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_tmp_dh. - */ - ASIO_DECL ASIO_SYNC_OP_VOID use_tmp_dh_file( - const std::string& filename, asio::error_code& ec); - - /// Set the password callback. - /** - * This function is used to specify a callback function to obtain password - * information about an encrypted key in PEM format. - * - * @param callback The function object to be used for obtaining the password. - * The function signature of the handler must be: - * @code std::string password_callback( - * std::size_t max_length, // The maximum size for a password. - * password_purpose purpose // Whether password is for reading or writing. - * ); @endcode - * The return value of the callback is a string containing the password. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_CTX_set_default_passwd_cb. - */ - template - void set_password_callback(PasswordCallback callback); - - /// Set the password callback. - /** - * This function is used to specify a callback function to obtain password - * information about an encrypted key in PEM format. - * - * @param callback The function object to be used for obtaining the password. - * The function signature of the handler must be: - * @code std::string password_callback( - * std::size_t max_length, // The maximum size for a password. - * password_purpose purpose // Whether password is for reading or writing. - * ); @endcode - * The return value of the callback is a string containing the password. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_CTX_set_default_passwd_cb. - */ - template - ASIO_SYNC_OP_VOID set_password_callback(PasswordCallback callback, - asio::error_code& ec); - -private: - struct bio_cleanup; - struct x509_cleanup; - struct evp_pkey_cleanup; - struct rsa_cleanup; - struct dh_cleanup; - - // Helper function used to set a peer certificate verification callback. - ASIO_DECL ASIO_SYNC_OP_VOID do_set_verify_callback( - detail::verify_callback_base* callback, asio::error_code& ec); - - // Callback used when the SSL implementation wants to verify a certificate. - ASIO_DECL static int verify_callback_function( - int preverified, X509_STORE_CTX* ctx); - - // Helper function used to set a password callback. - ASIO_DECL ASIO_SYNC_OP_VOID do_set_password_callback( - detail::password_callback_base* callback, asio::error_code& ec); - - // Callback used when the SSL implementation wants a password. - ASIO_DECL static int password_callback_function( - char* buf, int size, int purpose, void* data); - - // Helper function to set the temporary Diffie-Hellman parameters from a BIO. - ASIO_DECL ASIO_SYNC_OP_VOID do_use_tmp_dh( - BIO* bio, asio::error_code& ec); - - // Helper function to make a BIO from a memory buffer. - ASIO_DECL BIO* make_buffer_bio(const const_buffer& b); - - // The underlying native implementation. - native_handle_type handle_; - - // Ensure openssl is initialised. - asio::ssl::detail::openssl_init<> init_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/ssl/impl/context.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/ssl/impl/context.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_SSL_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/ssl/context_base.hpp b/scout_sdk/asio/asio/ssl/context_base.hpp deleted file mode 100644 index 56c7693..0000000 --- a/scout_sdk/asio/asio/ssl/context_base.hpp +++ /dev/null @@ -1,192 +0,0 @@ -// -// ssl/context_base.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_CONTEXT_BASE_HPP -#define ASIO_SSL_CONTEXT_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -/// The context_base class is used as a base for the basic_context class -/// template so that we have a common place to define various enums. -class context_base -{ -public: - /// Different methods supported by a context. - enum method - { - /// Generic SSL version 2. - sslv2, - - /// SSL version 2 client. - sslv2_client, - - /// SSL version 2 server. - sslv2_server, - - /// Generic SSL version 3. - sslv3, - - /// SSL version 3 client. - sslv3_client, - - /// SSL version 3 server. - sslv3_server, - - /// Generic TLS version 1. - tlsv1, - - /// TLS version 1 client. - tlsv1_client, - - /// TLS version 1 server. - tlsv1_server, - - /// Generic SSL/TLS. - sslv23, - - /// SSL/TLS client. - sslv23_client, - - /// SSL/TLS server. - sslv23_server, - - /// Generic TLS version 1.1. - tlsv11, - - /// TLS version 1.1 client. - tlsv11_client, - - /// TLS version 1.1 server. - tlsv11_server, - - /// Generic TLS version 1.2. - tlsv12, - - /// TLS version 1.2 client. - tlsv12_client, - - /// TLS version 1.2 server. - tlsv12_server, - - /// Generic TLS. - tls, - - /// TLS client. - tls_client, - - /// TLS server. - tls_server - }; - - /// Bitmask type for SSL options. - typedef long options; - -#if defined(GENERATING_DOCUMENTATION) - /// Implement various bug workarounds. - static const long default_workarounds = implementation_defined; - - /// Always create a new key when using tmp_dh parameters. - static const long single_dh_use = implementation_defined; - - /// Disable SSL v2. - static const long no_sslv2 = implementation_defined; - - /// Disable SSL v3. - static const long no_sslv3 = implementation_defined; - - /// Disable TLS v1. - static const long no_tlsv1 = implementation_defined; - - /// Disable TLS v1.1. - static const long no_tlsv1_1 = implementation_defined; - - /// Disable TLS v1.2. - static const long no_tlsv1_2 = implementation_defined; - - /// Disable compression. Compression is disabled by default. - static const long no_compression = implementation_defined; -#else - ASIO_STATIC_CONSTANT(long, default_workarounds = SSL_OP_ALL); - ASIO_STATIC_CONSTANT(long, single_dh_use = SSL_OP_SINGLE_DH_USE); - ASIO_STATIC_CONSTANT(long, no_sslv2 = SSL_OP_NO_SSLv2); - ASIO_STATIC_CONSTANT(long, no_sslv3 = SSL_OP_NO_SSLv3); - ASIO_STATIC_CONSTANT(long, no_tlsv1 = SSL_OP_NO_TLSv1); -# if defined(SSL_OP_NO_TLSv1_1) - ASIO_STATIC_CONSTANT(long, no_tlsv1_1 = SSL_OP_NO_TLSv1_1); -# else // defined(SSL_OP_NO_TLSv1_1) - ASIO_STATIC_CONSTANT(long, no_tlsv1_1 = 0x10000000L); -# endif // defined(SSL_OP_NO_TLSv1_1) -# if defined(SSL_OP_NO_TLSv1_2) - ASIO_STATIC_CONSTANT(long, no_tlsv1_2 = SSL_OP_NO_TLSv1_2); -# else // defined(SSL_OP_NO_TLSv1_2) - ASIO_STATIC_CONSTANT(long, no_tlsv1_2 = 0x08000000L); -# endif // defined(SSL_OP_NO_TLSv1_2) -# if defined(SSL_OP_NO_COMPRESSION) - ASIO_STATIC_CONSTANT(long, no_compression = SSL_OP_NO_COMPRESSION); -# else // defined(SSL_OP_NO_COMPRESSION) - ASIO_STATIC_CONSTANT(long, no_compression = 0x20000L); -# endif // defined(SSL_OP_NO_COMPRESSION) -#endif - - /// File format types. - enum file_format - { - /// ASN.1 file. - asn1, - - /// PEM file. - pem - }; - -#if !defined(GENERATING_DOCUMENTATION) - // The following types and constants are preserved for backward compatibility. - // New programs should use the equivalents of the same names that are defined - // in the asio::ssl namespace. - typedef int verify_mode; - ASIO_STATIC_CONSTANT(int, verify_none = SSL_VERIFY_NONE); - ASIO_STATIC_CONSTANT(int, verify_peer = SSL_VERIFY_PEER); - ASIO_STATIC_CONSTANT(int, - verify_fail_if_no_peer_cert = SSL_VERIFY_FAIL_IF_NO_PEER_CERT); - ASIO_STATIC_CONSTANT(int, verify_client_once = SSL_VERIFY_CLIENT_ONCE); -#endif - - /// Purpose of PEM password. - enum password_purpose - { - /// The password is needed for reading/decryption. - for_reading, - - /// The password is needed for writing/encryption. - for_writing - }; - -protected: - /// Protected destructor to prevent deletion through this type. - ~context_base() - { - } -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_CONTEXT_BASE_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/buffered_handshake_op.hpp b/scout_sdk/asio/asio/ssl/detail/buffered_handshake_op.hpp deleted file mode 100644 index 38a03fc..0000000 --- a/scout_sdk/asio/asio/ssl/detail/buffered_handshake_op.hpp +++ /dev/null @@ -1,114 +0,0 @@ -// -// ssl/detail/buffered_handshake_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_BUFFERED_HANDSHAKE_OP_HPP -#define ASIO_SSL_DETAIL_BUFFERED_HANDSHAKE_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/ssl/detail/engine.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -template -class buffered_handshake_op -{ -public: - buffered_handshake_op(stream_base::handshake_type type, - const ConstBufferSequence& buffers) - : type_(type), - buffers_(buffers), - total_buffer_size_(asio::buffer_size(buffers_)) - { - } - - engine::want operator()(engine& eng, - asio::error_code& ec, - std::size_t& bytes_transferred) const - { - return this->process(eng, ec, bytes_transferred, - asio::buffer_sequence_begin(buffers_), - asio::buffer_sequence_end(buffers_)); - } - - template - void call_handler(Handler& handler, - const asio::error_code& ec, - const std::size_t& bytes_transferred) const - { - handler(ec, bytes_transferred); - } - -private: - template - engine::want process(engine& eng, - asio::error_code& ec, - std::size_t& bytes_transferred, - Iterator begin, Iterator end) const - { - Iterator iter = begin; - std::size_t accumulated_size = 0; - - for (;;) - { - engine::want want = eng.handshake(type_, ec); - if (want != engine::want_input_and_retry - || bytes_transferred == total_buffer_size_) - return want; - - // Find the next buffer piece to be fed to the engine. - while (iter != end) - { - const_buffer buffer(*iter); - - // Skip over any buffers which have already been consumed by the engine. - if (bytes_transferred >= accumulated_size + buffer.size()) - { - accumulated_size += buffer.size(); - ++iter; - continue; - } - - // The current buffer may have been partially consumed by the engine on - // a previous iteration. If so, adjust the buffer to point to the - // unused portion. - if (bytes_transferred > accumulated_size) - buffer = buffer + (bytes_transferred - accumulated_size); - - // Pass the buffer to the engine, and update the bytes transferred to - // reflect the total number of bytes consumed so far. - bytes_transferred += buffer.size(); - buffer = eng.put_input(buffer); - bytes_transferred -= buffer.size(); - break; - } - } - } - - stream_base::handshake_type type_; - ConstBufferSequence buffers_; - std::size_t total_buffer_size_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_BUFFERED_HANDSHAKE_OP_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/engine.hpp b/scout_sdk/asio/asio/ssl/detail/engine.hpp deleted file mode 100644 index 2f033d6..0000000 --- a/scout_sdk/asio/asio/ssl/detail/engine.hpp +++ /dev/null @@ -1,160 +0,0 @@ -// -// ssl/detail/engine.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_ENGINE_HPP -#define ASIO_SSL_DETAIL_ENGINE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/buffer.hpp" -#include "asio/detail/static_mutex.hpp" -#include "asio/ssl/detail/openssl_types.hpp" -#include "asio/ssl/detail/verify_callback.hpp" -#include "asio/ssl/stream_base.hpp" -#include "asio/ssl/verify_mode.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class engine -{ -public: - enum want - { - // Returned by functions to indicate that the engine wants input. The input - // buffer should be updated to point to the data. The engine then needs to - // be called again to retry the operation. - want_input_and_retry = -2, - - // Returned by functions to indicate that the engine wants to write output. - // The output buffer points to the data to be written. The engine then - // needs to be called again to retry the operation. - want_output_and_retry = -1, - - // Returned by functions to indicate that the engine doesn't need input or - // output. - want_nothing = 0, - - // Returned by functions to indicate that the engine wants to write output. - // The output buffer points to the data to be written. After that the - // operation is complete, and the engine does not need to be called again. - want_output = 1 - }; - - // Construct a new engine for the specified context. - ASIO_DECL explicit engine(SSL_CTX* context); - - // Destructor. - ASIO_DECL ~engine(); - - // Get the underlying implementation in the native type. - ASIO_DECL SSL* native_handle(); - - // Set the peer verification mode. - ASIO_DECL asio::error_code set_verify_mode( - verify_mode v, asio::error_code& ec); - - // Set the peer verification depth. - ASIO_DECL asio::error_code set_verify_depth( - int depth, asio::error_code& ec); - - // Set a peer certificate verification callback. - ASIO_DECL asio::error_code set_verify_callback( - verify_callback_base* callback, asio::error_code& ec); - - // Perform an SSL handshake using either SSL_connect (client-side) or - // SSL_accept (server-side). - ASIO_DECL want handshake( - stream_base::handshake_type type, asio::error_code& ec); - - // Perform a graceful shutdown of the SSL session. - ASIO_DECL want shutdown(asio::error_code& ec); - - // Write bytes to the SSL session. - ASIO_DECL want write(const asio::const_buffer& data, - asio::error_code& ec, std::size_t& bytes_transferred); - - // Read bytes from the SSL session. - ASIO_DECL want read(const asio::mutable_buffer& data, - asio::error_code& ec, std::size_t& bytes_transferred); - - // Get output data to be written to the transport. - ASIO_DECL asio::mutable_buffer get_output( - const asio::mutable_buffer& data); - - // Put input data that was read from the transport. - ASIO_DECL asio::const_buffer put_input( - const asio::const_buffer& data); - - // Map an error::eof code returned by the underlying transport according to - // the type and state of the SSL session. Returns a const reference to the - // error code object, suitable for passing to a completion handler. - ASIO_DECL const asio::error_code& map_error_code( - asio::error_code& ec) const; - -private: - // Disallow copying and assignment. - engine(const engine&); - engine& operator=(const engine&); - - // Callback used when the SSL implementation wants to verify a certificate. - ASIO_DECL static int verify_callback_function( - int preverified, X509_STORE_CTX* ctx); - -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) - // The SSL_accept function may not be thread safe. This mutex is used to - // protect all calls to the SSL_accept function. - ASIO_DECL static asio::detail::static_mutex& accept_mutex(); -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) - - // Perform one operation. Returns >= 0 on success or error, want_read if the - // operation needs more input, or want_write if it needs to write some output - // before the operation can complete. - ASIO_DECL want perform(int (engine::* op)(void*, std::size_t), - void* data, std::size_t length, asio::error_code& ec, - std::size_t* bytes_transferred); - - // Adapt the SSL_accept function to the signature needed for perform(). - ASIO_DECL int do_accept(void*, std::size_t); - - // Adapt the SSL_connect function to the signature needed for perform(). - ASIO_DECL int do_connect(void*, std::size_t); - - // Adapt the SSL_shutdown function to the signature needed for perform(). - ASIO_DECL int do_shutdown(void*, std::size_t); - - // Adapt the SSL_read function to the signature needed for perform(). - ASIO_DECL int do_read(void* data, std::size_t length); - - // Adapt the SSL_write function to the signature needed for perform(). - ASIO_DECL int do_write(void* data, std::size_t length); - - SSL* ssl_; - BIO* ext_bio_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/ssl/detail/impl/engine.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_SSL_DETAIL_ENGINE_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/handshake_op.hpp b/scout_sdk/asio/asio/ssl/detail/handshake_op.hpp deleted file mode 100644 index f782023..0000000 --- a/scout_sdk/asio/asio/ssl/detail/handshake_op.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// ssl/detail/handshake_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_HANDSHAKE_OP_HPP -#define ASIO_SSL_DETAIL_HANDSHAKE_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/ssl/detail/engine.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class handshake_op -{ -public: - handshake_op(stream_base::handshake_type type) - : type_(type) - { - } - - engine::want operator()(engine& eng, - asio::error_code& ec, - std::size_t& bytes_transferred) const - { - bytes_transferred = 0; - return eng.handshake(type_, ec); - } - - template - void call_handler(Handler& handler, - const asio::error_code& ec, - const std::size_t&) const - { - handler(ec); - } - -private: - stream_base::handshake_type type_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_HANDSHAKE_OP_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/impl/engine.ipp b/scout_sdk/asio/asio/ssl/detail/impl/engine.ipp deleted file mode 100644 index e60e8d6..0000000 --- a/scout_sdk/asio/asio/ssl/detail/impl/engine.ipp +++ /dev/null @@ -1,322 +0,0 @@ -// -// ssl/detail/impl/engine.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_IMPL_ENGINE_IPP -#define ASIO_SSL_DETAIL_IMPL_ENGINE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/ssl/detail/engine.hpp" -#include "asio/ssl/error.hpp" -#include "asio/ssl/verify_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -engine::engine(SSL_CTX* context) - : ssl_(::SSL_new(context)) -{ - if (!ssl_) - { - asio::error_code ec( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - asio::detail::throw_error(ec, "engine"); - } - -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) - accept_mutex().init(); -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) - - ::SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE); - ::SSL_set_mode(ssl_, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); -#if defined(SSL_MODE_RELEASE_BUFFERS) - ::SSL_set_mode(ssl_, SSL_MODE_RELEASE_BUFFERS); -#endif // defined(SSL_MODE_RELEASE_BUFFERS) - - ::BIO* int_bio = 0; - ::BIO_new_bio_pair(&int_bio, 0, &ext_bio_, 0); - ::SSL_set_bio(ssl_, int_bio, int_bio); -} - -engine::~engine() -{ - if (SSL_get_app_data(ssl_)) - { - delete static_cast(SSL_get_app_data(ssl_)); - SSL_set_app_data(ssl_, 0); - } - - ::BIO_free(ext_bio_); - ::SSL_free(ssl_); -} - -SSL* engine::native_handle() -{ - return ssl_; -} - -asio::error_code engine::set_verify_mode( - verify_mode v, asio::error_code& ec) -{ - ::SSL_set_verify(ssl_, v, ::SSL_get_verify_callback(ssl_)); - - ec = asio::error_code(); - return ec; -} - -asio::error_code engine::set_verify_depth( - int depth, asio::error_code& ec) -{ - ::SSL_set_verify_depth(ssl_, depth); - - ec = asio::error_code(); - return ec; -} - -asio::error_code engine::set_verify_callback( - verify_callback_base* callback, asio::error_code& ec) -{ - if (SSL_get_app_data(ssl_)) - delete static_cast(SSL_get_app_data(ssl_)); - - SSL_set_app_data(ssl_, callback); - - ::SSL_set_verify(ssl_, ::SSL_get_verify_mode(ssl_), - &engine::verify_callback_function); - - ec = asio::error_code(); - return ec; -} - -int engine::verify_callback_function(int preverified, X509_STORE_CTX* ctx) -{ - if (ctx) - { - if (SSL* ssl = static_cast( - ::X509_STORE_CTX_get_ex_data( - ctx, ::SSL_get_ex_data_X509_STORE_CTX_idx()))) - { - if (SSL_get_app_data(ssl)) - { - verify_callback_base* callback = - static_cast( - SSL_get_app_data(ssl)); - - verify_context verify_ctx(ctx); - return callback->call(preverified != 0, verify_ctx) ? 1 : 0; - } - } - } - - return 0; -} - -engine::want engine::handshake( - stream_base::handshake_type type, asio::error_code& ec) -{ - return perform((type == asio::ssl::stream_base::client) - ? &engine::do_connect : &engine::do_accept, 0, 0, ec, 0); -} - -engine::want engine::shutdown(asio::error_code& ec) -{ - return perform(&engine::do_shutdown, 0, 0, ec, 0); -} - -engine::want engine::write(const asio::const_buffer& data, - asio::error_code& ec, std::size_t& bytes_transferred) -{ - if (data.size() == 0) - { - ec = asio::error_code(); - return engine::want_nothing; - } - - return perform(&engine::do_write, - const_cast(data.data()), - data.size(), ec, &bytes_transferred); -} - -engine::want engine::read(const asio::mutable_buffer& data, - asio::error_code& ec, std::size_t& bytes_transferred) -{ - if (data.size() == 0) - { - ec = asio::error_code(); - return engine::want_nothing; - } - - return perform(&engine::do_read, data.data(), - data.size(), ec, &bytes_transferred); -} - -asio::mutable_buffer engine::get_output( - const asio::mutable_buffer& data) -{ - int length = ::BIO_read(ext_bio_, - data.data(), static_cast(data.size())); - - return asio::buffer(data, - length > 0 ? static_cast(length) : 0); -} - -asio::const_buffer engine::put_input( - const asio::const_buffer& data) -{ - int length = ::BIO_write(ext_bio_, - data.data(), static_cast(data.size())); - - return asio::buffer(data + - (length > 0 ? static_cast(length) : 0)); -} - -const asio::error_code& engine::map_error_code( - asio::error_code& ec) const -{ - // We only want to map the error::eof code. - if (ec != asio::error::eof) - return ec; - - // If there's data yet to be read, it's an error. - if (BIO_wpending(ext_bio_)) - { - ec = asio::ssl::error::stream_truncated; - return ec; - } - - // SSL v2 doesn't provide a protocol-level shutdown, so an eof on the - // underlying transport is passed through. -#if (OPENSSL_VERSION_NUMBER < 0x10100000L) - if (SSL_version(ssl_) == SSL2_VERSION) - return ec; -#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) - - // Otherwise, the peer should have negotiated a proper shutdown. - if ((::SSL_get_shutdown(ssl_) & SSL_RECEIVED_SHUTDOWN) == 0) - { - ec = asio::ssl::error::stream_truncated; - } - - return ec; -} - -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) -asio::detail::static_mutex& engine::accept_mutex() -{ - static asio::detail::static_mutex mutex = ASIO_STATIC_MUTEX_INIT; - return mutex; -} -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) - -engine::want engine::perform(int (engine::* op)(void*, std::size_t), - void* data, std::size_t length, asio::error_code& ec, - std::size_t* bytes_transferred) -{ - std::size_t pending_output_before = ::BIO_ctrl_pending(ext_bio_); - ::ERR_clear_error(); - int result = (this->*op)(data, length); - int ssl_error = ::SSL_get_error(ssl_, result); - int sys_error = static_cast(::ERR_get_error()); - std::size_t pending_output_after = ::BIO_ctrl_pending(ext_bio_); - - if (ssl_error == SSL_ERROR_SSL) - { - ec = asio::error_code(sys_error, - asio::error::get_ssl_category()); - return want_nothing; - } - - if (ssl_error == SSL_ERROR_SYSCALL) - { - ec = asio::error_code(sys_error, - asio::error::get_system_category()); - return want_nothing; - } - - if (result > 0 && bytes_transferred) - *bytes_transferred = static_cast(result); - - if (ssl_error == SSL_ERROR_WANT_WRITE) - { - ec = asio::error_code(); - return want_output_and_retry; - } - else if (pending_output_after > pending_output_before) - { - ec = asio::error_code(); - return result > 0 ? want_output : want_output_and_retry; - } - else if (ssl_error == SSL_ERROR_WANT_READ) - { - ec = asio::error_code(); - return want_input_and_retry; - } - else if (::SSL_get_shutdown(ssl_) & SSL_RECEIVED_SHUTDOWN) - { - ec = asio::error::eof; - return want_nothing; - } - else - { - ec = asio::error_code(); - return want_nothing; - } -} - -int engine::do_accept(void*, std::size_t) -{ -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) - asio::detail::static_mutex::scoped_lock lock(accept_mutex()); -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) - return ::SSL_accept(ssl_); -} - -int engine::do_connect(void*, std::size_t) -{ - return ::SSL_connect(ssl_); -} - -int engine::do_shutdown(void*, std::size_t) -{ - int result = ::SSL_shutdown(ssl_); - if (result == 0) - result = ::SSL_shutdown(ssl_); - return result; -} - -int engine::do_read(void* data, std::size_t length) -{ - return ::SSL_read(ssl_, data, - length < INT_MAX ? static_cast(length) : INT_MAX); -} - -int engine::do_write(void* data, std::size_t length) -{ - return ::SSL_write(ssl_, data, - length < INT_MAX ? static_cast(length) : INT_MAX); -} - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_IMPL_ENGINE_IPP diff --git a/scout_sdk/asio/asio/ssl/detail/impl/openssl_init.ipp b/scout_sdk/asio/asio/ssl/detail/impl/openssl_init.ipp deleted file mode 100644 index fb0fff9..0000000 --- a/scout_sdk/asio/asio/ssl/detail/impl/openssl_init.ipp +++ /dev/null @@ -1,165 +0,0 @@ -// -// ssl/detail/impl/openssl_init.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP -#define ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/assert.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/tss_ptr.hpp" -#include "asio/ssl/detail/openssl_init.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class openssl_init_base::do_init -{ -public: - do_init() - { -#if (OPENSSL_VERSION_NUMBER < 0x10100000L) - ::SSL_library_init(); - ::SSL_load_error_strings(); - ::OpenSSL_add_all_algorithms(); - - mutexes_.resize(::CRYPTO_num_locks()); - for (size_t i = 0; i < mutexes_.size(); ++i) - mutexes_[i].reset(new asio::detail::mutex); - ::CRYPTO_set_locking_callback(&do_init::openssl_locking_func); -#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) - ::CRYPTO_set_id_callback(&do_init::openssl_id_func); -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) - -#if !defined(SSL_OP_NO_COMPRESSION) \ - && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - null_compression_methods_ = sk_SSL_COMP_new_null(); -#endif // !defined(SSL_OP_NO_COMPRESSION) - // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - } - - ~do_init() - { -#if !defined(SSL_OP_NO_COMPRESSION) \ - && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - sk_SSL_COMP_free(null_compression_methods_); -#endif // !defined(SSL_OP_NO_COMPRESSION) - // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) - ::CRYPTO_set_id_callback(0); -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) -#if (OPENSSL_VERSION_NUMBER < 0x10100000L) - ::CRYPTO_set_locking_callback(0); - ::ERR_free_strings(); - ::EVP_cleanup(); - ::CRYPTO_cleanup_all_ex_data(); -#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) - ::ERR_remove_state(0); -#elif (OPENSSL_VERSION_NUMBER < 0x10100000L) - ::ERR_remove_thread_state(NULL); -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) -#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) \ - && (OPENSSL_VERSION_NUMBER < 0x10100000L) \ - && !defined(SSL_OP_NO_COMPRESSION) - ::SSL_COMP_free_compression_methods(); -#endif // (OPENSSL_VERSION_NUMBER >= 0x10002000L) - // && (OPENSSL_VERSION_NUMBER < 0x10100000L) - // && !defined(SSL_OP_NO_COMPRESSION) -#if !defined(OPENSSL_IS_BORINGSSL) - ::CONF_modules_unload(1); -#endif // !defined(OPENSSL_IS_BORINGSSL) -#if !defined(OPENSSL_NO_ENGINE) \ - && (OPENSSL_VERSION_NUMBER < 0x10100000L) - ::ENGINE_cleanup(); -#endif // !defined(OPENSSL_NO_ENGINE) - // && (OPENSSL_VERSION_NUMBER < 0x10100000L) - } - -#if !defined(SSL_OP_NO_COMPRESSION) \ - && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - STACK_OF(SSL_COMP)* get_null_compression_methods() const - { - return null_compression_methods_; - } -#endif // !defined(SSL_OP_NO_COMPRESSION) - // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - -private: -#if (OPENSSL_VERSION_NUMBER < 0x10000000L) - static unsigned long openssl_id_func() - { -#if defined(ASIO_WINDOWS) || defined(__CYGWIN__) - return ::GetCurrentThreadId(); -#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - void* id = &errno; - ASIO_ASSERT(sizeof(unsigned long) >= sizeof(void*)); - return reinterpret_cast(id); -#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__) - } -#endif // (OPENSSL_VERSION_NUMBER < 0x10000000L) - -#if (OPENSSL_VERSION_NUMBER < 0x10100000L) - static void openssl_locking_func(int mode, int n, - const char* /*file*/, int /*line*/) - { - if (mode & CRYPTO_LOCK) - instance()->mutexes_[n]->lock(); - else - instance()->mutexes_[n]->unlock(); - } - - // Mutexes to be used in locking callbacks. - std::vector > mutexes_; -#endif // (OPENSSL_VERSION_NUMBER < 0x10100000L) - -#if !defined(SSL_OP_NO_COMPRESSION) \ - && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - STACK_OF(SSL_COMP)* null_compression_methods_; -#endif // !defined(SSL_OP_NO_COMPRESSION) - // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) -}; - -asio::detail::shared_ptr -openssl_init_base::instance() -{ - static asio::detail::shared_ptr init(new do_init); - return init; -} - -#if !defined(SSL_OP_NO_COMPRESSION) \ - && (OPENSSL_VERSION_NUMBER >= 0x00908000L) -STACK_OF(SSL_COMP)* openssl_init_base::get_null_compression_methods() -{ - return instance()->get_null_compression_methods(); -} -#endif // !defined(SSL_OP_NO_COMPRESSION) - // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_IMPL_OPENSSL_INIT_IPP diff --git a/scout_sdk/asio/asio/ssl/detail/io.hpp b/scout_sdk/asio/asio/ssl/detail/io.hpp deleted file mode 100644 index 0b0e51a..0000000 --- a/scout_sdk/asio/asio/ssl/detail/io.hpp +++ /dev/null @@ -1,372 +0,0 @@ -// -// ssl/detail/io.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_IO_HPP -#define ASIO_SSL_DETAIL_IO_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/ssl/detail/engine.hpp" -#include "asio/ssl/detail/stream_core.hpp" -#include "asio/write.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -template -std::size_t io(Stream& next_layer, stream_core& core, - const Operation& op, asio::error_code& ec) -{ - std::size_t bytes_transferred = 0; - do switch (op(core.engine_, ec, bytes_transferred)) - { - case engine::want_input_and_retry: - - // If the input buffer is empty then we need to read some more data from - // the underlying transport. - if (core.input_.size() == 0) - core.input_ = asio::buffer(core.input_buffer_, - next_layer.read_some(core.input_buffer_, ec)); - - // Pass the new input data to the engine. - core.input_ = core.engine_.put_input(core.input_); - - // Try the operation again. - continue; - - case engine::want_output_and_retry: - - // Get output data from the engine and write it to the underlying - // transport. - asio::write(next_layer, - core.engine_.get_output(core.output_buffer_), ec); - - // Try the operation again. - continue; - - case engine::want_output: - - // Get output data from the engine and write it to the underlying - // transport. - asio::write(next_layer, - core.engine_.get_output(core.output_buffer_), ec); - - // Operation is complete. Return result to caller. - core.engine_.map_error_code(ec); - return bytes_transferred; - - default: - - // Operation is complete. Return result to caller. - core.engine_.map_error_code(ec); - return bytes_transferred; - - } while (!ec); - - // Operation failed. Return result to caller. - core.engine_.map_error_code(ec); - return 0; -} - -template -class io_op -{ -public: - io_op(Stream& next_layer, stream_core& core, - const Operation& op, Handler& handler) - : next_layer_(next_layer), - core_(core), - op_(op), - start_(0), - want_(engine::want_nothing), - bytes_transferred_(0), - handler_(ASIO_MOVE_CAST(Handler)(handler)) - { - } - -#if defined(ASIO_HAS_MOVE) - io_op(const io_op& other) - : next_layer_(other.next_layer_), - core_(other.core_), - op_(other.op_), - start_(other.start_), - want_(other.want_), - ec_(other.ec_), - bytes_transferred_(other.bytes_transferred_), - handler_(other.handler_) - { - } - - io_op(io_op&& other) - : next_layer_(other.next_layer_), - core_(other.core_), - op_(ASIO_MOVE_CAST(Operation)(other.op_)), - start_(other.start_), - want_(other.want_), - ec_(other.ec_), - bytes_transferred_(other.bytes_transferred_), - handler_(ASIO_MOVE_CAST(Handler)(other.handler_)) - { - } -#endif // defined(ASIO_HAS_MOVE) - - void operator()(asio::error_code ec, - std::size_t bytes_transferred = ~std::size_t(0), int start = 0) - { - switch (start_ = start) - { - case 1: // Called after at least one async operation. - do - { - switch (want_ = op_(core_.engine_, ec_, bytes_transferred_)) - { - case engine::want_input_and_retry: - - // If the input buffer already has data in it we can pass it to the - // engine and then retry the operation immediately. - if (core_.input_.size() != 0) - { - core_.input_ = core_.engine_.put_input(core_.input_); - continue; - } - - // The engine wants more data to be read from input. However, we - // cannot allow more than one read operation at a time on the - // underlying transport. The pending_read_ timer's expiry is set to - // pos_infin if a read is in progress, and neg_infin otherwise. - if (core_.expiry(core_.pending_read_) == core_.neg_infin()) - { - // Prevent other read operations from being started. - core_.pending_read_.expires_at(core_.pos_infin()); - - // Start reading some data from the underlying transport. - next_layer_.async_read_some( - asio::buffer(core_.input_buffer_), - ASIO_MOVE_CAST(io_op)(*this)); - } - else - { - // Wait until the current read operation completes. - core_.pending_read_.async_wait(ASIO_MOVE_CAST(io_op)(*this)); - } - - // Yield control until asynchronous operation completes. Control - // resumes at the "default:" label below. - return; - - case engine::want_output_and_retry: - case engine::want_output: - - // The engine wants some data to be written to the output. However, we - // cannot allow more than one write operation at a time on the - // underlying transport. The pending_write_ timer's expiry is set to - // pos_infin if a write is in progress, and neg_infin otherwise. - if (core_.expiry(core_.pending_write_) == core_.neg_infin()) - { - // Prevent other write operations from being started. - core_.pending_write_.expires_at(core_.pos_infin()); - - // Start writing all the data to the underlying transport. - asio::async_write(next_layer_, - core_.engine_.get_output(core_.output_buffer_), - ASIO_MOVE_CAST(io_op)(*this)); - } - else - { - // Wait until the current write operation completes. - core_.pending_write_.async_wait(ASIO_MOVE_CAST(io_op)(*this)); - } - - // Yield control until asynchronous operation completes. Control - // resumes at the "default:" label below. - return; - - default: - - // The SSL operation is done and we can invoke the handler, but we - // have to keep in mind that this function might be being called from - // the async operation's initiating function. In this case we're not - // allowed to call the handler directly. Instead, issue a zero-sized - // read so the handler runs "as-if" posted using io_context::post(). - if (start) - { - next_layer_.async_read_some( - asio::buffer(core_.input_buffer_, 0), - ASIO_MOVE_CAST(io_op)(*this)); - - // Yield control until asynchronous operation completes. Control - // resumes at the "default:" label below. - return; - } - else - { - // Continue on to run handler directly. - break; - } - } - - default: - if (bytes_transferred == ~std::size_t(0)) - bytes_transferred = 0; // Timer cancellation, no data transferred. - else if (!ec_) - ec_ = ec; - - switch (want_) - { - case engine::want_input_and_retry: - - // Add received data to the engine's input. - core_.input_ = asio::buffer( - core_.input_buffer_, bytes_transferred); - core_.input_ = core_.engine_.put_input(core_.input_); - - // Release any waiting read operations. - core_.pending_read_.expires_at(core_.neg_infin()); - - // Try the operation again. - continue; - - case engine::want_output_and_retry: - - // Release any waiting write operations. - core_.pending_write_.expires_at(core_.neg_infin()); - - // Try the operation again. - continue; - - case engine::want_output: - - // Release any waiting write operations. - core_.pending_write_.expires_at(core_.neg_infin()); - - // Fall through to call handler. - - default: - - // Pass the result to the handler. - op_.call_handler(handler_, - core_.engine_.map_error_code(ec_), - ec_ ? 0 : bytes_transferred_); - - // Our work here is done. - return; - } - } while (!ec_); - - // Operation failed. Pass the result to the handler. - op_.call_handler(handler_, core_.engine_.map_error_code(ec_), 0); - } - } - -//private: - Stream& next_layer_; - stream_core& core_; - Operation op_; - int start_; - engine::want want_; - asio::error_code ec_; - std::size_t bytes_transferred_; - Handler handler_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - io_op* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - io_op* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, this_handler->handler_); -} - -template -inline bool asio_handler_is_continuation( - io_op* this_handler) -{ - return this_handler->start_ == 0 ? true - : asio_handler_cont_helpers::is_continuation(this_handler->handler_); -} - -template -inline void asio_handler_invoke(Function& function, - io_op* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - io_op* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, this_handler->handler_); -} - -template -inline void async_io(Stream& next_layer, stream_core& core, - const Operation& op, Handler& handler) -{ - io_op( - next_layer, core, op, handler)( - asio::error_code(), 0, 1); -} - -} // namespace detail -} // namespace ssl - -template -struct associated_allocator< - ssl::detail::io_op, Allocator> -{ - typedef typename associated_allocator::type type; - - static type get(const ssl::detail::io_op& h, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return associated_allocator::get(h.handler_, a); - } -}; - -template -struct associated_executor< - ssl::detail::io_op, Executor> -{ - typedef typename associated_executor::type type; - - static type get(const ssl::detail::io_op& h, - const Executor& ex = Executor()) ASIO_NOEXCEPT - { - return associated_executor::get(h.handler_, ex); - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_IO_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/openssl_init.hpp b/scout_sdk/asio/asio/ssl/detail/openssl_init.hpp deleted file mode 100644 index c3e4727..0000000 --- a/scout_sdk/asio/asio/ssl/detail/openssl_init.hpp +++ /dev/null @@ -1,101 +0,0 @@ -// -// ssl/detail/openssl_init.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_OPENSSL_INIT_HPP -#define ASIO_SSL_DETAIL_OPENSSL_INIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/detail/memory.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class openssl_init_base - : private noncopyable -{ -protected: - // Class that performs the actual initialisation. - class do_init; - - // Helper function to manage a do_init singleton. The static instance of the - // openssl_init object ensures that this function is always called before - // main, and therefore before any other threads can get started. The do_init - // instance must be static in this function to ensure that it gets - // initialised before any other global objects try to use it. - ASIO_DECL static asio::detail::shared_ptr instance(); - -#if !defined(SSL_OP_NO_COMPRESSION) \ - && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - // Get an empty stack of compression methods, to be used when disabling - // compression. - ASIO_DECL static STACK_OF(SSL_COMP)* get_null_compression_methods(); -#endif // !defined(SSL_OP_NO_COMPRESSION) - // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) -}; - -template -class openssl_init : private openssl_init_base -{ -public: - // Constructor. - openssl_init() - : ref_(instance()) - { - using namespace std; // For memmove. - - // Ensure openssl_init::instance_ is linked in. - openssl_init* tmp = &instance_; - memmove(&tmp, &tmp, sizeof(openssl_init*)); - } - - // Destructor. - ~openssl_init() - { - } - -#if !defined(SSL_OP_NO_COMPRESSION) \ - && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - using openssl_init_base::get_null_compression_methods; -#endif // !defined(SSL_OP_NO_COMPRESSION) - // && (OPENSSL_VERSION_NUMBER >= 0x00908000L) - -private: - // Instance to force initialisation of openssl at global scope. - static openssl_init instance_; - - // Reference to singleton do_init object to ensure that openssl does not get - // cleaned up until the last user has finished with it. - asio::detail::shared_ptr ref_; -}; - -template -openssl_init openssl_init::instance_; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/ssl/detail/impl/openssl_init.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_SSL_DETAIL_OPENSSL_INIT_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/openssl_types.hpp b/scout_sdk/asio/asio/ssl/detail/openssl_types.hpp deleted file mode 100644 index a044af3..0000000 --- a/scout_sdk/asio/asio/ssl/detail/openssl_types.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// -// ssl/detail/openssl_types.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP -#define ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/socket_types.hpp" -#include -#include -#if !defined(OPENSSL_NO_ENGINE) -# include -#endif // !defined(OPENSSL_NO_ENGINE) -#include -#include -#include -#include - -#endif // ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/password_callback.hpp b/scout_sdk/asio/asio/ssl/detail/password_callback.hpp deleted file mode 100644 index 9b1dbee..0000000 --- a/scout_sdk/asio/asio/ssl/detail/password_callback.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// ssl/detail/password_callback.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_PASSWORD_CALLBACK_HPP -#define ASIO_SSL_DETAIL_PASSWORD_CALLBACK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include -#include "asio/ssl/context_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class password_callback_base -{ -public: - virtual ~password_callback_base() - { - } - - virtual std::string call(std::size_t size, - context_base::password_purpose purpose) = 0; -}; - -template -class password_callback : public password_callback_base -{ -public: - explicit password_callback(PasswordCallback callback) - : callback_(callback) - { - } - - virtual std::string call(std::size_t size, - context_base::password_purpose purpose) - { - return callback_(size, purpose); - } - -private: - PasswordCallback callback_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_PASSWORD_CALLBACK_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/read_op.hpp b/scout_sdk/asio/asio/ssl/detail/read_op.hpp deleted file mode 100644 index b0d6de2..0000000 --- a/scout_sdk/asio/asio/ssl/detail/read_op.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// ssl/detail/read_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_READ_OP_HPP -#define ASIO_SSL_DETAIL_READ_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/ssl/detail/engine.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -template -class read_op -{ -public: - read_op(const MutableBufferSequence& buffers) - : buffers_(buffers) - { - } - - engine::want operator()(engine& eng, - asio::error_code& ec, - std::size_t& bytes_transferred) const - { - asio::mutable_buffer buffer = - asio::detail::buffer_sequence_adapter::first(buffers_); - - return eng.read(buffer, ec, bytes_transferred); - } - - template - void call_handler(Handler& handler, - const asio::error_code& ec, - const std::size_t& bytes_transferred) const - { - handler(ec, bytes_transferred); - } - -private: - MutableBufferSequence buffers_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_READ_OP_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/shutdown_op.hpp b/scout_sdk/asio/asio/ssl/detail/shutdown_op.hpp deleted file mode 100644 index d20b430..0000000 --- a/scout_sdk/asio/asio/ssl/detail/shutdown_op.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// -// ssl/detail/shutdown_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_SHUTDOWN_OP_HPP -#define ASIO_SSL_DETAIL_SHUTDOWN_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/ssl/detail/engine.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class shutdown_op -{ -public: - engine::want operator()(engine& eng, - asio::error_code& ec, - std::size_t& bytes_transferred) const - { - bytes_transferred = 0; - return eng.shutdown(ec); - } - - template - void call_handler(Handler& handler, - const asio::error_code& ec, - const std::size_t&) const - { - handler(ec); - } -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_SHUTDOWN_OP_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/stream_core.hpp b/scout_sdk/asio/asio/ssl/detail/stream_core.hpp deleted file mode 100644 index 13fde74..0000000 --- a/scout_sdk/asio/asio/ssl/detail/stream_core.hpp +++ /dev/null @@ -1,134 +0,0 @@ -// -// ssl/detail/stream_core.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_STREAM_CORE_HPP -#define ASIO_SSL_DETAIL_STREAM_CORE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_BOOST_DATE_TIME) -# include "asio/deadline_timer.hpp" -#else // defined(ASIO_HAS_BOOST_DATE_TIME) -# include "asio/steady_timer.hpp" -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) -#include "asio/ssl/detail/engine.hpp" -#include "asio/buffer.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -struct stream_core -{ - // According to the OpenSSL documentation, this is the buffer size that is - // sufficient to hold the largest possible TLS record. - enum { max_tls_record_size = 17 * 1024 }; - - stream_core(SSL_CTX* context, asio::io_context& io_context) - : engine_(context), - pending_read_(io_context), - pending_write_(io_context), - output_buffer_space_(max_tls_record_size), - output_buffer_(asio::buffer(output_buffer_space_)), - input_buffer_space_(max_tls_record_size), - input_buffer_(asio::buffer(input_buffer_space_)) - { - pending_read_.expires_at(neg_infin()); - pending_write_.expires_at(neg_infin()); - } - - ~stream_core() - { - } - - // The SSL engine. - engine engine_; - -#if defined(ASIO_HAS_BOOST_DATE_TIME) - // Timer used for storing queued read operations. - asio::deadline_timer pending_read_; - - // Timer used for storing queued write operations. - asio::deadline_timer pending_write_; - - // Helper function for obtaining a time value that always fires. - static asio::deadline_timer::time_type neg_infin() - { - return boost::posix_time::neg_infin; - } - - // Helper function for obtaining a time value that never fires. - static asio::deadline_timer::time_type pos_infin() - { - return boost::posix_time::pos_infin; - } - - // Helper function to get a timer's expiry time. - static asio::deadline_timer::time_type expiry( - const asio::deadline_timer& timer) - { - return timer.expires_at(); - } -#else // defined(ASIO_HAS_BOOST_DATE_TIME) - // Timer used for storing queued read operations. - asio::steady_timer pending_read_; - - // Timer used for storing queued write operations. - asio::steady_timer pending_write_; - - // Helper function for obtaining a time value that always fires. - static asio::steady_timer::time_point neg_infin() - { - return (asio::steady_timer::time_point::min)(); - } - - // Helper function for obtaining a time value that never fires. - static asio::steady_timer::time_point pos_infin() - { - return (asio::steady_timer::time_point::max)(); - } - - // Helper function to get a timer's expiry time. - static asio::steady_timer::time_point expiry( - const asio::steady_timer& timer) - { - return timer.expiry(); - } -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - - // Buffer space used to prepare output intended for the transport. - std::vector output_buffer_space_; - - // A buffer that may be used to prepare output intended for the transport. - const asio::mutable_buffer output_buffer_; - - // Buffer space used to read input intended for the engine. - std::vector input_buffer_space_; - - // A buffer that may be used to read input intended for the engine. - const asio::mutable_buffer input_buffer_; - - // The buffer pointing to the engine's unconsumed input. - asio::const_buffer input_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_STREAM_CORE_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/verify_callback.hpp b/scout_sdk/asio/asio/ssl/detail/verify_callback.hpp deleted file mode 100644 index 1c56a27..0000000 --- a/scout_sdk/asio/asio/ssl/detail/verify_callback.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// ssl/detail/verify_callback.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_VERIFY_CALLBACK_HPP -#define ASIO_SSL_DETAIL_VERIFY_CALLBACK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/ssl/verify_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class verify_callback_base -{ -public: - virtual ~verify_callback_base() - { - } - - virtual bool call(bool preverified, verify_context& ctx) = 0; -}; - -template -class verify_callback : public verify_callback_base -{ -public: - explicit verify_callback(VerifyCallback callback) - : callback_(callback) - { - } - - virtual bool call(bool preverified, verify_context& ctx) - { - return callback_(preverified, ctx); - } - -private: - VerifyCallback callback_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_VERIFY_CALLBACK_HPP diff --git a/scout_sdk/asio/asio/ssl/detail/write_op.hpp b/scout_sdk/asio/asio/ssl/detail/write_op.hpp deleted file mode 100644 index 1d341c0..0000000 --- a/scout_sdk/asio/asio/ssl/detail/write_op.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// ssl/detail/write_op.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_WRITE_OP_HPP -#define ASIO_SSL_DETAIL_WRITE_OP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/ssl/detail/engine.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -template -class write_op -{ -public: - write_op(const ConstBufferSequence& buffers) - : buffers_(buffers) - { - } - - engine::want operator()(engine& eng, - asio::error_code& ec, - std::size_t& bytes_transferred) const - { - asio::const_buffer buffer = - asio::detail::buffer_sequence_adapter::first(buffers_); - - return eng.write(buffer, ec, bytes_transferred); - } - - template - void call_handler(Handler& handler, - const asio::error_code& ec, - const std::size_t& bytes_transferred) const - { - handler(ec, bytes_transferred); - } - -private: - ConstBufferSequence buffers_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_WRITE_OP_HPP diff --git a/scout_sdk/asio/asio/ssl/error.hpp b/scout_sdk/asio/asio/ssl/error.hpp deleted file mode 100644 index 6165c5c..0000000 --- a/scout_sdk/asio/asio/ssl/error.hpp +++ /dev/null @@ -1,111 +0,0 @@ -// -// ssl/error.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_ERROR_HPP -#define ASIO_SSL_ERROR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/error_code.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace error { - -enum ssl_errors -{ - // Error numbers are those produced by openssl. -}; - -extern ASIO_DECL -const asio::error_category& get_ssl_category(); - -static const asio::error_category& - ssl_category ASIO_UNUSED_VARIABLE - = asio::error::get_ssl_category(); - -} // namespace error -namespace ssl { -namespace error { - -enum stream_errors -{ -#if defined(GENERATING_DOCUMENTATION) - /// The underlying stream closed before the ssl stream gracefully shut down. - stream_truncated -#elif (OPENSSL_VERSION_NUMBER < 0x10100000L) && !defined(OPENSSL_IS_BORINGSSL) - stream_truncated = ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ) -#else - stream_truncated = 1 -#endif -}; - -extern ASIO_DECL -const asio::error_category& get_stream_category(); - -static const asio::error_category& - stream_category ASIO_UNUSED_VARIABLE - = asio::ssl::error::get_stream_category(); - -} // namespace error -} // namespace ssl -} // namespace asio - -#if defined(ASIO_HAS_STD_SYSTEM_ERROR) -namespace std { - -template<> struct is_error_code_enum -{ - static const bool value = true; -}; - -template<> struct is_error_code_enum -{ - static const bool value = true; -}; - -} // namespace std -#endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -namespace asio { -namespace error { - -inline asio::error_code make_error_code(ssl_errors e) -{ - return asio::error_code( - static_cast(e), get_ssl_category()); -} - -} // namespace error -namespace ssl { -namespace error { - -inline asio::error_code make_error_code(stream_errors e) -{ - return asio::error_code( - static_cast(e), get_stream_category()); -} - -} // namespace error -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/ssl/impl/error.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_SSL_ERROR_HPP diff --git a/scout_sdk/asio/asio/ssl/impl/context.hpp b/scout_sdk/asio/asio/ssl/impl/context.hpp deleted file mode 100644 index 40199c1..0000000 --- a/scout_sdk/asio/asio/ssl/impl/context.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// ssl/impl/context.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_IMPL_CONTEXT_HPP -#define ASIO_SSL_IMPL_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/throw_error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -template -void context::set_verify_callback(VerifyCallback callback) -{ - asio::error_code ec; - this->set_verify_callback(callback, ec); - asio::detail::throw_error(ec, "set_verify_callback"); -} - -template -ASIO_SYNC_OP_VOID context::set_verify_callback( - VerifyCallback callback, asio::error_code& ec) -{ - do_set_verify_callback( - new detail::verify_callback(callback), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -template -void context::set_password_callback(PasswordCallback callback) -{ - asio::error_code ec; - this->set_password_callback(callback, ec); - asio::detail::throw_error(ec, "set_password_callback"); -} - -template -ASIO_SYNC_OP_VOID context::set_password_callback( - PasswordCallback callback, asio::error_code& ec) -{ - do_set_password_callback( - new detail::password_callback(callback), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_IMPL_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/ssl/impl/context.ipp b/scout_sdk/asio/asio/ssl/impl/context.ipp deleted file mode 100644 index b756fd2..0000000 --- a/scout_sdk/asio/asio/ssl/impl/context.ipp +++ /dev/null @@ -1,1159 +0,0 @@ -// -// ssl/impl/context.ipp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_IMPL_CONTEXT_IPP -#define ASIO_SSL_IMPL_CONTEXT_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/ssl/context.hpp" -#include "asio/ssl/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -struct context::bio_cleanup -{ - BIO* p; - ~bio_cleanup() { if (p) ::BIO_free(p); } -}; - -struct context::x509_cleanup -{ - X509* p; - ~x509_cleanup() { if (p) ::X509_free(p); } -}; - -struct context::evp_pkey_cleanup -{ - EVP_PKEY* p; - ~evp_pkey_cleanup() { if (p) ::EVP_PKEY_free(p); } -}; - -struct context::rsa_cleanup -{ - RSA* p; - ~rsa_cleanup() { if (p) ::RSA_free(p); } -}; - -struct context::dh_cleanup -{ - DH* p; - ~dh_cleanup() { if (p) ::DH_free(p); } -}; - -context::context(context::method m) - : handle_(0) -{ - ::ERR_clear_error(); - - switch (m) - { - // SSL v2. -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2) - case context::sslv2: - case context::sslv2_client: - case context::sslv2_server: - asio::detail::throw_error( - asio::error::invalid_argument, "context"); - break; -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2) - case context::sslv2: - handle_ = ::SSL_CTX_new(::SSLv2_method()); - break; - case context::sslv2_client: - handle_ = ::SSL_CTX_new(::SSLv2_client_method()); - break; - case context::sslv2_server: - handle_ = ::SSL_CTX_new(::SSLv2_server_method()); - break; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) || defined(OPENSSL_NO_SSL2) - - // SSL v3. -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - case context::sslv3: - handle_ = ::SSL_CTX_new(::TLS_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, SSL3_VERSION); - SSL_CTX_set_max_proto_version(handle_, SSL3_VERSION); - } - break; - case context::sslv3_client: - handle_ = ::SSL_CTX_new(::TLS_client_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, SSL3_VERSION); - SSL_CTX_set_max_proto_version(handle_, SSL3_VERSION); - } - break; - case context::sslv3_server: - handle_ = ::SSL_CTX_new(::TLS_server_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, SSL3_VERSION); - SSL_CTX_set_max_proto_version(handle_, SSL3_VERSION); - } - break; -#elif defined(OPENSSL_NO_SSL3) - case context::sslv3: - case context::sslv3_client: - case context::sslv3_server: - asio::detail::throw_error( - asio::error::invalid_argument, "context"); - break; -#else // defined(OPENSSL_NO_SSL3) - case context::sslv3: - handle_ = ::SSL_CTX_new(::SSLv3_method()); - break; - case context::sslv3_client: - handle_ = ::SSL_CTX_new(::SSLv3_client_method()); - break; - case context::sslv3_server: - handle_ = ::SSL_CTX_new(::SSLv3_server_method()); - break; -#endif // defined(OPENSSL_NO_SSL3) - - // TLS v1.0. -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - case context::tlsv1: - handle_ = ::SSL_CTX_new(::TLS_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_VERSION); - } - break; - case context::tlsv1_client: - handle_ = ::SSL_CTX_new(::TLS_client_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_VERSION); - } - break; - case context::tlsv1_server: - handle_ = ::SSL_CTX_new(::TLS_server_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_VERSION); - } - break; -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - case context::tlsv1: - handle_ = ::SSL_CTX_new(::TLSv1_method()); - break; - case context::tlsv1_client: - handle_ = ::SSL_CTX_new(::TLSv1_client_method()); - break; - case context::tlsv1_server: - handle_ = ::SSL_CTX_new(::TLSv1_server_method()); - break; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - - // TLS v1.1. -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - case context::tlsv11: - handle_ = ::SSL_CTX_new(::TLS_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_1_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_1_VERSION); - } - break; - case context::tlsv11_client: - handle_ = ::SSL_CTX_new(::TLS_client_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_1_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_1_VERSION); - } - break; - case context::tlsv11_server: - handle_ = ::SSL_CTX_new(::TLS_server_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_1_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_1_VERSION); - } - break; -#elif defined(SSL_TXT_TLSV1_1) - case context::tlsv11: - handle_ = ::SSL_CTX_new(::TLSv1_1_method()); - break; - case context::tlsv11_client: - handle_ = ::SSL_CTX_new(::TLSv1_1_client_method()); - break; - case context::tlsv11_server: - handle_ = ::SSL_CTX_new(::TLSv1_1_server_method()); - break; -#else // defined(SSL_TXT_TLSV1_1) - case context::tlsv11: - case context::tlsv11_client: - case context::tlsv11_server: - asio::detail::throw_error( - asio::error::invalid_argument, "context"); - break; -#endif // defined(SSL_TXT_TLSV1_1) - - // TLS v1.2. -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - case context::tlsv12: - handle_ = ::SSL_CTX_new(::TLS_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_2_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_2_VERSION); - } - break; - case context::tlsv12_client: - handle_ = ::SSL_CTX_new(::TLS_client_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_2_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_2_VERSION); - } - break; - case context::tlsv12_server: - handle_ = ::SSL_CTX_new(::TLS_server_method()); - if (handle_) - { - SSL_CTX_set_min_proto_version(handle_, TLS1_2_VERSION); - SSL_CTX_set_max_proto_version(handle_, TLS1_2_VERSION); - } - break; -#elif defined(SSL_TXT_TLSV1_1) - case context::tlsv12: - handle_ = ::SSL_CTX_new(::TLSv1_2_method()); - break; - case context::tlsv12_client: - handle_ = ::SSL_CTX_new(::TLSv1_2_client_method()); - break; - case context::tlsv12_server: - handle_ = ::SSL_CTX_new(::TLSv1_2_server_method()); - break; -#else // defined(SSL_TXT_TLSV1_1) - case context::tlsv12: - case context::tlsv12_client: - case context::tlsv12_server: - asio::detail::throw_error( - asio::error::invalid_argument, "context"); - break; -#endif // defined(SSL_TXT_TLSV1_1) - - // Any supported SSL/TLS version. - case context::sslv23: - handle_ = ::SSL_CTX_new(::SSLv23_method()); - break; - case context::sslv23_client: - handle_ = ::SSL_CTX_new(::SSLv23_client_method()); - break; - case context::sslv23_server: - handle_ = ::SSL_CTX_new(::SSLv23_server_method()); - break; - - // Any supported TLS version. -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - case context::tls: - handle_ = ::SSL_CTX_new(::TLS_method()); - if (handle_) - SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); - break; - case context::tls_client: - handle_ = ::SSL_CTX_new(::TLS_client_method()); - if (handle_) - SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); - break; - case context::tls_server: - handle_ = ::SSL_CTX_new(::TLS_server_method()); - if (handle_) - SSL_CTX_set_min_proto_version(handle_, TLS1_VERSION); - break; -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - case context::tls: - handle_ = ::SSL_CTX_new(::SSLv23_method()); - if (handle_) - SSL_CTX_set_options(handle_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); - break; - case context::tls_client: - handle_ = ::SSL_CTX_new(::SSLv23_client_method()); - if (handle_) - SSL_CTX_set_options(handle_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); - break; - case context::tls_server: - handle_ = ::SSL_CTX_new(::SSLv23_server_method()); - if (handle_) - SSL_CTX_set_options(handle_, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3); - break; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - - default: - handle_ = ::SSL_CTX_new(0); - break; - } - - if (handle_ == 0) - { - asio::error_code ec( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - asio::detail::throw_error(ec, "context"); - } - - set_options(no_compression); -} - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) -context::context(context&& other) -{ - handle_ = other.handle_; - other.handle_ = 0; -} - -context& context::operator=(context&& other) -{ - context tmp(ASIO_MOVE_CAST(context)(*this)); - handle_ = other.handle_; - other.handle_ = 0; - return *this; -} -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - -context::~context() -{ - if (handle_) - { -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - void* cb_userdata = handle_->default_passwd_callback_userdata; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - if (cb_userdata) - { - detail::password_callback_base* callback = - static_cast( - cb_userdata); - delete callback; -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - ::SSL_CTX_set_default_passwd_cb_userdata(handle_, 0); -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - handle_->default_passwd_callback_userdata = 0; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - } - - if (SSL_CTX_get_app_data(handle_)) - { - detail::verify_callback_base* callback = - static_cast( - SSL_CTX_get_app_data(handle_)); - delete callback; - SSL_CTX_set_app_data(handle_, 0); - } - - ::SSL_CTX_free(handle_); - } -} - -context::native_handle_type context::native_handle() -{ - return handle_; -} - -void context::clear_options(context::options o) -{ - asio::error_code ec; - clear_options(o, ec); - asio::detail::throw_error(ec, "clear_options"); -} - -ASIO_SYNC_OP_VOID context::clear_options( - context::options o, asio::error_code& ec) -{ -#if (OPENSSL_VERSION_NUMBER >= 0x009080DFL) \ - && (OPENSSL_VERSION_NUMBER != 0x00909000L) -# if !defined(SSL_OP_NO_COMPRESSION) - if ((o & context::no_compression) != 0) - { -# if (OPENSSL_VERSION_NUMBER >= 0x00908000L) - handle_->comp_methods = SSL_COMP_get_compression_methods(); -# endif // (OPENSSL_VERSION_NUMBER >= 0x00908000L) - o ^= context::no_compression; - } -# endif // !defined(SSL_OP_NO_COMPRESSION) - - ::SSL_CTX_clear_options(handle_, o); - - ec = asio::error_code(); -#else // (OPENSSL_VERSION_NUMBER >= 0x009080DFL) - // && (OPENSSL_VERSION_NUMBER != 0x00909000L) - (void)o; - ec = asio::error::operation_not_supported; -#endif // (OPENSSL_VERSION_NUMBER >= 0x009080DFL) - // && (OPENSSL_VERSION_NUMBER != 0x00909000L) - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::set_options(context::options o) -{ - asio::error_code ec; - set_options(o, ec); - asio::detail::throw_error(ec, "set_options"); -} - -ASIO_SYNC_OP_VOID context::set_options( - context::options o, asio::error_code& ec) -{ -#if !defined(SSL_OP_NO_COMPRESSION) - if ((o & context::no_compression) != 0) - { -#if (OPENSSL_VERSION_NUMBER >= 0x00908000L) - handle_->comp_methods = - asio::ssl::detail::openssl_init<>::get_null_compression_methods(); -#endif // (OPENSSL_VERSION_NUMBER >= 0x00908000L) - o ^= context::no_compression; - } -#endif // !defined(SSL_OP_NO_COMPRESSION) - - ::SSL_CTX_set_options(handle_, o); - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::set_verify_mode(verify_mode v) -{ - asio::error_code ec; - set_verify_mode(v, ec); - asio::detail::throw_error(ec, "set_verify_mode"); -} - -ASIO_SYNC_OP_VOID context::set_verify_mode( - verify_mode v, asio::error_code& ec) -{ - ::SSL_CTX_set_verify(handle_, v, ::SSL_CTX_get_verify_callback(handle_)); - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::set_verify_depth(int depth) -{ - asio::error_code ec; - set_verify_depth(depth, ec); - asio::detail::throw_error(ec, "set_verify_depth"); -} - -ASIO_SYNC_OP_VOID context::set_verify_depth( - int depth, asio::error_code& ec) -{ - ::SSL_CTX_set_verify_depth(handle_, depth); - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::load_verify_file(const std::string& filename) -{ - asio::error_code ec; - load_verify_file(filename, ec); - asio::detail::throw_error(ec, "load_verify_file"); -} - -ASIO_SYNC_OP_VOID context::load_verify_file( - const std::string& filename, asio::error_code& ec) -{ - ::ERR_clear_error(); - - if (::SSL_CTX_load_verify_locations(handle_, filename.c_str(), 0) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::add_certificate_authority(const const_buffer& ca) -{ - asio::error_code ec; - add_certificate_authority(ca, ec); - asio::detail::throw_error(ec, "add_certificate_authority"); -} - -ASIO_SYNC_OP_VOID context::add_certificate_authority( - const const_buffer& ca, asio::error_code& ec) -{ - ::ERR_clear_error(); - - bio_cleanup bio = { make_buffer_bio(ca) }; - if (bio.p) - { - if (X509_STORE* store = ::SSL_CTX_get_cert_store(handle_)) - { - for (;;) - { - x509_cleanup cert = { ::PEM_read_bio_X509(bio.p, 0, 0, 0) }; - if (!cert.p) - break; - - if (::X509_STORE_add_cert(store, cert.p) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - } - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::set_default_verify_paths() -{ - asio::error_code ec; - set_default_verify_paths(ec); - asio::detail::throw_error(ec, "set_default_verify_paths"); -} - -ASIO_SYNC_OP_VOID context::set_default_verify_paths( - asio::error_code& ec) -{ - ::ERR_clear_error(); - - if (::SSL_CTX_set_default_verify_paths(handle_) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::add_verify_path(const std::string& path) -{ - asio::error_code ec; - add_verify_path(path, ec); - asio::detail::throw_error(ec, "add_verify_path"); -} - -ASIO_SYNC_OP_VOID context::add_verify_path( - const std::string& path, asio::error_code& ec) -{ - ::ERR_clear_error(); - - if (::SSL_CTX_load_verify_locations(handle_, 0, path.c_str()) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_certificate( - const const_buffer& certificate, file_format format) -{ - asio::error_code ec; - use_certificate(certificate, format, ec); - asio::detail::throw_error(ec, "use_certificate"); -} - -ASIO_SYNC_OP_VOID context::use_certificate( - const const_buffer& certificate, file_format format, - asio::error_code& ec) -{ - ::ERR_clear_error(); - - if (format == context_base::asn1) - { - if (::SSL_CTX_use_certificate_ASN1(handle_, - static_cast(certificate.size()), - static_cast(certificate.data())) == 1) - { - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - else if (format == context_base::pem) - { - bio_cleanup bio = { make_buffer_bio(certificate) }; - if (bio.p) - { - x509_cleanup cert = { ::PEM_read_bio_X509(bio.p, 0, 0, 0) }; - if (cert.p) - { - if (::SSL_CTX_use_certificate(handle_, cert.p) == 1) - { - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - } - } - else - { - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_certificate_file( - const std::string& filename, file_format format) -{ - asio::error_code ec; - use_certificate_file(filename, format, ec); - asio::detail::throw_error(ec, "use_certificate_file"); -} - -ASIO_SYNC_OP_VOID context::use_certificate_file( - const std::string& filename, file_format format, - asio::error_code& ec) -{ - int file_type; - switch (format) - { - case context_base::asn1: - file_type = SSL_FILETYPE_ASN1; - break; - case context_base::pem: - file_type = SSL_FILETYPE_PEM; - break; - default: - { - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - ::ERR_clear_error(); - - if (::SSL_CTX_use_certificate_file(handle_, filename.c_str(), file_type) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_certificate_chain(const const_buffer& chain) -{ - asio::error_code ec; - use_certificate_chain(chain, ec); - asio::detail::throw_error(ec, "use_certificate_chain"); -} - -ASIO_SYNC_OP_VOID context::use_certificate_chain( - const const_buffer& chain, asio::error_code& ec) -{ - ::ERR_clear_error(); - - bio_cleanup bio = { make_buffer_bio(chain) }; - if (bio.p) - { -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); - void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - pem_password_cb* callback = handle_->default_passwd_callback; - void* cb_userdata = handle_->default_passwd_callback_userdata; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - x509_cleanup cert = { - ::PEM_read_bio_X509_AUX(bio.p, 0, - callback, - cb_userdata) }; - if (!cert.p) - { - ec = asio::error_code(ERR_R_PEM_LIB, - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - int result = ::SSL_CTX_use_certificate(handle_, cert.p); - if (result == 0 || ::ERR_peek_error() != 0) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - -#if (OPENSSL_VERSION_NUMBER >= 0x10002000L) && !defined(LIBRESSL_VERSION_NUMBER) - ::SSL_CTX_clear_chain_certs(handle_); -#else - if (handle_->extra_certs) - { - ::sk_X509_pop_free(handle_->extra_certs, X509_free); - handle_->extra_certs = 0; - } -#endif // (OPENSSL_VERSION_NUMBER >= 0x10002000L) - - while (X509* cacert = ::PEM_read_bio_X509(bio.p, 0, - callback, - cb_userdata)) - { - if (!::SSL_CTX_add_extra_chain_cert(handle_, cacert)) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - result = ::ERR_peek_last_error(); - if ((ERR_GET_LIB(result) == ERR_LIB_PEM) - && (ERR_GET_REASON(result) == PEM_R_NO_START_LINE)) - { - ::ERR_clear_error(); - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_certificate_chain_file(const std::string& filename) -{ - asio::error_code ec; - use_certificate_chain_file(filename, ec); - asio::detail::throw_error(ec, "use_certificate_chain_file"); -} - -ASIO_SYNC_OP_VOID context::use_certificate_chain_file( - const std::string& filename, asio::error_code& ec) -{ - ::ERR_clear_error(); - - if (::SSL_CTX_use_certificate_chain_file(handle_, filename.c_str()) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_private_key( - const const_buffer& private_key, context::file_format format) -{ - asio::error_code ec; - use_private_key(private_key, format, ec); - asio::detail::throw_error(ec, "use_private_key"); -} - -ASIO_SYNC_OP_VOID context::use_private_key( - const const_buffer& private_key, context::file_format format, - asio::error_code& ec) -{ - ::ERR_clear_error(); - -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); - void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - pem_password_cb* callback = handle_->default_passwd_callback; - void* cb_userdata = handle_->default_passwd_callback_userdata; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - - bio_cleanup bio = { make_buffer_bio(private_key) }; - if (bio.p) - { - evp_pkey_cleanup evp_private_key = { 0 }; - switch (format) - { - case context_base::asn1: - evp_private_key.p = ::d2i_PrivateKey_bio(bio.p, 0); - break; - case context_base::pem: - evp_private_key.p = ::PEM_read_bio_PrivateKey( - bio.p, 0, callback, - cb_userdata); - break; - default: - { - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - if (evp_private_key.p) - { - if (::SSL_CTX_use_PrivateKey(handle_, evp_private_key.p) == 1) - { - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - } - - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_private_key_file( - const std::string& filename, context::file_format format) -{ - asio::error_code ec; - use_private_key_file(filename, format, ec); - asio::detail::throw_error(ec, "use_private_key_file"); -} - -void context::use_rsa_private_key( - const const_buffer& private_key, context::file_format format) -{ - asio::error_code ec; - use_rsa_private_key(private_key, format, ec); - asio::detail::throw_error(ec, "use_rsa_private_key"); -} - -ASIO_SYNC_OP_VOID context::use_rsa_private_key( - const const_buffer& private_key, context::file_format format, - asio::error_code& ec) -{ - ::ERR_clear_error(); - -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - pem_password_cb* callback = ::SSL_CTX_get_default_passwd_cb(handle_); - void* cb_userdata = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - pem_password_cb* callback = handle_->default_passwd_callback; - void* cb_userdata = handle_->default_passwd_callback_userdata; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - - bio_cleanup bio = { make_buffer_bio(private_key) }; - if (bio.p) - { - rsa_cleanup rsa_private_key = { 0 }; - switch (format) - { - case context_base::asn1: - rsa_private_key.p = ::d2i_RSAPrivateKey_bio(bio.p, 0); - break; - case context_base::pem: - rsa_private_key.p = ::PEM_read_bio_RSAPrivateKey( - bio.p, 0, callback, - cb_userdata); - break; - default: - { - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - if (rsa_private_key.p) - { - if (::SSL_CTX_use_RSAPrivateKey(handle_, rsa_private_key.p) == 1) - { - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - } - - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID context::use_private_key_file( - const std::string& filename, context::file_format format, - asio::error_code& ec) -{ - int file_type; - switch (format) - { - case context_base::asn1: - file_type = SSL_FILETYPE_ASN1; - break; - case context_base::pem: - file_type = SSL_FILETYPE_PEM; - break; - default: - { - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - ::ERR_clear_error(); - - if (::SSL_CTX_use_PrivateKey_file(handle_, filename.c_str(), file_type) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_rsa_private_key_file( - const std::string& filename, context::file_format format) -{ - asio::error_code ec; - use_rsa_private_key_file(filename, format, ec); - asio::detail::throw_error(ec, "use_rsa_private_key_file"); -} - -ASIO_SYNC_OP_VOID context::use_rsa_private_key_file( - const std::string& filename, context::file_format format, - asio::error_code& ec) -{ - int file_type; - switch (format) - { - case context_base::asn1: - file_type = SSL_FILETYPE_ASN1; - break; - case context_base::pem: - file_type = SSL_FILETYPE_PEM; - break; - default: - { - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - ::ERR_clear_error(); - - if (::SSL_CTX_use_RSAPrivateKey_file( - handle_, filename.c_str(), file_type) != 1) - { - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_tmp_dh(const const_buffer& dh) -{ - asio::error_code ec; - use_tmp_dh(dh, ec); - asio::detail::throw_error(ec, "use_tmp_dh"); -} - -ASIO_SYNC_OP_VOID context::use_tmp_dh( - const const_buffer& dh, asio::error_code& ec) -{ - ::ERR_clear_error(); - - bio_cleanup bio = { make_buffer_bio(dh) }; - if (bio.p) - { - return do_use_tmp_dh(bio.p, ec); - } - - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -void context::use_tmp_dh_file(const std::string& filename) -{ - asio::error_code ec; - use_tmp_dh_file(filename, ec); - asio::detail::throw_error(ec, "use_tmp_dh_file"); -} - -ASIO_SYNC_OP_VOID context::use_tmp_dh_file( - const std::string& filename, asio::error_code& ec) -{ - ::ERR_clear_error(); - - bio_cleanup bio = { ::BIO_new_file(filename.c_str(), "r") }; - if (bio.p) - { - return do_use_tmp_dh(bio.p, ec); - } - - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID context::do_use_tmp_dh( - BIO* bio, asio::error_code& ec) -{ - ::ERR_clear_error(); - - dh_cleanup dh = { ::PEM_read_bio_DHparams(bio, 0, 0, 0) }; - if (dh.p) - { - if (::SSL_CTX_set_tmp_dh(handle_, dh.p) == 1) - { - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - } - - ec = asio::error_code( - static_cast(::ERR_get_error()), - asio::error::get_ssl_category()); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -ASIO_SYNC_OP_VOID context::do_set_verify_callback( - detail::verify_callback_base* callback, asio::error_code& ec) -{ - if (SSL_CTX_get_app_data(handle_)) - { - delete static_cast( - SSL_CTX_get_app_data(handle_)); - } - - SSL_CTX_set_app_data(handle_, callback); - - ::SSL_CTX_set_verify(handle_, - ::SSL_CTX_get_verify_mode(handle_), - &context::verify_callback_function); - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -int context::verify_callback_function(int preverified, X509_STORE_CTX* ctx) -{ - if (ctx) - { - if (SSL* ssl = static_cast( - ::X509_STORE_CTX_get_ex_data( - ctx, ::SSL_get_ex_data_X509_STORE_CTX_idx()))) - { - if (SSL_CTX* handle = ::SSL_get_SSL_CTX(ssl)) - { - if (SSL_CTX_get_app_data(handle)) - { - detail::verify_callback_base* callback = - static_cast( - SSL_CTX_get_app_data(handle)); - - verify_context verify_ctx(ctx); - return callback->call(preverified != 0, verify_ctx) ? 1 : 0; - } - } - } - } - - return 0; -} - -ASIO_SYNC_OP_VOID context::do_set_password_callback( - detail::password_callback_base* callback, asio::error_code& ec) -{ -#if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER) - void* old_callback = ::SSL_CTX_get_default_passwd_cb_userdata(handle_); - ::SSL_CTX_set_default_passwd_cb_userdata(handle_, callback); -#else // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - void* old_callback = handle_->default_passwd_callback_userdata; - handle_->default_passwd_callback_userdata = callback; -#endif // (OPENSSL_VERSION_NUMBER >= 0x10100000L) - - if (old_callback) - delete static_cast( - old_callback); - - SSL_CTX_set_default_passwd_cb(handle_, &context::password_callback_function); - - ec = asio::error_code(); - ASIO_SYNC_OP_VOID_RETURN(ec); -} - -int context::password_callback_function( - char* buf, int size, int purpose, void* data) -{ - using namespace std; // For strncat and strlen. - - if (data) - { - detail::password_callback_base* callback = - static_cast(data); - - std::string passwd = callback->call(static_cast(size), - purpose ? context_base::for_writing : context_base::for_reading); - -#if defined(ASIO_HAS_SECURE_RTL) - strcpy_s(buf, size, passwd.c_str()); -#else // defined(ASIO_HAS_SECURE_RTL) - *buf = '\0'; - if (size > 0) - strncat(buf, passwd.c_str(), size - 1); -#endif // defined(ASIO_HAS_SECURE_RTL) - - return static_cast(strlen(buf)); - } - - return 0; -} - -BIO* context::make_buffer_bio(const const_buffer& b) -{ - return ::BIO_new_mem_buf( - const_cast(b.data()), - static_cast(b.size())); -} - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_IMPL_CONTEXT_IPP diff --git a/scout_sdk/asio/asio/ssl/impl/error.ipp b/scout_sdk/asio/asio/ssl/impl/error.ipp deleted file mode 100644 index 98e8c91..0000000 --- a/scout_sdk/asio/asio/ssl/impl/error.ipp +++ /dev/null @@ -1,100 +0,0 @@ -// -// ssl/impl/error.ipp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_IMPL_ERROR_IPP -#define ASIO_SSL_IMPL_ERROR_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ssl/error.hpp" -#include "asio/ssl/detail/openssl_init.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace error { -namespace detail { - -class ssl_category : public asio::error_category -{ -public: - const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT - { - return "asio.ssl"; - } - - std::string message(int value) const - { - const char* s = ::ERR_reason_error_string(value); - return s ? s : "asio.ssl error"; - } -}; - -} // namespace detail - -const asio::error_category& get_ssl_category() -{ - static detail::ssl_category instance; - return instance; -} - -} // namespace error -namespace ssl { -namespace error { - -#if (OPENSSL_VERSION_NUMBER < 0x10100000L) && !defined(OPENSSL_IS_BORINGSSL) - -const asio::error_category& get_stream_category() -{ - return asio::error::get_ssl_category(); -} - -#else - -namespace detail { - -class stream_category : public asio::error_category -{ -public: - const char* name() const ASIO_ERROR_CATEGORY_NOEXCEPT - { - return "asio.ssl.stream"; - } - - std::string message(int value) const - { - switch (value) - { - case stream_truncated: return "stream truncated"; - default: return "asio.ssl.stream error"; - } - } -}; - -} // namespace detail - -const asio::error_category& get_stream_category() -{ - static detail::stream_category instance; - return instance; -} - -#endif - -} // namespace error -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_IMPL_ERROR_IPP diff --git a/scout_sdk/asio/asio/ssl/impl/rfc2818_verification.ipp b/scout_sdk/asio/asio/ssl/impl/rfc2818_verification.ipp deleted file mode 100644 index 577e4a1..0000000 --- a/scout_sdk/asio/asio/ssl/impl/rfc2818_verification.ipp +++ /dev/null @@ -1,160 +0,0 @@ -// -// ssl/impl/rfc2818_verification.ipp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_IMPL_RFC2818_VERIFICATION_IPP -#define ASIO_SSL_IMPL_RFC2818_VERIFICATION_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include -#include "asio/ip/address.hpp" -#include "asio/ssl/rfc2818_verification.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -bool rfc2818_verification::operator()( - bool preverified, verify_context& ctx) const -{ - using namespace std; // For memcmp. - - // Don't bother looking at certificates that have failed pre-verification. - if (!preverified) - return false; - - // We're only interested in checking the certificate at the end of the chain. - int depth = X509_STORE_CTX_get_error_depth(ctx.native_handle()); - if (depth > 0) - return true; - - // Try converting the host name to an address. If it is an address then we - // need to look for an IP address in the certificate rather than a host name. - asio::error_code ec; - ip::address address = ip::make_address(host_, ec); - bool is_address = !ec; - - X509* cert = X509_STORE_CTX_get_current_cert(ctx.native_handle()); - - // Go through the alternate names in the certificate looking for matching DNS - // or IP address entries. - GENERAL_NAMES* gens = static_cast( - X509_get_ext_d2i(cert, NID_subject_alt_name, 0, 0)); - for (int i = 0; i < sk_GENERAL_NAME_num(gens); ++i) - { - GENERAL_NAME* gen = sk_GENERAL_NAME_value(gens, i); - if (gen->type == GEN_DNS && !is_address) - { - ASN1_IA5STRING* domain = gen->d.dNSName; - if (domain->type == V_ASN1_IA5STRING && domain->data && domain->length) - { - const char* pattern = reinterpret_cast(domain->data); - std::size_t pattern_length = domain->length; - if (match_pattern(pattern, pattern_length, host_.c_str())) - { - GENERAL_NAMES_free(gens); - return true; - } - } - } - else if (gen->type == GEN_IPADD && is_address) - { - ASN1_OCTET_STRING* ip_address = gen->d.iPAddress; - if (ip_address->type == V_ASN1_OCTET_STRING && ip_address->data) - { - if (address.is_v4() && ip_address->length == 4) - { - ip::address_v4::bytes_type bytes = address.to_v4().to_bytes(); - if (memcmp(bytes.data(), ip_address->data, 4) == 0) - { - GENERAL_NAMES_free(gens); - return true; - } - } - else if (address.is_v6() && ip_address->length == 16) - { - ip::address_v6::bytes_type bytes = address.to_v6().to_bytes(); - if (memcmp(bytes.data(), ip_address->data, 16) == 0) - { - GENERAL_NAMES_free(gens); - return true; - } - } - } - } - } - GENERAL_NAMES_free(gens); - - // No match in the alternate names, so try the common names. We should only - // use the "most specific" common name, which is the last one in the list. - X509_NAME* name = X509_get_subject_name(cert); - int i = -1; - ASN1_STRING* common_name = 0; - while ((i = X509_NAME_get_index_by_NID(name, NID_commonName, i)) >= 0) - { - X509_NAME_ENTRY* name_entry = X509_NAME_get_entry(name, i); - common_name = X509_NAME_ENTRY_get_data(name_entry); - } - if (common_name && common_name->data && common_name->length) - { - const char* pattern = reinterpret_cast(common_name->data); - std::size_t pattern_length = common_name->length; - if (match_pattern(pattern, pattern_length, host_.c_str())) - return true; - } - - return false; -} - -bool rfc2818_verification::match_pattern(const char* pattern, - std::size_t pattern_length, const char* host) -{ - using namespace std; // For tolower. - - const char* p = pattern; - const char* p_end = p + pattern_length; - const char* h = host; - - while (p != p_end && *h) - { - if (*p == '*') - { - ++p; - while (*h && *h != '.') - if (match_pattern(p, p_end - p, h++)) - return true; - } - else if (tolower(*p) == tolower(*h)) - { - ++p; - ++h; - } - else - { - return false; - } - } - - return p == p_end && !*h; -} - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_IMPL_RFC2818_VERIFICATION_IPP diff --git a/scout_sdk/asio/asio/ssl/impl/src.hpp b/scout_sdk/asio/asio/ssl/impl/src.hpp deleted file mode 100644 index 9a1b038..0000000 --- a/scout_sdk/asio/asio/ssl/impl/src.hpp +++ /dev/null @@ -1,28 +0,0 @@ -// -// impl/ssl/src.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_IMPL_SRC_HPP -#define ASIO_SSL_IMPL_SRC_HPP - -#define ASIO_SOURCE - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HEADER_ONLY) -# error Do not compile Asio library source with ASIO_HEADER_ONLY defined -#endif - -#include "asio/ssl/impl/context.ipp" -#include "asio/ssl/impl/error.ipp" -#include "asio/ssl/detail/impl/engine.ipp" -#include "asio/ssl/detail/impl/openssl_init.ipp" -#include "asio/ssl/impl/rfc2818_verification.ipp" - -#endif // ASIO_SSL_IMPL_SRC_HPP diff --git a/scout_sdk/asio/asio/ssl/rfc2818_verification.hpp b/scout_sdk/asio/asio/ssl/rfc2818_verification.hpp deleted file mode 100644 index 3589f53..0000000 --- a/scout_sdk/asio/asio/ssl/rfc2818_verification.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// ssl/rfc2818_verification.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_RFC2818_VERIFICATION_HPP -#define ASIO_SSL_RFC2818_VERIFICATION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include -#include "asio/ssl/detail/openssl_types.hpp" -#include "asio/ssl/verify_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -/// Verifies a certificate against a hostname according to the rules described -/// in RFC 2818. -/** - * @par Example - * The following example shows how to synchronously open a secure connection to - * a given host name: - * @code - * using asio::ip::tcp; - * namespace ssl = asio::ssl; - * typedef ssl::stream ssl_socket; - * - * // Create a context that uses the default paths for finding CA certificates. - * ssl::context ctx(ssl::context::sslv23); - * ctx.set_default_verify_paths(); - * - * // Open a socket and connect it to the remote host. - * asio::io_context io_context; - * ssl_socket sock(io_context, ctx); - * tcp::resolver resolver(io_context); - * tcp::resolver::query query("host.name", "https"); - * asio::connect(sock.lowest_layer(), resolver.resolve(query)); - * sock.lowest_layer().set_option(tcp::no_delay(true)); - * - * // Perform SSL handshake and verify the remote host's certificate. - * sock.set_verify_mode(ssl::verify_peer); - * sock.set_verify_callback(ssl::rfc2818_verification("host.name")); - * sock.handshake(ssl_socket::client); - * - * // ... read and write as normal ... - * @endcode - */ -class rfc2818_verification -{ -public: - /// The type of the function object's result. - typedef bool result_type; - - /// Constructor. - explicit rfc2818_verification(const std::string& host) - : host_(host) - { - } - - /// Perform certificate verification. - ASIO_DECL bool operator()(bool preverified, verify_context& ctx) const; - -private: - // Helper function to check a host name against a pattern. - ASIO_DECL static bool match_pattern(const char* pattern, - std::size_t pattern_length, const char* host); - - // Helper function to check a host name against an IPv4 address - // The host name to be checked. - std::string host_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#if defined(ASIO_HEADER_ONLY) -# include "asio/ssl/impl/rfc2818_verification.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_SSL_RFC2818_VERIFICATION_HPP diff --git a/scout_sdk/asio/asio/ssl/stream.hpp b/scout_sdk/asio/asio/ssl/stream.hpp deleted file mode 100644 index 2b221ed..0000000 --- a/scout_sdk/asio/asio/ssl/stream.hpp +++ /dev/null @@ -1,761 +0,0 @@ -// -// ssl/stream.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_STREAM_HPP -#define ASIO_SSL_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/async_result.hpp" -#include "asio/detail/buffer_sequence_adapter.hpp" -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/ssl/context.hpp" -#include "asio/ssl/detail/buffered_handshake_op.hpp" -#include "asio/ssl/detail/handshake_op.hpp" -#include "asio/ssl/detail/io.hpp" -#include "asio/ssl/detail/read_op.hpp" -#include "asio/ssl/detail/shutdown_op.hpp" -#include "asio/ssl/detail/stream_core.hpp" -#include "asio/ssl/detail/write_op.hpp" -#include "asio/ssl/stream_base.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -/// Provides stream-oriented functionality using SSL. -/** - * The stream class template provides asynchronous and blocking stream-oriented - * functionality using SSL. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. The application must also ensure that all - * asynchronous operations are performed within the same implicit or explicit - * strand. - * - * @par Example - * To use the SSL stream template with an ip::tcp::socket, you would write: - * @code - * asio::io_context io_context; - * asio::ssl::context ctx(asio::ssl::context::sslv23); - * asio::ssl::stream sock(io_context, ctx); - * @endcode - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -template -class stream : - public stream_base, - private noncopyable -{ -public: - /// The native handle type of the SSL stream. - typedef SSL* native_handle_type; - - /// Structure for use with deprecated impl_type. - struct impl_struct - { - SSL* ssl; - }; - - /// The type of the next layer. - typedef typename remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type of the executor associated with the object. - typedef typename lowest_layer_type::executor_type executor_type; - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Construct a stream. - /** - * This constructor creates a stream and initialises the underlying stream - * object. - * - * @param arg The argument to be passed to initialise the underlying stream. - * - * @param ctx The SSL context to be used for the stream. - */ - template - stream(Arg&& arg, context& ctx) - : next_layer_(ASIO_MOVE_CAST(Arg)(arg)), - core_(ctx.native_handle(), - next_layer_.lowest_layer().get_executor().context()) - { - } -#else // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - template - stream(Arg& arg, context& ctx) - : next_layer_(arg), - core_(ctx.native_handle(), - next_layer_.lowest_layer().get_executor().context()) - { - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destructor. - /** - * @note A @c stream object must not be destroyed while there are pending - * asynchronous operations associated with it. - */ - ~stream() - { - } - - /// Get the executor associated with the object. - /** - * This function may be used to obtain the executor object that the stream - * uses to dispatch handlers for asynchronous operations. - * - * @return A copy of the executor that stream will use to dispatch handlers. - */ - executor_type get_executor() ASIO_NOEXCEPT - { - return next_layer_.lowest_layer().get_executor(); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_context() - { - return next_layer_.lowest_layer().get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - asio::io_context& get_io_service() - { - return next_layer_.lowest_layer().get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the underlying implementation in the native type. - /** - * This function may be used to obtain the underlying implementation of the - * context. This is intended to allow access to context functionality that is - * not otherwise provided. - * - * @par Example - * The native_handle() function returns a pointer of type @c SSL* that is - * suitable for passing to functions such as @c SSL_get_verify_result and - * @c SSL_get_peer_certificate: - * @code - * asio::ssl::stream sock(io_context, ctx); - * - * // ... establish connection and perform handshake ... - * - * if (X509* cert = SSL_get_peer_certificate(sock.native_handle())) - * { - * if (SSL_get_verify_result(sock.native_handle()) == X509_V_OK) - * { - * // ... - * } - * } - * @endcode - */ - native_handle_type native_handle() - { - return core_.engine_.native_handle(); - } - - /// Get a reference to the next layer. - /** - * This function returns a reference to the next layer in a stack of stream - * layers. - * - * @return A reference to the next layer in the stack of stream layers. - * Ownership is not transferred to the caller. - */ - const next_layer_type& next_layer() const - { - return next_layer_; - } - - /// Get a reference to the next layer. - /** - * This function returns a reference to the next layer in a stack of stream - * layers. - * - * @return A reference to the next layer in the stack of stream layers. - * Ownership is not transferred to the caller. - */ - next_layer_type& next_layer() - { - return next_layer_; - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * stream layers. - * - * @return A reference to the lowest layer in the stack of stream layers. - * Ownership is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return next_layer_.lowest_layer(); - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * stream layers. - * - * @return A reference to the lowest layer in the stack of stream layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return next_layer_.lowest_layer(); - } - - /// Set the peer verification mode. - /** - * This function may be used to configure the peer verification mode used by - * the stream. The new mode will override the mode inherited from the context. - * - * @param v A bitmask of peer verification modes. See @ref verify_mode for - * available values. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_set_verify. - */ - void set_verify_mode(verify_mode v) - { - asio::error_code ec; - set_verify_mode(v, ec); - asio::detail::throw_error(ec, "set_verify_mode"); - } - - /// Set the peer verification mode. - /** - * This function may be used to configure the peer verification mode used by - * the stream. The new mode will override the mode inherited from the context. - * - * @param v A bitmask of peer verification modes. See @ref verify_mode for - * available values. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_set_verify. - */ - ASIO_SYNC_OP_VOID set_verify_mode( - verify_mode v, asio::error_code& ec) - { - core_.engine_.set_verify_mode(v, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Set the peer verification depth. - /** - * This function may be used to configure the maximum verification depth - * allowed by the stream. - * - * @param depth Maximum depth for the certificate chain verification that - * shall be allowed. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_set_verify_depth. - */ - void set_verify_depth(int depth) - { - asio::error_code ec; - set_verify_depth(depth, ec); - asio::detail::throw_error(ec, "set_verify_depth"); - } - - /// Set the peer verification depth. - /** - * This function may be used to configure the maximum verification depth - * allowed by the stream. - * - * @param depth Maximum depth for the certificate chain verification that - * shall be allowed. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_set_verify_depth. - */ - ASIO_SYNC_OP_VOID set_verify_depth( - int depth, asio::error_code& ec) - { - core_.engine_.set_verify_depth(depth, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Set the callback used to verify peer certificates. - /** - * This function is used to specify a callback function that will be called - * by the implementation when it needs to verify a peer certificate. - * - * @param callback The function object to be used for verifying a certificate. - * The function signature of the handler must be: - * @code bool verify_callback( - * bool preverified, // True if the certificate passed pre-verification. - * verify_context& ctx // The peer certificate and other context. - * ); @endcode - * The return value of the callback is true if the certificate has passed - * verification, false otherwise. - * - * @throws asio::system_error Thrown on failure. - * - * @note Calls @c SSL_set_verify. - */ - template - void set_verify_callback(VerifyCallback callback) - { - asio::error_code ec; - this->set_verify_callback(callback, ec); - asio::detail::throw_error(ec, "set_verify_callback"); - } - - /// Set the callback used to verify peer certificates. - /** - * This function is used to specify a callback function that will be called - * by the implementation when it needs to verify a peer certificate. - * - * @param callback The function object to be used for verifying a certificate. - * The function signature of the handler must be: - * @code bool verify_callback( - * bool preverified, // True if the certificate passed pre-verification. - * verify_context& ctx // The peer certificate and other context. - * ); @endcode - * The return value of the callback is true if the certificate has passed - * verification, false otherwise. - * - * @param ec Set to indicate what error occurred, if any. - * - * @note Calls @c SSL_set_verify. - */ - template - ASIO_SYNC_OP_VOID set_verify_callback(VerifyCallback callback, - asio::error_code& ec) - { - core_.engine_.set_verify_callback( - new detail::verify_callback(callback), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform SSL handshaking. - /** - * This function is used to perform SSL handshaking on the stream. The - * function call will block until handshaking is complete or an error occurs. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @throws asio::system_error Thrown on failure. - */ - void handshake(handshake_type type) - { - asio::error_code ec; - handshake(type, ec); - asio::detail::throw_error(ec, "handshake"); - } - - /// Perform SSL handshaking. - /** - * This function is used to perform SSL handshaking on the stream. The - * function call will block until handshaking is complete or an error occurs. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID handshake(handshake_type type, - asio::error_code& ec) - { - detail::io(next_layer_, core_, detail::handshake_op(type), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform SSL handshaking. - /** - * This function is used to perform SSL handshaking on the stream. The - * function call will block until handshaking is complete or an error occurs. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @param buffers The buffered data to be reused for the handshake. - * - * @throws asio::system_error Thrown on failure. - */ - template - void handshake(handshake_type type, const ConstBufferSequence& buffers) - { - asio::error_code ec; - handshake(type, buffers, ec); - asio::detail::throw_error(ec, "handshake"); - } - - /// Perform SSL handshaking. - /** - * This function is used to perform SSL handshaking on the stream. The - * function call will block until handshaking is complete or an error occurs. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @param buffers The buffered data to be reused for the handshake. - * - * @param ec Set to indicate what error occurred, if any. - */ - template - ASIO_SYNC_OP_VOID handshake(handshake_type type, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - detail::io(next_layer_, core_, - detail::buffered_handshake_op(type, buffers), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous SSL handshake. - /** - * This function is used to asynchronously perform an SSL handshake on the - * stream. This function call always returns immediately. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @param handler The handler to be called when the handshake operation - * completes. Copies will be made of the handler as required. The equivalent - * function signature of the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(HandshakeHandler, - void (asio::error_code)) - async_handshake(handshake_type type, - ASIO_MOVE_ARG(HandshakeHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a HandshakeHandler. - ASIO_HANDSHAKE_HANDLER_CHECK(HandshakeHandler, handler) type_check; - - asio::async_completion init(handler); - - detail::async_io(next_layer_, core_, - detail::handshake_op(type), init.completion_handler); - - return init.result.get(); - } - - /// Start an asynchronous SSL handshake. - /** - * This function is used to asynchronously perform an SSL handshake on the - * stream. This function call always returns immediately. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @param buffers The buffered data to be reused for the handshake. Although - * the buffers object may be copied as necessary, ownership of the underlying - * buffers is retained by the caller, which must guarantee that they remain - * valid until the handler is called. - * - * @param handler The handler to be called when the handshake operation - * completes. Copies will be made of the handler as required. The equivalent - * function signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Amount of buffers used in handshake. - * ); @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(BufferedHandshakeHandler, - void (asio::error_code, std::size_t)) - async_handshake(handshake_type type, const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(BufferedHandshakeHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a BufferedHandshakeHandler. - ASIO_BUFFERED_HANDSHAKE_HANDLER_CHECK( - BufferedHandshakeHandler, handler) type_check; - - asio::async_completion init(handler); - - detail::async_io(next_layer_, core_, - detail::buffered_handshake_op(type, buffers), - init.completion_handler); - - return init.result.get(); - } - - /// Shut down SSL on the stream. - /** - * This function is used to shut down SSL on the stream. The function call - * will block until SSL has been shut down or an error occurs. - * - * @throws asio::system_error Thrown on failure. - */ - void shutdown() - { - asio::error_code ec; - shutdown(ec); - asio::detail::throw_error(ec, "shutdown"); - } - - /// Shut down SSL on the stream. - /** - * This function is used to shut down SSL on the stream. The function call - * will block until SSL has been shut down or an error occurs. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID shutdown(asio::error_code& ec) - { - detail::io(next_layer_, core_, detail::shutdown_op(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously shut down SSL on the stream. - /** - * This function is used to asynchronously shut down SSL on the stream. This - * function call always returns immediately. - * - * @param handler The handler to be called when the handshake operation - * completes. Copies will be made of the handler as required. The equivalent - * function signature of the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - */ - template - ASIO_INITFN_RESULT_TYPE(ShutdownHandler, - void (asio::error_code)) - async_shutdown(ASIO_MOVE_ARG(ShutdownHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ShutdownHandler. - ASIO_SHUTDOWN_HANDLER_CHECK(ShutdownHandler, handler) type_check; - - asio::async_completion init(handler); - - detail::async_io(next_layer_, core_, detail::shutdown_op(), - init.completion_handler); - - return init.result.get(); - } - - /// Write some data to the stream. - /** - * This function is used to write data on the stream. The function call will - * block until one or more bytes of data has been written successfully, or - * until an error occurs. - * - * @param buffers The data to be written. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that all - * data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t n = write_some(buffers, ec); - asio::detail::throw_error(ec, "write_some"); - return n; - } - - /// Write some data to the stream. - /** - * This function is used to write data on the stream. The function call will - * block until one or more bytes of data has been written successfully, or - * until an error occurs. - * - * @param buffers The data to be written to the stream. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that all - * data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return detail::io(next_layer_, core_, - detail::write_op(buffers), ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write one or more bytes of data to - * the stream. The function call always returns immediately. - * - * @param buffers The data to be written to the stream. Although the buffers - * object may be copied as necessary, ownership of the underlying buffers is - * retained by the caller, which must guarantee that they remain valid until - * the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The equivalent function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * - * @note The async_write_some operation may not transmit all of the data to - * the peer. Consider using the @ref async_write function if you need to - * ensure that all data is written before the blocking operation completes. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - asio::async_completion init(handler); - - detail::async_io(next_layer_, core_, - detail::write_op(buffers), - init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the stream. - /** - * This function is used to read data from the stream. The function call will - * block until one or more bytes of data has been read successfully, or until - * an error occurs. - * - * @param buffers The buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t n = read_some(buffers, ec); - asio::detail::throw_error(ec, "read_some"); - return n; - } - - /// Read some data from the stream. - /** - * This function is used to read data from the stream. The function call will - * block until one or more bytes of data has been read successfully, or until - * an error occurs. - * - * @param buffers The buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return detail::io(next_layer_, core_, - detail::read_op(buffers), ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read one or more bytes of data from - * the stream. The function call always returns immediately. - * - * @param buffers The buffers into which the data will be read. Although the - * buffers object may be copied as necessary, ownership of the underlying - * buffers is retained by the caller, which must guarantee that they remain - * valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The equivalent function - * signature of the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * - * @note The async_read_some operation may not read all of the requested - * number of bytes. Consider using the @ref async_read function if you need to - * ensure that the requested amount of data is read before the asynchronous - * operation completes. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - asio::async_completion init(handler); - - detail::async_io(next_layer_, core_, - detail::read_op(buffers), - init.completion_handler); - - return init.result.get(); - } - -private: - Stream next_layer_; - detail::stream_core core_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_STREAM_HPP diff --git a/scout_sdk/asio/asio/ssl/stream_base.hpp b/scout_sdk/asio/asio/ssl/stream_base.hpp deleted file mode 100644 index 56873e4..0000000 --- a/scout_sdk/asio/asio/ssl/stream_base.hpp +++ /dev/null @@ -1,52 +0,0 @@ -// -// ssl/stream_base.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_STREAM_BASE_HPP -#define ASIO_SSL_STREAM_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -/// The stream_base class is used as a base for the asio::ssl::stream -/// class template so that we have a common place to define various enums. -class stream_base -{ -public: - /// Different handshake types. - enum handshake_type - { - /// Perform handshaking as a client. - client, - - /// Perform handshaking as a server. - server - }; - -protected: - /// Protected destructor to prevent deletion through this type. - ~stream_base() - { - } -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_STREAM_BASE_HPP diff --git a/scout_sdk/asio/asio/ssl/verify_context.hpp b/scout_sdk/asio/asio/ssl/verify_context.hpp deleted file mode 100644 index e172697..0000000 --- a/scout_sdk/asio/asio/ssl/verify_context.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// ssl/verify_context.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_VERIFY_CONTEXT_HPP -#define ASIO_SSL_VERIFY_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/noncopyable.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -/// A simple wrapper around the X509_STORE_CTX type, used during verification of -/// a peer certificate. -/** - * @note The verify_context does not own the underlying X509_STORE_CTX object. - */ -class verify_context - : private noncopyable -{ -public: - /// The native handle type of the verification context. - typedef X509_STORE_CTX* native_handle_type; - - /// Constructor. - explicit verify_context(native_handle_type handle) - : handle_(handle) - { - } - - /// Get the underlying implementation in the native type. - /** - * This function may be used to obtain the underlying implementation of the - * context. This is intended to allow access to context functionality that is - * not otherwise provided. - */ - native_handle_type native_handle() - { - return handle_; - } - -private: - // The underlying native implementation. - native_handle_type handle_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_VERIFY_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/ssl/verify_mode.hpp b/scout_sdk/asio/asio/ssl/verify_mode.hpp deleted file mode 100644 index 8c4b394..0000000 --- a/scout_sdk/asio/asio/ssl/verify_mode.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// -// ssl/verify_mode.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_VERIFY_MODE_HPP -#define ASIO_SSL_VERIFY_MODE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace ssl { - -/// Bitmask type for peer verification. -/** - * Possible values are: - * - * @li @ref verify_none - * @li @ref verify_peer - * @li @ref verify_fail_if_no_peer_cert - * @li @ref verify_client_once - */ -typedef int verify_mode; - -#if defined(GENERATING_DOCUMENTATION) -/// No verification. -const int verify_none = implementation_defined; - -/// Verify the peer. -const int verify_peer = implementation_defined; - -/// Fail verification if the peer has no certificate. Ignored unless -/// @ref verify_peer is set. -const int verify_fail_if_no_peer_cert = implementation_defined; - -/// Do not request client certificate on renegotiation. Ignored unless -/// @ref verify_peer is set. -const int verify_client_once = implementation_defined; -#else -const int verify_none = SSL_VERIFY_NONE; -const int verify_peer = SSL_VERIFY_PEER; -const int verify_fail_if_no_peer_cert = SSL_VERIFY_FAIL_IF_NO_PEER_CERT; -const int verify_client_once = SSL_VERIFY_CLIENT_ONCE; -#endif - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_VERIFY_MODE_HPP diff --git a/scout_sdk/asio/asio/steady_timer.hpp b/scout_sdk/asio/asio/steady_timer.hpp deleted file mode 100644 index 3ede208..0000000 --- a/scout_sdk/asio/asio/steady_timer.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// -// steady_timer.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_STEADY_TIMER_HPP -#define ASIO_STEADY_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_waitable_timer.hpp" -#include "asio/detail/chrono.hpp" - -namespace asio { - -/// Typedef for a timer based on the steady clock. -/** - * This typedef uses the C++11 @c <chrono> standard library facility, if - * available. Otherwise, it may use the Boost.Chrono library. To explicitly - * utilise Boost.Chrono, use the basic_waitable_timer template directly: - * @code - * typedef basic_waitable_timer timer; - * @endcode - */ -typedef basic_waitable_timer steady_timer; - -} // namespace asio - -#endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_STEADY_TIMER_HPP diff --git a/scout_sdk/asio/asio/strand.hpp b/scout_sdk/asio/asio/strand.hpp deleted file mode 100644 index ea78ef0..0000000 --- a/scout_sdk/asio/asio/strand.hpp +++ /dev/null @@ -1,286 +0,0 @@ -// -// strand.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_STRAND_HPP -#define ASIO_STRAND_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/strand_executor_service.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Provides serialised function invocation for any executor type. -template -class strand -{ -public: - /// The type of the underlying executor. - typedef Executor inner_executor_type; - - /// Default constructor. - /** - * This constructor is only valid if the underlying executor type is default - * constructible. - */ - strand() - : executor_(), - impl_(use_service( - executor_.context()).create_implementation()) - { - } - - /// Construct a strand for the specified executor. - explicit strand(const Executor& e) - : executor_(e), - impl_(use_service( - executor_.context()).create_implementation()) - { - } - - /// Copy constructor. - strand(const strand& other) ASIO_NOEXCEPT - : executor_(other.executor_), - impl_(other.impl_) - { - } - - /// Converting constructor. - /** - * This constructor is only valid if the @c OtherExecutor type is convertible - * to @c Executor. - */ - template - strand( - const strand& other) ASIO_NOEXCEPT - : executor_(other.executor_), - impl_(other.impl_) - { - } - - /// Assignment operator. - strand& operator=(const strand& other) ASIO_NOEXCEPT - { - executor_ = other.executor_; - impl_ = other.impl_; - return *this; - } - - /// Converting assignment operator. - /** - * This assignment operator is only valid if the @c OtherExecutor type is - * convertible to @c Executor. - */ - template - strand& operator=( - const strand& other) ASIO_NOEXCEPT - { - executor_ = other.executor_; - impl_ = other.impl_; - return *this; - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move constructor. - strand(strand&& other) ASIO_NOEXCEPT - : executor_(ASIO_MOVE_CAST(Executor)(other.executor_)), - impl_(ASIO_MOVE_CAST(implementation_type)(other.impl_)) - { - } - - /// Converting move constructor. - /** - * This constructor is only valid if the @c OtherExecutor type is convertible - * to @c Executor. - */ - template - strand(strand&& other) ASIO_NOEXCEPT - : executor_(ASIO_MOVE_CAST(OtherExecutor)(other)), - impl_(ASIO_MOVE_CAST(implementation_type)(other.impl_)) - { - } - - /// Move assignment operator. - strand& operator=(strand&& other) ASIO_NOEXCEPT - { - executor_ = ASIO_MOVE_CAST(Executor)(other); - impl_ = ASIO_MOVE_CAST(implementation_type)(other.impl_); - return *this; - } - - /// Converting move assignment operator. - /** - * This assignment operator is only valid if the @c OtherExecutor type is - * convertible to @c Executor. - */ - template - strand& operator=( - const strand&& other) ASIO_NOEXCEPT - { - executor_ = ASIO_MOVE_CAST(OtherExecutor)(other); - impl_ = ASIO_MOVE_CAST(implementation_type)(other.impl_); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destructor. - ~strand() - { - } - - /// Obtain the underlying executor. - inner_executor_type get_inner_executor() const ASIO_NOEXCEPT - { - return executor_; - } - - /// Obtain the underlying execution context. - execution_context& context() const ASIO_NOEXCEPT - { - return executor_.context(); - } - - /// Inform the strand that it has some outstanding work to do. - /** - * The strand delegates this call to its underlying executor. - */ - void on_work_started() const ASIO_NOEXCEPT - { - executor_.on_work_started(); - } - - /// Inform the strand that some work is no longer outstanding. - /** - * The strand delegates this call to its underlying executor. - */ - void on_work_finished() const ASIO_NOEXCEPT - { - executor_.on_work_finished(); - } - - /// Request the strand to invoke the given function object. - /** - * This function is used to ask the strand to execute the given function - * object on its underlying executor. The function object will be executed - * inside this function if the strand is not otherwise busy and if the - * underlying executor's @c dispatch() function is also able to execute the - * function before returning. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const - { - detail::strand_executor_service::dispatch(impl_, - executor_, ASIO_MOVE_CAST(Function)(f), a); - } - - /// Request the strand to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object will never be executed inside this function. - * Instead, it will be scheduled by the underlying executor's defer function. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const - { - detail::strand_executor_service::post(impl_, - executor_, ASIO_MOVE_CAST(Function)(f), a); - } - - /// Request the strand to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object will never be executed inside this function. - * Instead, it will be scheduled by the underlying executor's defer function. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const - { - detail::strand_executor_service::defer(impl_, - executor_, ASIO_MOVE_CAST(Function)(f), a); - } - - /// Determine whether the strand is running in the current thread. - /** - * @return @c true if the current thread is executing a function that was - * submitted to the strand using post(), dispatch() or defer(). Otherwise - * returns @c false. - */ - bool running_in_this_thread() const ASIO_NOEXCEPT - { - return detail::strand_executor_service::running_in_this_thread(impl_); - } - - /// Compare two strands for equality. - /** - * Two strands are equal if they refer to the same ordered, non-concurrent - * state. - */ - friend bool operator==(const strand& a, const strand& b) ASIO_NOEXCEPT - { - return a.impl_ == b.impl_; - } - - /// Compare two strands for inequality. - /** - * Two strands are equal if they refer to the same ordered, non-concurrent - * state. - */ - friend bool operator!=(const strand& a, const strand& b) ASIO_NOEXCEPT - { - return a.impl_ != b.impl_; - } - -private: - Executor executor_; - typedef detail::strand_executor_service::implementation_type - implementation_type; - implementation_type impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -// If both io_context.hpp and strand.hpp have been included, automatically -// include the header file needed for the io_context::strand class. -#if !defined(ASIO_NO_EXTENSIONS) -# if defined(ASIO_IO_CONTEXT_HPP) -# include "asio/io_context_strand.hpp" -# endif // defined(ASIO_IO_CONTEXT_HPP) -#endif // !defined(ASIO_NO_EXTENSIONS) - -#endif // ASIO_STRAND_HPP diff --git a/scout_sdk/asio/asio/stream_socket_service.hpp b/scout_sdk/asio/asio/stream_socket_service.hpp deleted file mode 100644 index 91b0a71..0000000 --- a/scout_sdk/asio/asio/stream_socket_service.hpp +++ /dev/null @@ -1,412 +0,0 @@ -// -// stream_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_STREAM_SOCKET_SERVICE_HPP -#define ASIO_STREAM_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/type_traits.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_WINDOWS_RUNTIME) -# include "asio/detail/winrt_ssocket_service.hpp" -#elif defined(ASIO_HAS_IOCP) -# include "asio/detail/win_iocp_socket_service.hpp" -#else -# include "asio/detail/reactive_socket_service.hpp" -#endif - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a stream socket. -template -class stream_socket_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_WINDOWS_RUNTIME) - typedef detail::winrt_ssocket_service service_impl_type; -#elif defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#else - typedef detail::reactive_socket_service service_impl_type; -#endif - -public: - /// The type of a stream socket implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native socket type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef typename service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new stream socket service for the specified io_context. - explicit stream_socket_service(asio::io_context& io_context) - : asio::detail::service_base< - stream_socket_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new stream socket implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new stream socket implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another stream socket implementation. - void move_assign(implementation_type& impl, - stream_socket_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } - - // All socket services have access to each other's implementations. - template friend class stream_socket_service; - - /// Move-construct a new stream socket implementation from another protocol - /// type. - template - void converting_move_construct(implementation_type& impl, - stream_socket_service& other_service, - typename stream_socket_service< - Protocol1>::implementation_type& other_impl, - typename enable_if::value>::type* = 0) - { - service_impl_.template converting_move_construct( - impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a stream socket implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Open a stream socket. - ASIO_SYNC_OP_VOID open(implementation_type& impl, - const protocol_type& protocol, asio::error_code& ec) - { - if (protocol.type() == ASIO_OS_DEF(SOCK_STREAM)) - service_impl_.open(impl, protocol, ec); - else - ec = asio::error::invalid_argument; - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Assign an existing native socket to a stream socket. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const protocol_type& protocol, const native_handle_type& native_socket, - asio::error_code& ec) - { - service_impl_.assign(impl, protocol, native_socket, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a stream socket implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Release ownership of the underlying socket. - native_handle_type release(implementation_type& impl, - asio::error_code& ec) - { - return service_impl_.release(impl, ec); - } - - /// Get the native socket implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the socket. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the socket is at the out-of-band data mark. - bool at_mark(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.at_mark(impl, ec); - } - - /// Determine the number of bytes available for reading. - std::size_t available(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.available(impl, ec); - } - - /// Bind the stream socket to the specified local endpoint. - ASIO_SYNC_OP_VOID bind(implementation_type& impl, - const endpoint_type& endpoint, asio::error_code& ec) - { - service_impl_.bind(impl, endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Connect the stream socket to the specified endpoint. - ASIO_SYNC_OP_VOID connect(implementation_type& impl, - const endpoint_type& peer_endpoint, asio::error_code& ec) - { - service_impl_.connect(impl, peer_endpoint, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Start an asynchronous connect. - template - ASIO_INITFN_RESULT_TYPE(ConnectHandler, - void (asio::error_code)) - async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, - ASIO_MOVE_ARG(ConnectHandler) handler) - { - async_completion init(handler); - - service_impl_.async_connect(impl, peer_endpoint, init.completion_handler); - - return init.result.get(); - } - - /// Set a socket option. - template - ASIO_SYNC_OP_VOID set_option(implementation_type& impl, - const SettableSocketOption& option, asio::error_code& ec) - { - service_impl_.set_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get a socket option. - template - ASIO_SYNC_OP_VOID get_option(const implementation_type& impl, - GettableSocketOption& option, asio::error_code& ec) const - { - service_impl_.get_option(impl, option, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform an IO control command on the socket. - template - ASIO_SYNC_OP_VOID io_control(implementation_type& impl, - IoControlCommand& command, asio::error_code& ec) - { - service_impl_.io_control(impl, command, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the socket. - bool non_blocking(const implementation_type& impl) const - { - return service_impl_.non_blocking(impl); - } - - /// Sets the non-blocking mode of the socket. - ASIO_SYNC_OP_VOID non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Gets the non-blocking mode of the native socket implementation. - bool native_non_blocking(const implementation_type& impl) const - { - return service_impl_.native_non_blocking(impl); - } - - /// Sets the non-blocking mode of the native socket implementation. - ASIO_SYNC_OP_VOID native_non_blocking(implementation_type& impl, - bool mode, asio::error_code& ec) - { - service_impl_.native_non_blocking(impl, mode, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the local endpoint. - endpoint_type local_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.local_endpoint(impl, ec); - } - - /// Get the remote endpoint. - endpoint_type remote_endpoint(const implementation_type& impl, - asio::error_code& ec) const - { - return service_impl_.remote_endpoint(impl, ec); - } - - /// Disable sends or receives on the socket. - ASIO_SYNC_OP_VOID shutdown(implementation_type& impl, - socket_base::shutdown_type what, asio::error_code& ec) - { - service_impl_.shutdown(impl, what, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Wait for the socket to become ready to read, ready to write, or to have - /// pending error conditions. - ASIO_SYNC_OP_VOID wait(implementation_type& impl, - socket_base::wait_type w, asio::error_code& ec) - { - service_impl_.wait(impl, w, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Asynchronously wait for the socket to become ready to read, ready to - /// write, or to have pending error conditions. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, socket_base::wait_type w, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, w, init.completion_handler); - - return init.result.get(); - } - - /// Send the given data to the peer. - template - std::size_t send(implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.send(impl, buffers, flags, ec); - } - - /// Start an asynchronous send. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_send(implementation_type& impl, - const ConstBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(WriteHandler) handler) - { - async_completion init(handler); - - service_impl_.async_send(impl, buffers, flags, init.completion_handler); - - return init.result.get(); - } - - /// Receive some data from the peer. - template - std::size_t receive(implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, asio::error_code& ec) - { - return service_impl_.receive(impl, buffers, flags, ec); - } - - /// Start an asynchronous receive. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_receive(implementation_type& impl, - const MutableBufferSequence& buffers, - socket_base::message_flags flags, - ASIO_MOVE_ARG(ReadHandler) handler) - { - async_completion init(handler); - - service_impl_.async_receive(impl, buffers, flags, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_STREAM_SOCKET_SERVICE_HPP diff --git a/scout_sdk/asio/asio/streambuf.hpp b/scout_sdk/asio/asio/streambuf.hpp deleted file mode 100644 index cb3f35f..0000000 --- a/scout_sdk/asio/asio/streambuf.hpp +++ /dev/null @@ -1,33 +0,0 @@ -// -// streambuf.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_STREAMBUF_HPP -#define ASIO_STREAMBUF_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_NO_IOSTREAM) - -#include "asio/basic_streambuf.hpp" - -namespace asio { - -/// Typedef for the typical usage of basic_streambuf. -typedef basic_streambuf<> streambuf; - -} // namespace asio - -#endif // !defined(ASIO_NO_IOSTREAM) - -#endif // ASIO_STREAMBUF_HPP diff --git a/scout_sdk/asio/asio/system_context.hpp b/scout_sdk/asio/asio/system_context.hpp deleted file mode 100644 index ccd1113..0000000 --- a/scout_sdk/asio/asio/system_context.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// system_context.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SYSTEM_CONTEXT_HPP -#define ASIO_SYSTEM_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/scheduler.hpp" -#include "asio/detail/thread_group.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -class system_executor; - -/// The executor context for the system executor. -class system_context : public execution_context -{ -public: - /// The executor type associated with the context. - typedef system_executor executor_type; - - /// Destructor shuts down all threads in the system thread pool. - ASIO_DECL ~system_context(); - - /// Obtain an executor for the context. - executor_type get_executor() ASIO_NOEXCEPT; - - /// Signal all threads in the system thread pool to stop. - ASIO_DECL void stop(); - - /// Determine whether the system thread pool has been stopped. - ASIO_DECL bool stopped() const ASIO_NOEXCEPT; - - /// Join all threads in the system thread pool. - ASIO_DECL void join(); - -#if defined(GENERATING_DOCUMENTATION) -private: -#endif // defined(GENERATING_DOCUMENTATION) - // Constructor creates all threads in the system thread pool. - ASIO_DECL system_context(); - -private: - friend class system_executor; - - struct thread_function; - - // The underlying scheduler. - detail::scheduler& scheduler_; - - // The threads in the system thread pool. - detail::thread_group threads_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/system_context.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/system_context.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_SYSTEM_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/system_error.hpp b/scout_sdk/asio/asio/system_error.hpp deleted file mode 100644 index 6390894..0000000 --- a/scout_sdk/asio/asio/system_error.hpp +++ /dev/null @@ -1,131 +0,0 @@ -// -// system_error.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SYSTEM_ERROR_HPP -#define ASIO_SYSTEM_ERROR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_SYSTEM_ERROR) -# include -#else // defined(ASIO_HAS_STD_SYSTEM_ERROR) -# include -# include -# include -# include "asio/error_code.hpp" -# include "asio/detail/scoped_ptr.hpp" -#endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -#if defined(ASIO_HAS_STD_SYSTEM_ERROR) - -typedef std::system_error system_error; - -#else // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -/// The system_error class is used to represent system conditions that -/// prevent the library from operating correctly. -class system_error - : public std::exception -{ -public: - /// Construct with an error code. - system_error(const error_code& ec) - : code_(ec), - context_() - { - } - - /// Construct with an error code and context. - system_error(const error_code& ec, const std::string& context) - : code_(ec), - context_(context) - { - } - - /// Copy constructor. - system_error(const system_error& other) - : std::exception(other), - code_(other.code_), - context_(other.context_), - what_() - { - } - - /// Destructor. - virtual ~system_error() throw () - { - } - - /// Assignment operator. - system_error& operator=(const system_error& e) - { - context_ = e.context_; - code_ = e.code_; - what_.reset(); - return *this; - } - - /// Get a string representation of the exception. - virtual const char* what() const throw () - { -#if !defined(ASIO_NO_EXCEPTIONS) - try -#endif // !defined(ASIO_NO_EXCEPTIONS) - { - if (!what_.get()) - { - std::string tmp(context_); - if (tmp.length()) - tmp += ": "; - tmp += code_.message(); - what_.reset(new std::string(tmp)); - } - return what_->c_str(); - } -#if !defined(ASIO_NO_EXCEPTIONS) - catch (std::exception&) - { - return "system_error"; - } -#endif // !defined(ASIO_NO_EXCEPTIONS) - } - - /// Get the error code associated with the exception. - error_code code() const - { - return code_; - } - -private: - // The code associated with the error. - error_code code_; - - // The context associated with the error. - std::string context_; - - // The string representation of the error. - mutable asio::detail::scoped_ptr what_; -}; - -#endif // defined(ASIO_HAS_STD_SYSTEM_ERROR) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SYSTEM_ERROR_HPP diff --git a/scout_sdk/asio/asio/system_executor.hpp b/scout_sdk/asio/asio/system_executor.hpp deleted file mode 100644 index b588a21..0000000 --- a/scout_sdk/asio/asio/system_executor.hpp +++ /dev/null @@ -1,129 +0,0 @@ -// -// system_executor.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SYSTEM_EXECUTOR_HPP -#define ASIO_SYSTEM_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -class system_context; - -/// An executor that uses arbitrary threads. -/** - * The system executor represents an execution context where functions are - * permitted to run on arbitrary threads. The post() and defer() functions - * schedule the function to run on an unspecified system thread pool, and - * dispatch() invokes the function immediately. - */ -class system_executor -{ -public: - /// Obtain the underlying execution context. - system_context& context() const ASIO_NOEXCEPT; - - /// Inform the executor that it has some outstanding work to do. - /** - * For the system executor, this is a no-op. - */ - void on_work_started() const ASIO_NOEXCEPT - { - } - - /// Inform the executor that some work is no longer outstanding. - /** - * For the system executor, this is a no-op. - */ - void on_work_finished() const ASIO_NOEXCEPT - { - } - - /// Request the system executor to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object will always be executed inside this function. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the system executor to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object will never be executed inside this function. - * Instead, it will be scheduled to run on an unspecified system thread pool. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the system executor to invoke the given function object. - /** - * This function is used to ask the executor to execute the given function - * object. The function object will never be executed inside this function. - * Instead, it will be scheduled to run on an unspecified system thread pool. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Compare two executors for equality. - /** - * System executors always compare equal. - */ - friend bool operator==(const system_executor&, - const system_executor&) ASIO_NOEXCEPT - { - return true; - } - - /// Compare two executors for inequality. - /** - * System executors always compare equal. - */ - friend bool operator!=(const system_executor&, - const system_executor&) ASIO_NOEXCEPT - { - return false; - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/system_executor.hpp" - -#endif // ASIO_SYSTEM_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/system_timer.hpp b/scout_sdk/asio/asio/system_timer.hpp deleted file mode 100644 index e75e7d4..0000000 --- a/scout_sdk/asio/asio/system_timer.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// -// system_timer.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SYSTEM_TIMER_HPP -#define ASIO_SYSTEM_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_waitable_timer.hpp" -#include "asio/detail/chrono.hpp" - -namespace asio { - -/// Typedef for a timer based on the system clock. -/** - * This typedef uses the C++11 @c <chrono> standard library facility, if - * available. Otherwise, it may use the Boost.Chrono library. To explicitly - * utilise Boost.Chrono, use the basic_waitable_timer template directly: - * @code - * typedef basic_waitable_timer timer; - * @endcode - */ -typedef basic_waitable_timer system_timer; - -} // namespace asio - -#endif // defined(ASIO_HAS_CHRONO) || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_SYSTEM_TIMER_HPP diff --git a/scout_sdk/asio/asio/thread.hpp b/scout_sdk/asio/asio/thread.hpp deleted file mode 100644 index eeeef7b..0000000 --- a/scout_sdk/asio/asio/thread.hpp +++ /dev/null @@ -1,92 +0,0 @@ -// -// thread.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_THREAD_HPP -#define ASIO_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/thread.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// A simple abstraction for starting threads. -/** - * The asio::thread class implements the smallest possible subset of the - * functionality of boost::thread. It is intended to be used only for starting - * a thread and waiting for it to exit. If more extensive threading - * capabilities are required, you are strongly advised to use something else. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Example - * A typical use of asio::thread would be to launch a thread to run an - * io_context's event processing loop: - * - * @par - * @code asio::io_context io_context; - * // ... - * asio::thread t(boost::bind(&asio::io_context::run, &io_context)); - * // ... - * t.join(); @endcode - */ -class thread - : private noncopyable -{ -public: - /// Start a new thread that executes the supplied function. - /** - * This constructor creates a new thread that will execute the given function - * or function object. - * - * @param f The function or function object to be run in the thread. The - * function signature must be: @code void f(); @endcode - */ - template - explicit thread(Function f) - : impl_(f) - { - } - - /// Destructor. - ~thread() - { - } - - /// Wait for the thread to exit. - /** - * This function will block until the thread has exited. - * - * If this function is not called before the thread object is destroyed, the - * thread itself will continue to run until completion. You will, however, - * no longer have the ability to wait for it to exit. - */ - void join() - { - impl_.join(); - } - -private: - detail::thread impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_THREAD_HPP diff --git a/scout_sdk/asio/asio/thread_pool.hpp b/scout_sdk/asio/asio/thread_pool.hpp deleted file mode 100644 index f22f18d..0000000 --- a/scout_sdk/asio/asio/thread_pool.hpp +++ /dev/null @@ -1,232 +0,0 @@ -// -// thread_pool.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_THREAD_POOL_HPP -#define ASIO_THREAD_POOL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scheduler.hpp" -#include "asio/detail/thread_group.hpp" -#include "asio/execution_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// A simple fixed-size thread pool. -/** - * The thread pool class is an execution context where functions are permitted - * to run on one of a fixed number of threads. - * - * @par Submitting tasks to the pool - * - * To submit functions to the io_context, use the @ref asio::dispatch, - * @ref asio::post or @ref asio::defer free functions. - * - * For example: - * - * @code void my_task() - * { - * ... - * } - * - * ... - * - * // Launch the pool with four threads. - * asio::thread_pool pool(4); - * - * // Submit a function to the pool. - * asio::post(pool, my_task); - * - * // Submit a lambda object to the pool. - * asio::post(pool, - * []() - * { - * ... - * }); - * - * // Wait for all tasks in the pool to complete. - * pool.join(); @endcode - */ -class thread_pool - : public execution_context -{ -public: - class executor_type; - - /// Constructs a pool with an automatically determined number of threads. - ASIO_DECL thread_pool(); - - /// Constructs a pool with a specified number of threads. - ASIO_DECL thread_pool(std::size_t num_threads); - - /// Destructor. - /** - * Automatically stops and joins the pool, if not explicitly done beforehand. - */ - ASIO_DECL ~thread_pool(); - - /// Obtains the executor associated with the pool. - executor_type get_executor() ASIO_NOEXCEPT; - - /// Stops the threads. - /** - * This function stops the threads as soon as possible. As a result of calling - * @c stop(), pending function objects may be never be invoked. - */ - ASIO_DECL void stop(); - - /// Joins the threads. - /** - * This function blocks until the threads in the pool have completed. If @c - * stop() is not called prior to @c join(), the @c join() call will wait - * until the pool has no more outstanding work. - */ - ASIO_DECL void join(); - -private: - friend class executor_type; - struct thread_function; - - // The underlying scheduler. - detail::scheduler& scheduler_; - - // The threads in the pool. - detail::thread_group threads_; -}; - -/// Executor used to submit functions to a thread pool. -class thread_pool::executor_type -{ -public: - /// Obtain the underlying execution context. - thread_pool& context() const ASIO_NOEXCEPT; - - /// Inform the thread pool that it has some outstanding work to do. - /** - * This function is used to inform the thread pool that some work has begun. - * This ensures that the thread pool's join() function will not return while - * the work is underway. - */ - void on_work_started() const ASIO_NOEXCEPT; - - /// Inform the thread pool that some work is no longer outstanding. - /** - * This function is used to inform the thread pool that some work has - * finished. Once the count of unfinished work reaches zero, the thread - * pool's join() function is permitted to exit. - */ - void on_work_finished() const ASIO_NOEXCEPT; - - /// Request the thread pool to invoke the given function object. - /** - * This function is used to ask the thread pool to execute the given function - * object. If the current thread belongs to the pool, @c dispatch() executes - * the function before returning. Otherwise, the function will be scheduled - * to run on the thread pool. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the thread pool to invoke the given function object. - /** - * This function is used to ask the thread pool to execute the given function - * object. The function object will never be executed inside @c post(). - * Instead, it will be scheduled to run on the thread pool. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void post(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Request the thread pool to invoke the given function object. - /** - * This function is used to ask the thread pool to execute the given function - * object. The function object will never be executed inside @c defer(). - * Instead, it will be scheduled to run on the thread pool. - * - * If the current thread belongs to the thread pool, @c defer() will delay - * scheduling the function object until the current thread returns control to - * the pool. - * - * @param f The function object to be called. The executor will make - * a copy of the handler object as required. The function signature of the - * function object must be: @code void function(); @endcode - * - * @param a An allocator that may be used by the executor to allocate the - * internal storage needed for function invocation. - */ - template - void defer(ASIO_MOVE_ARG(Function) f, const Allocator& a) const; - - /// Determine whether the thread pool is running in the current thread. - /** - * @return @c true if the current thread belongs to the pool. Otherwise - * returns @c false. - */ - bool running_in_this_thread() const ASIO_NOEXCEPT; - - /// Compare two executors for equality. - /** - * Two executors are equal if they refer to the same underlying thread pool. - */ - friend bool operator==(const executor_type& a, - const executor_type& b) ASIO_NOEXCEPT - { - return &a.pool_ == &b.pool_; - } - - /// Compare two executors for inequality. - /** - * Two executors are equal if they refer to the same underlying thread pool. - */ - friend bool operator!=(const executor_type& a, - const executor_type& b) ASIO_NOEXCEPT - { - return &a.pool_ != &b.pool_; - } - -private: - friend class thread_pool; - - // Constructor. - explicit executor_type(thread_pool& p) : pool_(p) {} - - // The underlying thread pool. - thread_pool& pool_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/thread_pool.hpp" -#if defined(ASIO_HEADER_ONLY) -# include "asio/impl/thread_pool.ipp" -#endif // defined(ASIO_HEADER_ONLY) - -#endif // ASIO_THREAD_POOL_HPP diff --git a/scout_sdk/asio/asio/time_traits.hpp b/scout_sdk/asio/asio/time_traits.hpp deleted file mode 100644 index 72f4aab..0000000 --- a/scout_sdk/asio/asio/time_traits.hpp +++ /dev/null @@ -1,86 +0,0 @@ -// -// time_traits.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TIME_TRAITS_HPP -#define ASIO_TIME_TRAITS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/socket_types.hpp" // Must come before posix_time. - -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - || defined(GENERATING_DOCUMENTATION) - -#include - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Time traits suitable for use with the deadline timer. -template -struct time_traits; - -/// Time traits specialised for posix_time. -template <> -struct time_traits -{ - /// The time type. - typedef boost::posix_time::ptime time_type; - - /// The duration type. - typedef boost::posix_time::time_duration duration_type; - - /// Get the current time. - static time_type now() - { -#if defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK) - return boost::posix_time::microsec_clock::universal_time(); -#else // defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK) - return boost::posix_time::second_clock::universal_time(); -#endif // defined(BOOST_DATE_TIME_HAS_HIGH_PRECISION_CLOCK) - } - - /// Add a duration to a time. - static time_type add(const time_type& t, const duration_type& d) - { - return t + d; - } - - /// Subtract one time from another. - static duration_type subtract(const time_type& t1, const time_type& t2) - { - return t1 - t2; - } - - /// Test whether one time is less than another. - static bool less_than(const time_type& t1, const time_type& t2) - { - return t1 < t2; - } - - /// Convert to POSIX duration type. - static boost::posix_time::time_duration to_posix_duration( - const duration_type& d) - { - return d; - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_TIME_TRAITS_HPP diff --git a/scout_sdk/asio/asio/ts/buffer.hpp b/scout_sdk/asio/asio/ts/buffer.hpp deleted file mode 100644 index faf08a4..0000000 --- a/scout_sdk/asio/asio/ts/buffer.hpp +++ /dev/null @@ -1,24 +0,0 @@ -// -// ts/buffer.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_BUFFER_HPP -#define ASIO_TS_BUFFER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/read.hpp" -#include "asio/write.hpp" -#include "asio/read_until.hpp" - -#endif // ASIO_TS_BUFFER_HPP diff --git a/scout_sdk/asio/asio/ts/executor.hpp b/scout_sdk/asio/asio/ts/executor.hpp deleted file mode 100644 index 8669cb6..0000000 --- a/scout_sdk/asio/asio/ts/executor.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// ts/executor.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_EXECUTOR_HPP -#define ASIO_TS_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/handler_type.hpp" -#include "asio/async_result.hpp" -#include "asio/associated_allocator.hpp" -#include "asio/execution_context.hpp" -#include "asio/is_executor.hpp" -#include "asio/associated_executor.hpp" -#include "asio/bind_executor.hpp" -#include "asio/executor_work_guard.hpp" -#include "asio/system_executor.hpp" -#include "asio/executor.hpp" -#include "asio/dispatch.hpp" -#include "asio/post.hpp" -#include "asio/defer.hpp" -#include "asio/strand.hpp" -#include "asio/packaged_task.hpp" -#include "asio/use_future.hpp" - -#endif // ASIO_TS_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/ts/internet.hpp b/scout_sdk/asio/asio/ts/internet.hpp deleted file mode 100644 index 6282e90..0000000 --- a/scout_sdk/asio/asio/ts/internet.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// -// ts/internet.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_INTERNET_HPP -#define ASIO_TS_INTERNET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/ip/address.hpp" -#include "asio/ip/address_v4.hpp" -#include "asio/ip/address_v4_iterator.hpp" -#include "asio/ip/address_v4_range.hpp" -#include "asio/ip/address_v6.hpp" -#include "asio/ip/address_v6_iterator.hpp" -#include "asio/ip/address_v6_range.hpp" -#include "asio/ip/bad_address_cast.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/basic_resolver_entry.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver.hpp" -#include "asio/ip/host_name.hpp" -#include "asio/ip/network_v4.hpp" -#include "asio/ip/network_v6.hpp" -#include "asio/ip/tcp.hpp" -#include "asio/ip/udp.hpp" -#include "asio/ip/v6_only.hpp" -#include "asio/ip/unicast.hpp" -#include "asio/ip/multicast.hpp" - -#endif // ASIO_TS_INTERNET_HPP diff --git a/scout_sdk/asio/asio/ts/io_context.hpp b/scout_sdk/asio/asio/ts/io_context.hpp deleted file mode 100644 index b967cd6..0000000 --- a/scout_sdk/asio/asio/ts/io_context.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// -// ts/io_context.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_IO_CONTEXT_HPP -#define ASIO_TS_IO_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/io_context.hpp" - -#endif // ASIO_TS_IO_CONTEXT_HPP diff --git a/scout_sdk/asio/asio/ts/net.hpp b/scout_sdk/asio/asio/ts/net.hpp deleted file mode 100644 index f96075d..0000000 --- a/scout_sdk/asio/asio/ts/net.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// ts/net.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_NET_HPP -#define ASIO_TS_NET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/ts/netfwd.hpp" -#include "asio/ts/executor.hpp" -#include "asio/ts/io_context.hpp" -#include "asio/ts/timer.hpp" -#include "asio/ts/buffer.hpp" -#include "asio/ts/socket.hpp" -#include "asio/ts/internet.hpp" - -#endif // ASIO_TS_NET_HPP diff --git a/scout_sdk/asio/asio/ts/netfwd.hpp b/scout_sdk/asio/asio/ts/netfwd.hpp deleted file mode 100644 index 657a21d..0000000 --- a/scout_sdk/asio/asio/ts/netfwd.hpp +++ /dev/null @@ -1,197 +0,0 @@ -// -// ts/netfwd.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_NETFWD_HPP -#define ASIO_TS_NETFWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_CHRONO) -# include "asio/detail/chrono.hpp" -#endif // defined(ASIO_HAS_CHRONO) - -#if defined(ASIO_HAS_BOOST_DATE_TIME) -# include "asio/detail/date_time_fwd.hpp" -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - -#if !defined(GENERATING_DOCUMENTATION) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -class execution_context; - -template -class executor_binder; - -template -class executor_work_guard; - -class system_executor; - -class executor; - -template -class strand; - -class io_context; - -template -struct wait_traits; - -#if defined(ASIO_HAS_BOOST_DATE_TIME) - -template -struct time_traits; - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -template -class waitable_timer_service; - -#if defined(ASIO_HAS_BOOST_DATE_TIME) - -template -class deadline_timer_service; - -#endif // defined(ASIO_HAS_BOOST_DATE_TIME) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#if !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) -#define ASIO_BASIC_WAITABLE_TIMER_FWD_DECL - -template - ASIO_SVC_TPARAM_DEF2(= waitable_timer_service)> -class basic_waitable_timer; - -#endif // !defined(ASIO_BASIC_WAITABLE_TIMER_FWD_DECL) - -#if defined(ASIO_HAS_CHRONO) - -typedef basic_waitable_timer system_timer; - -typedef basic_waitable_timer steady_timer; - -typedef basic_waitable_timer - high_resolution_timer; - -#endif // defined(ASIO_HAS_CHRONO) - -template -class basic_socket; - -template -class basic_datagram_socket; - -template -class basic_stream_socket; - -template -class basic_socket_acceptor; - -#if !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) -#define ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL - -// Forward declaration with defaulted arguments. -template ), -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - || defined(GENERATING_DOCUMENTATION) - typename Clock = boost::posix_time::ptime, - typename WaitTraits = time_traits - ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> -#else - typename Clock = chrono::steady_clock, - typename WaitTraits = wait_traits - ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> -#endif -class basic_socket_streambuf; - -#endif // !defined(ASIO_BASIC_SOCKET_STREAMBUF_FWD_DECL) - -#if !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) -#define ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL - -// Forward declaration with defaulted arguments. -template ), -#if defined(ASIO_HAS_BOOST_DATE_TIME) \ - || defined(GENERATING_DOCUMENTATION) - typename Clock = boost::posix_time::ptime, - typename WaitTraits = time_traits - ASIO_SVC_TPARAM1_DEF2(= deadline_timer_service)> -#else - typename Clock = chrono::steady_clock, - typename WaitTraits = wait_traits - ASIO_SVC_TPARAM1_DEF1(= steady_timer::service_type)> -#endif -class basic_socket_iostream; - -#endif // !defined(ASIO_BASIC_SOCKET_IOSTREAM_FWD_DECL) - -namespace ip { - -class address; - -class address_v4; - -class address_v6; - -template -class basic_address_iterator; - -typedef basic_address_iterator address_v4_iterator; - -typedef basic_address_iterator address_v6_iterator; - -template -class basic_address_range; - -typedef basic_address_range address_v4_range; - -typedef basic_address_range address_v6_range; - -class network_v4; - -class network_v6; - -template -class basic_endpoint; - -template -class basic_resolver_entry; - -template -class basic_resolver_results; - -template -class basic_resolver; - -class tcp; - -class udp; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // !defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_TS_NETFWD_HPP diff --git a/scout_sdk/asio/asio/ts/socket.hpp b/scout_sdk/asio/asio/ts/socket.hpp deleted file mode 100644 index a542734..0000000 --- a/scout_sdk/asio/asio/ts/socket.hpp +++ /dev/null @@ -1,27 +0,0 @@ -// -// ts/socket.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_SOCKET_HPP -#define ASIO_TS_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/socket_base.hpp" -#include "asio/basic_socket.hpp" -#include "asio/basic_datagram_socket.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/basic_socket_acceptor.hpp" -#include "asio/basic_socket_streambuf.hpp" -#include "asio/basic_socket_iostream.hpp" -#include "asio/connect.hpp" - -#endif // ASIO_TS_SOCKET_HPP diff --git a/scout_sdk/asio/asio/ts/timer.hpp b/scout_sdk/asio/asio/ts/timer.hpp deleted file mode 100644 index 872be8b..0000000 --- a/scout_sdk/asio/asio/ts/timer.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// ts/timer.hpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TS_TIMER_HPP -#define ASIO_TS_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/chrono.hpp" - -#include "asio/wait_traits.hpp" -#include "asio/basic_waitable_timer.hpp" -#include "asio/system_timer.hpp" -#include "asio/steady_timer.hpp" -#include "asio/high_resolution_timer.hpp" - -#endif // ASIO_TS_TIMER_HPP diff --git a/scout_sdk/asio/asio/unyield.hpp b/scout_sdk/asio/asio/unyield.hpp deleted file mode 100644 index de3ed02..0000000 --- a/scout_sdk/asio/asio/unyield.hpp +++ /dev/null @@ -1,21 +0,0 @@ -// -// unyield.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifdef reenter -# undef reenter -#endif - -#ifdef yield -# undef yield -#endif - -#ifdef fork -# undef fork -#endif diff --git a/scout_sdk/asio/asio/use_future.hpp b/scout_sdk/asio/asio/use_future.hpp deleted file mode 100644 index 3f9c696..0000000 --- a/scout_sdk/asio/asio/use_future.hpp +++ /dev/null @@ -1,159 +0,0 @@ -// -// use_future.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_USE_FUTURE_HPP -#define ASIO_USE_FUTURE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_STD_FUTURE) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class packaged_token; - -template -class packaged_handler; - -} // namespace detail - -/// Class used to specify that an asynchronous operation should return a future. -/** - * The use_future_t class is used to indicate that an asynchronous operation - * should return a std::future object. A use_future_t object may be passed as a - * handler to an asynchronous operation, typically using the special value @c - * asio::use_future. For example: - * - * @code std::future my_future - * = my_socket.async_read_some(my_buffer, asio::use_future); @endcode - * - * The initiating function (async_read_some in the above example) returns a - * future that will receive the result of the operation. If the operation - * completes with an error_code indicating failure, it is converted into a - * system_error and passed back to the caller via the future. - */ -template > -class use_future_t -{ -public: - /// The allocator type. The allocator is used when constructing the - /// @c std::promise object for a given asynchronous operation. - typedef Allocator allocator_type; - - /// Construct using default-constructed allocator. - ASIO_CONSTEXPR use_future_t() - { - } - - /// Construct using specified allocator. - explicit use_future_t(const Allocator& allocator) - : allocator_(allocator) - { - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use rebind().) Specify an alternate allocator. - template - use_future_t operator[](const OtherAllocator& allocator) const - { - return use_future_t(allocator); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Specify an alternate allocator. - template - use_future_t rebind(const OtherAllocator& allocator) const - { - return use_future_t(allocator); - } - - /// Obtain allocator. - allocator_type get_allocator() const - { - return allocator_; - } - - /// Wrap a function object in a packaged task. - /** - * The @c package function is used to adapt a function object as a packaged - * task. When this adapter is passed as a completion token to an asynchronous - * operation, the result of the function object is retuned via a std::future. - * - * @par Example - * - * @code std::future fut = - * my_socket.async_read_some(buffer, - * use_future([](asio::error_code ec, std::size_t n) - * { - * return ec ? 0 : n; - * })); - * ... - * std::size_t n = fut.get(); @endcode - */ - template -#if defined(GENERATING_DOCUMENTATION) - unspecified -#else // defined(GENERATING_DOCUMENTATION) - detail::packaged_token::type, Allocator> -#endif // defined(GENERATING_DOCUMENTATION) - operator()(ASIO_MOVE_ARG(Function) f) const; - -private: - // Helper type to ensure that use_future can be constexpr default-constructed - // even when std::allocator can't be. - struct std_allocator_void - { - ASIO_CONSTEXPR std_allocator_void() - { - } - - operator std::allocator() const - { - return std::allocator(); - } - }; - - typename conditional< - is_same, Allocator>::value, - std_allocator_void, Allocator>::type allocator_; -}; - -/// A special value, similar to std::nothrow. -/** - * See the documentation for asio::use_future_t for a usage example. - */ -#if defined(ASIO_HAS_CONSTEXPR) || defined(GENERATING_DOCUMENTATION) -constexpr use_future_t<> use_future; -#elif defined(ASIO_MSVC) -__declspec(selectany) use_future_t<> use_future; -#endif - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/use_future.hpp" - -#endif // defined(ASIO_HAS_STD_FUTURE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_USE_FUTURE_HPP diff --git a/scout_sdk/asio/asio/uses_executor.hpp b/scout_sdk/asio/asio/uses_executor.hpp deleted file mode 100644 index e985c28..0000000 --- a/scout_sdk/asio/asio/uses_executor.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// -// uses_executor.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_USES_EXECUTOR_HPP -#define ASIO_USES_EXECUTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/detail/type_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// A special type, similar to std::nothrow_t, used to disambiguate -/// constructors that accept executor arguments. -/** - * The executor_arg_t struct is an empty structure type used as a unique type - * to disambiguate constructor and function overloading. Specifically, some - * types have constructors with executor_arg_t as the first argument, - * immediately followed by an argument of a type that satisfies the Executor - * type requirements. - */ -struct executor_arg_t -{ - /// Constructor. - ASIO_CONSTEXPR executor_arg_t() ASIO_NOEXCEPT - { - } -}; - -/// A special value, similar to std::nothrow, used to disambiguate constructors -/// that accept executor arguments. -/** - * See asio::executor_arg_t and asio::uses_executor - * for more information. - */ -#if defined(ASIO_HAS_CONSTEXPR) || defined(GENERATING_DOCUMENTATION) -constexpr executor_arg_t executor_arg; -#elif defined(ASIO_MSVC) -__declspec(selectany) executor_arg_t executor_arg; -#endif - -/// The uses_executor trait detects whether a type T has an associated executor -/// that is convertible from type Executor. -/** - * Meets the BinaryTypeTrait requirements. The Asio library provides a - * definition that is derived from false_type. A program may specialize this - * template to derive from true_type for a user-defined type T that can be - * constructed with an executor, where the first argument of a constructor has - * type executor_arg_t and the second argument is convertible from type - * Executor. - */ -template -struct uses_executor : false_type {}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_USES_EXECUTOR_HPP diff --git a/scout_sdk/asio/asio/version.hpp b/scout_sdk/asio/asio/version.hpp deleted file mode 100644 index 099ffdb..0000000 --- a/scout_sdk/asio/asio/version.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// version.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_VERSION_HPP -#define ASIO_VERSION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -// ASIO_VERSION % 100 is the sub-minor version -// ASIO_VERSION / 100 % 1000 is the minor version -// ASIO_VERSION / 100000 is the major version -#define ASIO_VERSION 101201 // 1.12.1 - -#endif // ASIO_VERSION_HPP diff --git a/scout_sdk/asio/asio/wait_traits.hpp b/scout_sdk/asio/asio/wait_traits.hpp deleted file mode 100644 index a6016f7..0000000 --- a/scout_sdk/asio/asio/wait_traits.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// -// wait_traits.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WAIT_TRAITS_HPP -#define ASIO_WAIT_TRAITS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Wait traits suitable for use with the basic_waitable_timer class template. -template -struct wait_traits -{ - /// Convert a clock duration into a duration used for waiting. - /** - * @returns @c d. - */ - static typename Clock::duration to_wait_duration( - const typename Clock::duration& d) - { - return d; - } - - /// Convert a clock duration into a duration used for waiting. - /** - * @returns @c d. - */ - static typename Clock::duration to_wait_duration( - const typename Clock::time_point& t) - { - typename Clock::time_point now = Clock::now(); - if (now + (Clock::duration::max)() < t) - return (Clock::duration::max)(); - if (now + (Clock::duration::min)() > t) - return (Clock::duration::min)(); - return t - now; - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_WAIT_TRAITS_HPP diff --git a/scout_sdk/asio/asio/waitable_timer_service.hpp b/scout_sdk/asio/asio/waitable_timer_service.hpp deleted file mode 100644 index 75e496f..0000000 --- a/scout_sdk/asio/asio/waitable_timer_service.hpp +++ /dev/null @@ -1,210 +0,0 @@ -// -// waitable_timer_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WAITABLE_TIMER_SERVICE_HPP -#define ASIO_WAITABLE_TIMER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/chrono_time_traits.hpp" -#include "asio/detail/deadline_timer_service.hpp" -#include "asio/io_context.hpp" -#include "asio/wait_traits.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default service implementation for a timer. -template > -class waitable_timer_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base< - waitable_timer_service > -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - - /// The clock type. - typedef Clock clock_type; - - /// The duration type of the clock. - typedef typename clock_type::duration duration; - - /// The time point type of the clock. - typedef typename clock_type::time_point time_point; - - /// The wait traits type. - typedef WaitTraits traits_type; - -private: - // The type of the platform-specific implementation. - typedef detail::deadline_timer_service< - detail::chrono_time_traits > service_impl_type; - -public: - /// The implementation type of the waitable timer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// Construct a new timer service for the specified io_context. - explicit waitable_timer_service(asio::io_context& io_context) - : asio::detail::service_base< - waitable_timer_service >(io_context), - service_impl_(io_context) - { - } - - /// Construct a new timer implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a timer implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new timer implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another timer implementation. - void move_assign(implementation_type& impl, - waitable_timer_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Cancel any asynchronous wait operations associated with the timer. - std::size_t cancel(implementation_type& impl, asio::error_code& ec) - { - return service_impl_.cancel(impl, ec); - } - - /// Cancels one asynchronous wait operation associated with the timer. - std::size_t cancel_one(implementation_type& impl, - asio::error_code& ec) - { - return service_impl_.cancel_one(impl, ec); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use expiry().) Get the expiry time for the timer as an - /// absolute time. - time_point expires_at(const implementation_type& impl) const - { - return service_impl_.expiry(impl); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the expiry time for the timer as an absolute time. - time_point expiry(const implementation_type& impl) const - { - return service_impl_.expiry(impl); - } - - /// Set the expiry time for the timer as an absolute time. - std::size_t expires_at(implementation_type& impl, - const time_point& expiry_time, asio::error_code& ec) - { - return service_impl_.expires_at(impl, expiry_time, ec); - } - - /// Set the expiry time for the timer relative to now. - std::size_t expires_after(implementation_type& impl, - const duration& expiry_time, asio::error_code& ec) - { - return service_impl_.expires_after(impl, expiry_time, ec); - } - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use expiry().) Get the expiry time for the timer relative to - /// now. - duration expires_from_now(const implementation_type& impl) const - { - typedef detail::chrono_time_traits traits; - return traits::subtract(service_impl_.expiry(impl), traits::now()); - } - - /// (Deprecated: Use expires_after().) Set the expiry time for the timer - /// relative to now. - std::size_t expires_from_now(implementation_type& impl, - const duration& expiry_time, asio::error_code& ec) - { - return service_impl_.expires_after(impl, expiry_time, ec); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - // Perform a blocking wait on the timer. - void wait(implementation_type& impl, asio::error_code& ec) - { - service_impl_.wait(impl, ec); - } - - // Start an asynchronous wait on the timer. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, - ASIO_MOVE_ARG(WaitHandler) handler) - { - async_completion init(handler); - - service_impl_.async_wait(impl, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WAITABLE_TIMER_SERVICE_HPP diff --git a/scout_sdk/asio/asio/windows/basic_handle.hpp b/scout_sdk/asio/asio/windows/basic_handle.hpp deleted file mode 100644 index f7c9d0d..0000000 --- a/scout_sdk/asio/asio/windows/basic_handle.hpp +++ /dev/null @@ -1,273 +0,0 @@ -// -// windows/basic_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_BASIC_HANDLE_HPP -#define ASIO_WINDOWS_BASIC_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ - || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ - || defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/basic_io_object.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Provides Windows handle functionality. -/** - * The windows::basic_handle class template provides the ability to wrap a - * Windows handle. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_handle - : public basic_io_object -{ -public: - /// The native representation of a handle. - typedef typename HandleService::native_handle_type native_handle_type; - - /// A basic_handle is always the lowest layer. - typedef basic_handle lowest_layer_type; - - /// Construct a basic_handle without opening it. - /** - * This constructor creates a handle without opening it. - * - * @param io_context The io_context object that the handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - */ - explicit basic_handle(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct a basic_handle on an existing native handle. - /** - * This constructor creates a handle object to hold an existing native handle. - * - * @param io_context The io_context object that the handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - * - * @param handle A native handle. - * - * @throws asio::system_error Thrown on failure. - */ - basic_handle(asio::io_context& io_context, - const native_handle_type& handle) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), handle, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_handle from another. - /** - * This constructor moves a handle from one object to another. - * - * @param other The other basic_handle object from which the move will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_handle(io_context&) constructor. - */ - basic_handle(basic_handle&& other) - : basic_io_object( - ASIO_MOVE_CAST(basic_handle)(other)) - { - } - - /// Move-assign a basic_handle from another. - /** - * This assignment operator moves a handle from one object to another. - * - * @param other The other basic_handle object from which the move will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_handle(io_context&) constructor. - */ - basic_handle& operator=(basic_handle&& other) - { - basic_io_object::operator=( - ASIO_MOVE_CAST(basic_handle)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since a basic_handle cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since a basic_handle cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } - - /// Assign an existing native handle to the handle. - /* - * This function opens the handle to hold an existing native handle. - * - * @param handle A native handle. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const native_handle_type& handle) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), handle, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native handle to the handle. - /* - * This function opens the handle to hold an existing native handle. - * - * @param handle A native handle. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const native_handle_type& handle, - asio::error_code& ec) - { - this->get_service().assign(this->get_implementation(), handle, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the handle is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the handle. - /** - * This function is used to close the handle. Any asynchronous read or write - * operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the handle. - /** - * This function is used to close the handle. Any asynchronous read or write - * operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native handle representation. - /** - * This function may be used to obtain the underlying representation of the - * handle. This is intended to allow access to native handle functionality - * that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the handle. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the handle. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - -protected: - /// Protected destructor to prevent deletion through this type. - ~basic_handle() - { - } -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) - // || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) - // || defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_BASIC_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/basic_object_handle.hpp b/scout_sdk/asio/asio/windows/basic_object_handle.hpp deleted file mode 100644 index 4b29684..0000000 --- a/scout_sdk/asio/asio/windows/basic_object_handle.hpp +++ /dev/null @@ -1,182 +0,0 @@ -// -// windows/basic_object_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2011 Boris Schaeling (boris@highscore.de) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP -#define ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/windows/basic_handle.hpp" -#include "asio/windows/object_handle_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Provides object-oriented handle functionality. -/** - * The windows::basic_object_handle class template provides asynchronous and - * blocking object-oriented handle functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_object_handle - : public basic_handle -{ -public: - /// The native representation of a handle. - typedef typename ObjectHandleService::native_handle_type native_handle_type; - - /// Construct a basic_object_handle without opening it. - /** - * This constructor creates an object handle without opening it. - * - * @param io_context The io_context object that the object handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - */ - explicit basic_object_handle(asio::io_context& io_context) - : basic_handle(io_context) - { - } - - /// Construct a basic_object_handle on an existing native handle. - /** - * This constructor creates an object handle object to hold an existing native - * handle. - * - * @param io_context The io_context object that the object handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - * - * @param native_handle The new underlying handle implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_object_handle(asio::io_context& io_context, - const native_handle_type& native_handle) - : basic_handle(io_context, native_handle) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_object_handle from another. - /** - * This constructor moves an object handle from one object to another. - * - * @param other The other basic_object_handle object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_object_handle(io_context&) constructor. - */ - basic_object_handle(basic_object_handle&& other) - : basic_handle( - ASIO_MOVE_CAST(basic_object_handle)(other)) - { - } - - /// Move-assign a basic_object_handle from another. - /** - * This assignment operator moves an object handle from one object to another. - * - * @param other The other basic_object_handle object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_object_handle(io_context&) constructor. - */ - basic_object_handle& operator=(basic_object_handle&& other) - { - basic_handle::operator=( - ASIO_MOVE_CAST(basic_object_handle)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Perform a blocking wait on the object handle. - /** - * This function is used to wait for the object handle to be set to the - * signalled state. This function blocks and does not return until the object - * handle has been set to the signalled state. - * - * @throws asio::system_error Thrown on failure. - */ - void wait() - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Perform a blocking wait on the object handle. - /** - * This function is used to wait for the object handle to be set to the - * signalled state. This function blocks and does not return until the object - * handle has been set to the signalled state. - * - * @param ec Set to indicate what error occurred, if any. - */ - void wait(asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), ec); - } - - /// Start an asynchronous wait on the object handle. - /** - * This function is be used to initiate an asynchronous wait against the - * object handle. It always returns immediately. - * - * @param handler The handler to be called when the object handle is set to - * the signalled state. Copies will be made of the handler as required. The - * function signature of the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(ASIO_MOVE_ARG(WaitHandler) handler) - { - return this->get_service().async_wait(this->get_implementation(), - ASIO_MOVE_CAST(WaitHandler)(handler)); - } -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_BASIC_OBJECT_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/basic_random_access_handle.hpp b/scout_sdk/asio/asio/windows/basic_random_access_handle.hpp deleted file mode 100644 index 4226977..0000000 --- a/scout_sdk/asio/asio/windows/basic_random_access_handle.hpp +++ /dev/null @@ -1,376 +0,0 @@ -// -// windows/basic_random_access_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP -#define ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/windows/basic_handle.hpp" -#include "asio/windows/random_access_handle_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Provides random-access handle functionality. -/** - * The windows::basic_random_access_handle class template provides asynchronous - * and blocking random-access handle functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_random_access_handle - : public basic_handle -{ -public: - /// The native representation of a handle. - typedef typename RandomAccessHandleService::native_handle_type - native_handle_type; - - /// Construct a basic_random_access_handle without opening it. - /** - * This constructor creates a random-access handle without opening it. The - * handle needs to be opened before data can be written to or read from it. - * - * @param io_context The io_context object that the random-access handle will - * use to dispatch handlers for any asynchronous operations performed on the - * handle. - */ - explicit basic_random_access_handle(asio::io_context& io_context) - : basic_handle(io_context) - { - } - - /// Construct a basic_random_access_handle on an existing native handle. - /** - * This constructor creates a random-access handle object to hold an existing - * native handle. - * - * @param io_context The io_context object that the random-access handle will - * use to dispatch handlers for any asynchronous operations performed on the - * handle. - * - * @param handle The new underlying handle implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_random_access_handle(asio::io_context& io_context, - const native_handle_type& handle) - : basic_handle(io_context, handle) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_random_access_handle from another. - /** - * This constructor moves a random-access handle from one object to another. - * - * @param other The other basic_random_access_handle object from which the - * move will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_random_access_handle(io_context&) - * constructor. - */ - basic_random_access_handle(basic_random_access_handle&& other) - : basic_handle( - ASIO_MOVE_CAST(basic_random_access_handle)(other)) - { - } - - /// Move-assign a basic_random_access_handle from another. - /** - * This assignment operator moves a random-access handle from one object to - * another. - * - * @param other The other basic_random_access_handle object from which the - * move will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_random_access_handle(io_context&) - * constructor. - */ - basic_random_access_handle& operator=(basic_random_access_handle&& other) - { - basic_handle::operator=( - ASIO_MOVE_CAST(basic_random_access_handle)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Write some data to the handle at the specified offset. - /** - * This function is used to write data to the random-access handle. The - * function call will block until one or more bytes of the data has been - * written successfully, or until an error occurs. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some_at operation may not write all of the data. Consider - * using the @ref write_at function if you need to ensure that all data is - * written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.write_some_at(42, asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some_at(uint64_t offset, - const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some_at( - this->get_implementation(), offset, buffers, ec); - asio::detail::throw_error(ec, "write_some_at"); - return s; - } - - /// Write some data to the handle at the specified offset. - /** - * This function is used to write data to the random-access handle. The - * function call will block until one or more bytes of the data has been - * written successfully, or until an error occurs. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write_at function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some_at(uint64_t offset, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return this->get_service().write_some_at( - this->get_implementation(), offset, buffers, ec); - } - - /// Start an asynchronous write at the specified offset. - /** - * This function is used to asynchronously write data to the random-access - * handle. The function call always returns immediately. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more data buffers to be written to the handle. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write_at function if you need to ensure that - * all data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_write_some_at(42, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some_at(uint64_t offset, - const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - return this->get_service().async_write_some_at(this->get_implementation(), - offset, buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); - } - - /// Read some data from the handle at the specified offset. - /** - * This function is used to read data from the random-access handle. The - * function call will block until one or more bytes of data has been read - * successfully, or until an error occurs. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read_at function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.read_some_at(42, asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some_at(uint64_t offset, - const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some_at( - this->get_implementation(), offset, buffers, ec); - asio::detail::throw_error(ec, "read_some_at"); - return s; - } - - /// Read some data from the handle at the specified offset. - /** - * This function is used to read data from the random-access handle. The - * function call will block until one or more bytes of data has been read - * successfully, or until an error occurs. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read_at function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some_at(uint64_t offset, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return this->get_service().read_some_at( - this->get_implementation(), offset, buffers, ec); - } - - /// Start an asynchronous read at the specified offset. - /** - * This function is used to asynchronously read data from the random-access - * handle. The function call always returns immediately. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read_at function if you need to ensure that - * the requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_read_some_at(42, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some_at(uint64_t offset, - const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - return this->get_service().async_read_some_at(this->get_implementation(), - offset, buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); - } -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_BASIC_RANDOM_ACCESS_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/basic_stream_handle.hpp b/scout_sdk/asio/asio/windows/basic_stream_handle.hpp deleted file mode 100644 index 3bfce68..0000000 --- a/scout_sdk/asio/asio/windows/basic_stream_handle.hpp +++ /dev/null @@ -1,359 +0,0 @@ -// -// windows/basic_stream_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP -#define ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/detail/handler_type_requirements.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/error.hpp" -#include "asio/windows/basic_handle.hpp" -#include "asio/windows/stream_handle_service.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Provides stream-oriented handle functionality. -/** - * The windows::basic_stream_handle class template provides asynchronous and - * blocking stream-oriented handle functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -template -class basic_stream_handle - : public basic_handle -{ -public: - /// The native representation of a handle. - typedef typename StreamHandleService::native_handle_type native_handle_type; - - /// Construct a basic_stream_handle without opening it. - /** - * This constructor creates a stream handle without opening it. The handle - * needs to be opened and then connected or accepted before data can be sent - * or received on it. - * - * @param io_context The io_context object that the stream handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - */ - explicit basic_stream_handle(asio::io_context& io_context) - : basic_handle(io_context) - { - } - - /// Construct a basic_stream_handle on an existing native handle. - /** - * This constructor creates a stream handle object to hold an existing native - * handle. - * - * @param io_context The io_context object that the stream handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - * - * @param handle The new underlying handle implementation. - * - * @throws asio::system_error Thrown on failure. - */ - basic_stream_handle(asio::io_context& io_context, - const native_handle_type& handle) - : basic_handle(io_context, handle) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a basic_stream_handle from another. - /** - * This constructor moves a stream handle from one object to another. - * - * @param other The other basic_stream_handle object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_handle(io_context&) constructor. - */ - basic_stream_handle(basic_stream_handle&& other) - : basic_handle( - ASIO_MOVE_CAST(basic_stream_handle)(other)) - { - } - - /// Move-assign a basic_stream_handle from another. - /** - * This assignment operator moves a stream handle from one object to - * another. - * - * @param other The other basic_stream_handle object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c basic_stream_handle(io_context&) constructor. - */ - basic_stream_handle& operator=(basic_stream_handle&& other) - { - basic_handle::operator=( - ASIO_MOVE_CAST(basic_stream_handle)(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Write some data to the handle. - /** - * This function is used to write data to the stream handle. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "write_some"); - return s; - } - - /// Write some data to the handle. - /** - * This function is used to write data to the stream handle. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().write_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the stream handle. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the handle. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - return this->get_service().async_write_some(this->get_implementation(), - buffers, ASIO_MOVE_CAST(WriteHandler)(handler)); - } - - /// Read some data from the handle. - /** - * This function is used to read data from the stream handle. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "read_some"); - return s; - } - - /// Read some data from the handle. - /** - * This function is used to read data from the stream handle. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().read_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the stream handle. - * The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - return this->get_service().async_read_some(this->get_implementation(), - buffers, ASIO_MOVE_CAST(ReadHandler)(handler)); - } -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_BASIC_STREAM_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/object_handle.hpp b/scout_sdk/asio/asio/windows/object_handle.hpp deleted file mode 100644 index 581b568..0000000 --- a/scout_sdk/asio/asio/windows/object_handle.hpp +++ /dev/null @@ -1,381 +0,0 @@ -// -// windows/object_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2011 Boris Schaeling (boris@highscore.de) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_OBJECT_HANDLE_HPP -#define ASIO_WINDOWS_OBJECT_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/async_result.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_object_handle_service.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/windows/basic_object_handle.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#define ASIO_SVC_T asio::detail::win_object_handle_service - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -#if defined(ASIO_ENABLE_OLD_SERVICES) -// Typedef for the typical usage of an object handle. -typedef basic_object_handle<> object_handle; -#else // defined(ASIO_ENABLE_OLD_SERVICES) -/// Provides object-oriented handle functionality. -/** - * The windows::object_handle class provides asynchronous and blocking - * object-oriented handle functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class object_handle - : ASIO_SVC_ACCESS basic_io_object -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The native representation of a handle. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef ASIO_SVC_T::native_handle_type native_handle_type; -#endif - - /// An object_handle is always the lowest layer. - typedef object_handle lowest_layer_type; - - /// Construct an object_handle without opening it. - /** - * This constructor creates an object handle without opening it. - * - * @param io_context The io_context object that the object handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - */ - explicit object_handle(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct an object_handle on an existing native handle. - /** - * This constructor creates an object handle object to hold an existing native - * handle. - * - * @param io_context The io_context object that the object handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - * - * @param native_handle The new underlying handle implementation. - * - * @throws asio::system_error Thrown on failure. - */ - object_handle(asio::io_context& io_context, - const native_handle_type& native_handle) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), native_handle, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct an object_handle from another. - /** - * This constructor moves an object handle from one object to another. - * - * @param other The other object_handle object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c object_handle(io_context&) constructor. - */ - object_handle(object_handle&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign an object_handle from another. - /** - * This assignment operator moves an object handle from one object to another. - * - * @param other The other object_handle object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c object_handle(io_context&) constructor. - */ - object_handle& operator=(object_handle&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since an object_handle cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since an object_handle cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } - - /// Assign an existing native handle to the handle. - /* - * This function opens the handle to hold an existing native handle. - * - * @param handle A native handle. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const native_handle_type& handle) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), handle, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native handle to the handle. - /* - * This function opens the handle to hold an existing native handle. - * - * @param handle A native handle. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const native_handle_type& handle, - asio::error_code& ec) - { - this->get_service().assign(this->get_implementation(), handle, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the handle is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the handle. - /** - * This function is used to close the handle. Any asynchronous read or write - * operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the handle. - /** - * This function is used to close the handle. Any asynchronous read or write - * operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native handle representation. - /** - * This function may be used to obtain the underlying representation of the - * handle. This is intended to allow access to native handle functionality - * that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the handle. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the handle. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Perform a blocking wait on the object handle. - /** - * This function is used to wait for the object handle to be set to the - * signalled state. This function blocks and does not return until the object - * handle has been set to the signalled state. - * - * @throws asio::system_error Thrown on failure. - */ - void wait() - { - asio::error_code ec; - this->get_service().wait(this->get_implementation(), ec); - asio::detail::throw_error(ec, "wait"); - } - - /// Perform a blocking wait on the object handle. - /** - * This function is used to wait for the object handle to be set to the - * signalled state. This function blocks and does not return until the object - * handle has been set to the signalled state. - * - * @param ec Set to indicate what error occurred, if any. - */ - void wait(asio::error_code& ec) - { - this->get_service().wait(this->get_implementation(), ec); - } - - /// Start an asynchronous wait on the object handle. - /** - * This function is be used to initiate an asynchronous wait against the - * object handle. It always returns immediately. - * - * @param handler The handler to be called when the object handle is set to - * the signalled state. Copies will be made of the handler as required. The - * function signature of the handler must be: - * @code void handler( - * const asio::error_code& error // Result of operation. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(ASIO_MOVE_ARG(WaitHandler) handler) - { - asio::async_completion init(handler); - - this->get_service().async_wait(this->get_implementation(), - init.completion_handler); - - return init.result.get(); - } -}; -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#undef ASIO_SVC_T - -#endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_WINDOWS_OBJECT_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/object_handle_service.hpp b/scout_sdk/asio/asio/windows/object_handle_service.hpp deleted file mode 100644 index 95436d7..0000000 --- a/scout_sdk/asio/asio/windows/object_handle_service.hpp +++ /dev/null @@ -1,183 +0,0 @@ -// -// windows/object_handle_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2011 Boris Schaeling (boris@highscore.de) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_OBJECT_HANDLE_SERVICE_HPP -#define ASIO_WINDOWS_OBJECT_HANDLE_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/async_result.hpp" -#include "asio/detail/win_object_handle_service.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Default service implementation for an object handle. -class object_handle_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - -private: - // The type of the platform-specific implementation. - typedef detail::win_object_handle_service service_impl_type; - -public: - /// The type of an object handle implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef service_impl_type::implementation_type implementation_type; -#endif - - /// The native handle type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new object handle service for the specified io_context. - explicit object_handle_service(asio::io_context& io_context) - : asio::detail::service_base(io_context), - service_impl_(io_context) - { - } - - /// Construct a new object handle implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new object handle implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another object handle implementation. - void move_assign(implementation_type& impl, - object_handle_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy an object handle implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Assign an existing native handle to an object handle. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec) - { - service_impl_.assign(impl, handle, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the handle is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close an object handle implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native handle implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the handle. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - // Wait for a signaled state. - void wait(implementation_type& impl, asio::error_code& ec) - { - service_impl_.wait(impl, ec); - } - - /// Start an asynchronous wait. - template - ASIO_INITFN_RESULT_TYPE(WaitHandler, - void (asio::error_code)) - async_wait(implementation_type& impl, - ASIO_MOVE_ARG(WaitHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_wait(impl, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_OBJECT_HANDLE_SERVICE_HPP diff --git a/scout_sdk/asio/asio/windows/overlapped_handle.hpp b/scout_sdk/asio/asio/windows/overlapped_handle.hpp deleted file mode 100644 index 3d479ba..0000000 --- a/scout_sdk/asio/asio/windows/overlapped_handle.hpp +++ /dev/null @@ -1,331 +0,0 @@ -// -// windows/overlapped_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP -#define ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if !defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ - || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/async_result.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/detail/throw_error.hpp" -#include "asio/detail/win_iocp_handle_service.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#if defined(ASIO_HAS_MOVE) -# include -#endif // defined(ASIO_HAS_MOVE) - -#define ASIO_SVC_T asio::detail::win_iocp_handle_service - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Provides Windows handle functionality for objects that support -/// overlapped I/O. -/** - * The windows::overlapped_handle class provides the ability to wrap a Windows - * handle. The underlying object referred to by the handle must support - * overlapped I/O. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class overlapped_handle - : ASIO_SVC_ACCESS basic_io_object -{ -public: - /// The type of the executor associated with the object. - typedef io_context::executor_type executor_type; - - /// The native representation of a handle. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef ASIO_SVC_T::native_handle_type native_handle_type; -#endif - - /// An overlapped_handle is always the lowest layer. - typedef overlapped_handle lowest_layer_type; - - /// Construct an overlapped_handle without opening it. - /** - * This constructor creates a handle without opening it. - * - * @param io_context The io_context object that the handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - */ - explicit overlapped_handle(asio::io_context& io_context) - : basic_io_object(io_context) - { - } - - /// Construct an overlapped_handle on an existing native handle. - /** - * This constructor creates a handle object to hold an existing native handle. - * - * @param io_context The io_context object that the handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - * - * @param handle A native handle. - * - * @throws asio::system_error Thrown on failure. - */ - overlapped_handle(asio::io_context& io_context, - const native_handle_type& handle) - : basic_io_object(io_context) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), handle, ec); - asio::detail::throw_error(ec, "assign"); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct an overlapped_handle from another. - /** - * This constructor moves a handle from one object to another. - * - * @param other The other overlapped_handle object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c overlapped_handle(io_context&) constructor. - */ - overlapped_handle(overlapped_handle&& other) - : basic_io_object(std::move(other)) - { - } - - /// Move-assign an overlapped_handle from another. - /** - * This assignment operator moves a handle from one object to another. - * - * @param other The other overlapped_handle object from which the move will - * occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c overlapped_handle(io_context&) constructor. - */ - overlapped_handle& operator=(overlapped_handle&& other) - { - basic_io_object::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - -#if !defined(ASIO_NO_DEPRECATED) - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_context() - { - return basic_io_object::get_io_context(); - } - - /// (Deprecated: Use get_executor().) Get the io_context associated with the - /// object. - /** - * This function may be used to obtain the io_context object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_context object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_context& get_io_service() - { - return basic_io_object::get_io_service(); - } -#endif // !defined(ASIO_NO_DEPRECATED) - - /// Get the executor associated with the object. - executor_type get_executor() ASIO_NOEXCEPT - { - return basic_io_object::get_executor(); - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since an overlapped_handle cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Get a const reference to the lowest layer. - /** - * This function returns a const reference to the lowest layer in a stack of - * layers. Since an overlapped_handle cannot contain any further layers, it - * simply returns a reference to itself. - * - * @return A const reference to the lowest layer in the stack of layers. - * Ownership is not transferred to the caller. - */ - const lowest_layer_type& lowest_layer() const - { - return *this; - } - - /// Assign an existing native handle to the handle. - /* - * This function opens the handle to hold an existing native handle. - * - * @param handle A native handle. - * - * @throws asio::system_error Thrown on failure. - */ - void assign(const native_handle_type& handle) - { - asio::error_code ec; - this->get_service().assign(this->get_implementation(), handle, ec); - asio::detail::throw_error(ec, "assign"); - } - - /// Assign an existing native handle to the handle. - /* - * This function opens the handle to hold an existing native handle. - * - * @param handle A native handle. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID assign(const native_handle_type& handle, - asio::error_code& ec) - { - this->get_service().assign(this->get_implementation(), handle, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the handle is open. - bool is_open() const - { - return this->get_service().is_open(this->get_implementation()); - } - - /// Close the handle. - /** - * This function is used to close the handle. Any asynchronous read or write - * operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void close() - { - asio::error_code ec; - this->get_service().close(this->get_implementation(), ec); - asio::detail::throw_error(ec, "close"); - } - - /// Close the handle. - /** - * This function is used to close the handle. Any asynchronous read or write - * operations will be cancelled immediately, and will complete with the - * asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID close(asio::error_code& ec) - { - this->get_service().close(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native handle representation. - /** - * This function may be used to obtain the underlying representation of the - * handle. This is intended to allow access to native handle functionality - * that is not otherwise provided. - */ - native_handle_type native_handle() - { - return this->get_service().native_handle(this->get_implementation()); - } - - /// Cancel all asynchronous operations associated with the handle. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @throws asio::system_error Thrown on failure. - */ - void cancel() - { - asio::error_code ec; - this->get_service().cancel(this->get_implementation(), ec); - asio::detail::throw_error(ec, "cancel"); - } - - /// Cancel all asynchronous operations associated with the handle. - /** - * This function causes all outstanding asynchronous read or write operations - * to finish immediately, and the handlers for cancelled operations will be - * passed the asio::error::operation_aborted error. - * - * @param ec Set to indicate what error occurred, if any. - */ - ASIO_SYNC_OP_VOID cancel(asio::error_code& ec) - { - this->get_service().cancel(this->get_implementation(), ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - -protected: - /// Protected destructor to prevent deletion through this type. - /** - * This function destroys the handle, cancelling any outstanding asynchronous - * wait operations associated with the handle as if by calling @c cancel. - */ - ~overlapped_handle() - { - } -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#undef ASIO_SVC_T - -#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) - // || defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // !defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_OVERLAPPED_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/overlapped_ptr.hpp b/scout_sdk/asio/asio/windows/overlapped_ptr.hpp deleted file mode 100644 index ce0b2a4..0000000 --- a/scout_sdk/asio/asio/windows/overlapped_ptr.hpp +++ /dev/null @@ -1,116 +0,0 @@ -// -// windows/overlapped_ptr.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_OVERLAPPED_PTR_HPP -#define ASIO_WINDOWS_OVERLAPPED_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) \ - || defined(GENERATING_DOCUMENTATION) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/win_iocp_overlapped_ptr.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Wraps a handler to create an OVERLAPPED object for use with overlapped I/O. -/** - * A special-purpose smart pointer used to wrap an application handler so that - * it can be passed as the LPOVERLAPPED argument to overlapped I/O functions. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class overlapped_ptr - : private noncopyable -{ -public: - /// Construct an empty overlapped_ptr. - overlapped_ptr() - : impl_() - { - } - - /// Construct an overlapped_ptr to contain the specified handler. - template - explicit overlapped_ptr(asio::io_context& io_context, - ASIO_MOVE_ARG(Handler) handler) - : impl_(io_context, ASIO_MOVE_CAST(Handler)(handler)) - { - } - - /// Destructor automatically frees the OVERLAPPED object unless released. - ~overlapped_ptr() - { - } - - /// Reset to empty. - void reset() - { - impl_.reset(); - } - - /// Reset to contain the specified handler, freeing any current OVERLAPPED - /// object. - template - void reset(asio::io_context& io_context, - ASIO_MOVE_ARG(Handler) handler) - { - impl_.reset(io_context, ASIO_MOVE_CAST(Handler)(handler)); - } - - /// Get the contained OVERLAPPED object. - OVERLAPPED* get() - { - return impl_.get(); - } - - /// Get the contained OVERLAPPED object. - const OVERLAPPED* get() const - { - return impl_.get(); - } - - /// Release ownership of the OVERLAPPED object. - OVERLAPPED* release() - { - return impl_.release(); - } - - /// Post completion notification for overlapped operation. Releases ownership. - void complete(const asio::error_code& ec, - std::size_t bytes_transferred) - { - impl_.complete(ec, bytes_transferred); - } - -private: - detail::win_iocp_overlapped_ptr impl_; -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_OVERLAPPED_PTR) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_WINDOWS_OVERLAPPED_PTR_HPP diff --git a/scout_sdk/asio/asio/windows/random_access_handle.hpp b/scout_sdk/asio/asio/windows/random_access_handle.hpp deleted file mode 100644 index 301d5f8..0000000 --- a/scout_sdk/asio/asio/windows/random_access_handle.hpp +++ /dev/null @@ -1,378 +0,0 @@ -// -// windows/random_access_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_HPP -#define ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/windows/overlapped_handle.hpp" - -#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/windows/basic_random_access_handle.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -#if defined(ASIO_ENABLE_OLD_SERVICES) -// Typedef for the typical usage of a random-access handle. -typedef basic_random_access_handle<> random_access_handle; -#else // defined(ASIO_ENABLE_OLD_SERVICES) -/// Provides random-access handle functionality. -/** - * The windows::random_access_handle class provides asynchronous and - * blocking random-access handle functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class random_access_handle - : public overlapped_handle -{ -public: - /// Construct a random_access_handle without opening it. - /** - * This constructor creates a random-access handle without opening it. The - * handle needs to be opened before data can be written to or read from it. - * - * @param io_context The io_context object that the random-access handle will - * use to dispatch handlers for any asynchronous operations performed on the - * handle. - */ - explicit random_access_handle(asio::io_context& io_context) - : overlapped_handle(io_context) - { - } - - /// Construct a random_access_handle on an existing native handle. - /** - * This constructor creates a random-access handle object to hold an existing - * native handle. - * - * @param io_context The io_context object that the random-access handle will - * use to dispatch handlers for any asynchronous operations performed on the - * handle. - * - * @param handle The new underlying handle implementation. - * - * @throws asio::system_error Thrown on failure. - */ - random_access_handle(asio::io_context& io_context, - const native_handle_type& handle) - : overlapped_handle(io_context, handle) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a random_access_handle from another. - /** - * This constructor moves a random-access handle from one object to another. - * - * @param other The other random_access_handle object from which the - * move will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c random_access_handle(io_context&) - * constructor. - */ - random_access_handle(random_access_handle&& other) - : overlapped_handle(std::move(other)) - { - } - - /// Move-assign a random_access_handle from another. - /** - * This assignment operator moves a random-access handle from one object to - * another. - * - * @param other The other random_access_handle object from which the - * move will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c random_access_handle(io_context&) - * constructor. - */ - random_access_handle& operator=(random_access_handle&& other) - { - overlapped_handle::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Write some data to the handle at the specified offset. - /** - * This function is used to write data to the random-access handle. The - * function call will block until one or more bytes of the data has been - * written successfully, or until an error occurs. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some_at operation may not write all of the data. Consider - * using the @ref write_at function if you need to ensure that all data is - * written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.write_some_at(42, asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some_at(uint64_t offset, - const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some_at( - this->get_implementation(), offset, buffers, ec); - asio::detail::throw_error(ec, "write_some_at"); - return s; - } - - /// Write some data to the handle at the specified offset. - /** - * This function is used to write data to the random-access handle. The - * function call will block until one or more bytes of the data has been - * written successfully, or until an error occurs. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write_at function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some_at(uint64_t offset, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return this->get_service().write_some_at( - this->get_implementation(), offset, buffers, ec); - } - - /// Start an asynchronous write at the specified offset. - /** - * This function is used to asynchronously write data to the random-access - * handle. The function call always returns immediately. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more data buffers to be written to the handle. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write_at function if you need to ensure that - * all data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_write_some_at(42, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some_at(uint64_t offset, - const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - asio::async_completion init(handler); - - this->get_service().async_write_some_at(this->get_implementation(), - offset, buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the handle at the specified offset. - /** - * This function is used to read data from the random-access handle. The - * function call will block until one or more bytes of data has been read - * successfully, or until an error occurs. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read_at function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.read_some_at(42, asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some_at(uint64_t offset, - const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some_at( - this->get_implementation(), offset, buffers, ec); - asio::detail::throw_error(ec, "read_some_at"); - return s; - } - - /// Read some data from the handle at the specified offset. - /** - * This function is used to read data from the random-access handle. The - * function call will block until one or more bytes of data has been read - * successfully, or until an error occurs. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read_at function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some_at(uint64_t offset, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return this->get_service().read_some_at( - this->get_implementation(), offset, buffers, ec); - } - - /// Start an asynchronous read at the specified offset. - /** - * This function is used to asynchronously read data from the random-access - * handle. The function call always returns immediately. - * - * @param offset The offset at which the data will be read. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read_at function if you need to ensure that - * the requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_read_some_at(42, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some_at(uint64_t offset, - const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - asio::async_completion init(handler); - - this->get_service().async_read_some_at(this->get_implementation(), - offset, buffers, init.completion_handler); - - return init.result.get(); - } -}; -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/random_access_handle_service.hpp b/scout_sdk/asio/asio/windows/random_access_handle_service.hpp deleted file mode 100644 index ebccf3e..0000000 --- a/scout_sdk/asio/asio/windows/random_access_handle_service.hpp +++ /dev/null @@ -1,214 +0,0 @@ -// -// windows/random_access_handle_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_SERVICE_HPP -#define ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/cstdint.hpp" -#include "asio/detail/win_iocp_handle_service.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Default service implementation for a random-access handle. -class random_access_handle_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - -private: - // The type of the platform-specific implementation. - typedef detail::win_iocp_handle_service service_impl_type; - -public: - /// The type of a random-access handle implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef service_impl_type::implementation_type implementation_type; -#endif - - /// The native handle type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new random-access handle service for the specified io_context. - explicit random_access_handle_service(asio::io_context& io_context) - : asio::detail::service_base< - random_access_handle_service>(io_context), - service_impl_(io_context) - { - } - - /// Construct a new random-access handle implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new random-access handle implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another random-access handle implementation. - void move_assign(implementation_type& impl, - random_access_handle_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a random-access handle implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Assign an existing native handle to a random-access handle. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec) - { - service_impl_.assign(impl, handle, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the handle is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a random-access handle implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native handle implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the handle. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Write the given data at the specified offset. - template - std::size_t write_some_at(implementation_type& impl, uint64_t offset, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.write_some_at(impl, offset, buffers, ec); - } - - /// Start an asynchronous write at the specified offset. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some_at(implementation_type& impl, - uint64_t offset, const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_write_some_at(impl, - offset, buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the specified offset. - template - std::size_t read_some_at(implementation_type& impl, uint64_t offset, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.read_some_at(impl, offset, buffers, ec); - } - - /// Start an asynchronous read at the specified offset. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some_at(implementation_type& impl, - uint64_t offset, const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_read_some_at(impl, - offset, buffers, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_RANDOM_ACCESS_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_RANDOM_ACCESS_HANDLE_SERVICE_HPP diff --git a/scout_sdk/asio/asio/windows/stream_handle.hpp b/scout_sdk/asio/asio/windows/stream_handle.hpp deleted file mode 100644 index 8f0a21b..0000000 --- a/scout_sdk/asio/asio/windows/stream_handle.hpp +++ /dev/null @@ -1,362 +0,0 @@ -// -// windows/stream_handle.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_STREAM_HANDLE_HPP -#define ASIO_WINDOWS_STREAM_HANDLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include "asio/windows/overlapped_handle.hpp" - -#if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#if defined(ASIO_ENABLE_OLD_SERVICES) -# include "asio/windows/basic_stream_handle.hpp" -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -#if defined(ASIO_ENABLE_OLD_SERVICES) -// Typedef for the typical usage of a stream-oriented handle. -typedef basic_stream_handle<> stream_handle; -#else // defined(ASIO_ENABLE_OLD_SERVICES) -/// Provides stream-oriented handle functionality. -/** - * The windows::stream_handle class provides asynchronous and blocking - * stream-oriented handle functionality. - * - * @par Thread Safety - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * AsyncReadStream, AsyncWriteStream, Stream, SyncReadStream, SyncWriteStream. - */ -class stream_handle - : public overlapped_handle -{ -public: - /// Construct a stream_handle without opening it. - /** - * This constructor creates a stream handle without opening it. The handle - * needs to be opened and then connected or accepted before data can be sent - * or received on it. - * - * @param io_context The io_context object that the stream handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - */ - explicit stream_handle(asio::io_context& io_context) - : overlapped_handle(io_context) - { - } - - /// Construct a stream_handle on an existing native handle. - /** - * This constructor creates a stream handle object to hold an existing native - * handle. - * - * @param io_context The io_context object that the stream handle will use to - * dispatch handlers for any asynchronous operations performed on the handle. - * - * @param handle The new underlying handle implementation. - * - * @throws asio::system_error Thrown on failure. - */ - stream_handle(asio::io_context& io_context, - const native_handle_type& handle) - : overlapped_handle(io_context, handle) - { - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a stream_handle from another. - /** - * This constructor moves a stream handle from one object to another. - * - * @param other The other stream_handle object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c stream_handle(io_context&) constructor. - */ - stream_handle(stream_handle&& other) - : overlapped_handle(std::move(other)) - { - } - - /// Move-assign a stream_handle from another. - /** - * This assignment operator moves a stream handle from one object to - * another. - * - * @param other The other stream_handle object from which the move - * will occur. - * - * @note Following the move, the moved-from object is in the same state as if - * constructed using the @c stream_handle(io_context&) constructor. - */ - stream_handle& operator=(stream_handle&& other) - { - overlapped_handle::operator=(std::move(other)); - return *this; - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Write some data to the handle. - /** - * This function is used to write data to the stream handle. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @returns The number of bytes written. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().write_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "write_some"); - return s; - } - - /// Write some data to the handle. - /** - * This function is used to write data to the stream handle. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the handle. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. Returns 0 if an error occurred. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const ConstBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().write_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the stream handle. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the handle. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a WriteHandler. - ASIO_WRITE_HANDLER_CHECK(WriteHandler, handler) type_check; - - asio::async_completion init(handler); - - this->get_service().async_write_some( - this->get_implementation(), buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the handle. - /** - * This function is used to read data from the stream handle. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::system_error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers) - { - asio::error_code ec; - std::size_t s = this->get_service().read_some( - this->get_implementation(), buffers, ec); - asio::detail::throw_error(ec, "read_some"); - return s; - } - - /// Read some data from the handle. - /** - * This function is used to read data from the stream handle. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes read. Returns 0 if an error occurred. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const MutableBufferSequence& buffers, - asio::error_code& ec) - { - return this->get_service().read_some( - this->get_implementation(), buffers, ec); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the stream handle. - * The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * handle.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - // If you get an error on the following line it means that your handler does - // not meet the documented type requirements for a ReadHandler. - ASIO_READ_HANDLER_CHECK(ReadHandler, handler) type_check; - - asio::async_completion init(handler); - - this->get_service().async_read_some( - this->get_implementation(), buffers, init.completion_handler); - - return init.result.get(); - } -}; -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // ASIO_WINDOWS_STREAM_HANDLE_HPP diff --git a/scout_sdk/asio/asio/windows/stream_handle_service.hpp b/scout_sdk/asio/asio/windows/stream_handle_service.hpp deleted file mode 100644 index 1c665d5..0000000 --- a/scout_sdk/asio/asio/windows/stream_handle_service.hpp +++ /dev/null @@ -1,210 +0,0 @@ -// -// windows/stream_handle_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WINDOWS_STREAM_HANDLE_SERVICE_HPP -#define ASIO_WINDOWS_STREAM_HANDLE_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" - -#if defined(ASIO_ENABLE_OLD_SERVICES) - -#if defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) \ - || defined(GENERATING_DOCUMENTATION) - -#include -#include "asio/async_result.hpp" -#include "asio/detail/win_iocp_handle_service.hpp" -#include "asio/error.hpp" -#include "asio/io_context.hpp" - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace windows { - -/// Default service implementation for a stream handle. -class stream_handle_service -#if defined(GENERATING_DOCUMENTATION) - : public asio::io_context::service -#else - : public asio::detail::service_base -#endif -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The unique service identifier. - static asio::io_context::id id; -#endif - -private: - // The type of the platform-specific implementation. - typedef detail::win_iocp_handle_service service_impl_type; - -public: - /// The type of a stream handle implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef service_impl_type::implementation_type implementation_type; -#endif - - /// The native handle type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_handle_type; -#else - typedef service_impl_type::native_handle_type native_handle_type; -#endif - - /// Construct a new stream handle service for the specified io_context. - explicit stream_handle_service(asio::io_context& io_context) - : asio::detail::service_base(io_context), - service_impl_(io_context) - { - } - - /// Construct a new stream handle implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - -#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - /// Move-construct a new stream handle implementation. - void move_construct(implementation_type& impl, - implementation_type& other_impl) - { - service_impl_.move_construct(impl, other_impl); - } - - /// Move-assign from another stream handle implementation. - void move_assign(implementation_type& impl, - stream_handle_service& other_service, - implementation_type& other_impl) - { - service_impl_.move_assign(impl, other_service.service_impl_, other_impl); - } -#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) - - /// Destroy a stream handle implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Assign an existing native handle to a stream handle. - ASIO_SYNC_OP_VOID assign(implementation_type& impl, - const native_handle_type& handle, asio::error_code& ec) - { - service_impl_.assign(impl, handle, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Determine whether the handle is open. - bool is_open(const implementation_type& impl) const - { - return service_impl_.is_open(impl); - } - - /// Close a stream handle implementation. - ASIO_SYNC_OP_VOID close(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.close(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Get the native handle implementation. - native_handle_type native_handle(implementation_type& impl) - { - return service_impl_.native_handle(impl); - } - - /// Cancel all asynchronous operations associated with the handle. - ASIO_SYNC_OP_VOID cancel(implementation_type& impl, - asio::error_code& ec) - { - service_impl_.cancel(impl, ec); - ASIO_SYNC_OP_VOID_RETURN(ec); - } - - /// Write the given data to the stream. - template - std::size_t write_some(implementation_type& impl, - const ConstBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.write_some(impl, buffers, ec); - } - - /// Start an asynchronous write. - template - ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) - async_write_some(implementation_type& impl, - const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_write_some(impl, buffers, init.completion_handler); - - return init.result.get(); - } - - /// Read some data from the stream. - template - std::size_t read_some(implementation_type& impl, - const MutableBufferSequence& buffers, asio::error_code& ec) - { - return service_impl_.read_some(impl, buffers, ec); - } - - /// Start an asynchronous read. - template - ASIO_INITFN_RESULT_TYPE(ReadHandler, - void (asio::error_code, std::size_t)) - async_read_some(implementation_type& impl, - const MutableBufferSequence& buffers, - ASIO_MOVE_ARG(ReadHandler) handler) - { - asio::async_completion init(handler); - - service_impl_.async_read_some(impl, buffers, init.completion_handler); - - return init.result.get(); - } - -private: - // Destroy all user-defined handler objects owned by the service. - void shutdown() - { - service_impl_.shutdown(); - } - - // The platform-specific implementation. - service_impl_type service_impl_; -}; - -} // namespace windows -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // defined(ASIO_HAS_WINDOWS_STREAM_HANDLE) - // || defined(GENERATING_DOCUMENTATION) - -#endif // defined(ASIO_ENABLE_OLD_SERVICES) - -#endif // ASIO_WINDOWS_STREAM_HANDLE_SERVICE_HPP diff --git a/scout_sdk/asio/asio/write.hpp b/scout_sdk/asio/asio/write.hpp deleted file mode 100644 index 517a842..0000000 --- a/scout_sdk/asio/asio/write.hpp +++ /dev/null @@ -1,927 +0,0 @@ -// -// write.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WRITE_HPP -#define ASIO_WRITE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/buffer.hpp" -#include "asio/error.hpp" - -#if !defined(ASIO_NO_EXTENSIONS) -# include "asio/basic_streambuf_fwd.hpp" -#endif // !defined(ASIO_NO_EXTENSIONS) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/** - * @defgroup write asio::write - * - * @brief Write a certain amount of data to a stream before returning. - */ -/*@{*/ - -/// Write all of the supplied data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * stream. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write(s, asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, buffers, - * asio::transfer_all()); @endcode - */ -template -std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - typename enable_if< - is_const_buffer_sequence::value - >::type* = 0); - -/// Write all of the supplied data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * stream. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write(s, asio::buffer(data, size), ec); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, buffers, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - asio::error_code& ec, - typename enable_if< - is_const_buffer_sequence::value - >::type* = 0); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's write_some function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write(s, asio::buffer(data, size), - * asio::transfer_at_least(32)); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, - typename enable_if< - is_const_buffer_sequence::value - >::type* = 0); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's write_some function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t write(SyncWriteStream& s, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_const_buffer_sequence::value - >::type* = 0); - -/// Write all of the supplied data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied dynamic buffer sequence has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers The dynamic buffer sequence from which data will be written. - * Successfully written data is automatically consumed from the buffers. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, buffers, - * asio::transfer_all()); @endcode - */ -template -std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Write all of the supplied data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied dynamic buffer sequence has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers The dynamic buffer sequence from which data will be written. - * Successfully written data is automatically consumed from the buffers. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, buffers, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied dynamic buffer sequence has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers The dynamic buffer sequence from which data will be written. - * Successfully written data is automatically consumed from the buffers. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's write_some function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - */ -template -std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied dynamic buffer sequence has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param buffers The dynamic buffer sequence from which data will be written. - * Successfully written data is automatically consumed from the buffers. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's write_some function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t write(SyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, asio::error_code& ec, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Write all of the supplied data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param b The basic_streambuf object from which data will be written. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, b, - * asio::transfer_all()); @endcode - */ -template -std::size_t write(SyncWriteStream& s, basic_streambuf& b); - -/// Write all of the supplied data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, b, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t write(SyncWriteStream& s, basic_streambuf& b, - asio::error_code& ec); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's write_some function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - */ -template -std::size_t write(SyncWriteStream& s, basic_streambuf& b, - CompletionCondition completion_condition); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the SyncWriteStream concept. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's write_some function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t write(SyncWriteStream& s, basic_streambuf& b, - CompletionCondition completion_condition, asio::error_code& ec); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ -/** - * @defgroup async_write asio::async_write - * - * @brief Start an asynchronous operation to write a certain amount of data to a - * stream. - */ -/*@{*/ - -/// Start an asynchronous operation to write all of the supplied data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_write_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other write operations (such - * as async_write, the stream's async_write_some function, or any other composed - * operations that perform writes) until this operation completes. - * - * @param s The stream to which the data is to be written. The type must support - * the AsyncWriteStream concept. - * - * @param buffers One or more buffers containing the data to be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written from the - * // buffers. If an error occurred, - * // this will be less than the sum - * // of the buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * asio::async_write(s, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_const_buffer_sequence::value - >::type* = 0); - -/// Start an asynchronous operation to write a certain amount of data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_write_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other write operations (such - * as async_write, the stream's async_write_some function, or any other composed - * operations that perform writes) until this operation completes. - * - * @param s The stream to which the data is to be written. The type must support - * the AsyncWriteStream concept. - * - * @param buffers One or more buffers containing the data to be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's async_write_some function. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written from the - * // buffers. If an error occurred, - * // this will be less than the sum - * // of the buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::async_write(s, - * asio::buffer(data, size), - * asio::transfer_at_least(32), - * handler); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_const_buffer_sequence::value - >::type* = 0); - -/// Start an asynchronous operation to write all of the supplied data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied dynamic buffer sequence has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_write_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other write operations (such - * as async_write, the stream's async_write_some function, or any other composed - * operations that perform writes) until this operation completes. - * - * @param s The stream to which the data is to be written. The type must support - * the AsyncWriteStream concept. - * - * @param buffers The dynamic buffer sequence from which data will be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. Successfully written - * data is automatically consumed from the buffers. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written from the - * // buffers. If an error occurred, - * // this will be less than the sum - * // of the buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -/// Start an asynchronous operation to write a certain amount of data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied dynamic buffer sequence has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_write_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other write operations (such - * as async_write, the stream's async_write_some function, or any other composed - * operations that perform writes) until this operation completes. - * - * @param s The stream to which the data is to be written. The type must support - * the AsyncWriteStream concept. - * - * @param buffers The dynamic buffer sequence from which data will be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. Successfully written - * data is automatically consumed from the buffers. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's async_write_some function. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written from the - * // buffers. If an error occurred, - * // this will be less than the sum - * // of the buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, - ASIO_MOVE_ARG(DynamicBuffer) buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler, - typename enable_if< - is_dynamic_buffer::type>::value - >::type* = 0); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Start an asynchronous operation to write all of the supplied data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_write_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other write operations (such - * as async_write, the stream's async_write_some function, or any other composed - * operations that perform writes) until this operation completes. - * - * @param s The stream to which the data is to be written. The type must support - * the AsyncWriteStream concept. - * - * @param b A basic_streambuf object from which data will be written. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written from the - * // buffers. If an error occurred, - * // this will be less than the sum - * // of the buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, basic_streambuf& b, - ASIO_MOVE_ARG(WriteHandler) handler); - -/// Start an asynchronous operation to write a certain amount of data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_write_some function, and is known as a composed operation. The - * program must ensure that the stream performs no other write operations (such - * as async_write, the stream's async_write_some function, or any other composed - * operations that perform writes) until this operation completes. - * - * @param s The stream to which the data is to be written. The type must support - * the AsyncWriteStream concept. - * - * @param b A basic_streambuf object from which data will be written. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_write_some operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the stream's async_write_some function. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error_code& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written from the - * // buffers. If an error occurred, - * // this will be less than the sum - * // of the buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write(AsyncWriteStream& s, basic_streambuf& b, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/write.hpp" - -#endif // ASIO_WRITE_HPP diff --git a/scout_sdk/asio/asio/write_at.hpp b/scout_sdk/asio/asio/write_at.hpp deleted file mode 100644 index 5018d21..0000000 --- a/scout_sdk/asio/asio/write_at.hpp +++ /dev/null @@ -1,677 +0,0 @@ -// -// write_at.hpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WRITE_AT_HPP -#define ASIO_WRITE_AT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/config.hpp" -#include -#include "asio/async_result.hpp" -#include "asio/detail/cstdint.hpp" -#include "asio/error.hpp" - -#if !defined(ASIO_NO_EXTENSIONS) -# include "asio/basic_streambuf_fwd.hpp" -#endif // !defined(ASIO_NO_EXTENSIONS) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/** - * @defgroup write_at asio::write_at - * - * @brief Write a certain amount of data at a specified offset before returning. - */ -/*@{*/ - -/// Write all of the supplied data at the specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * device. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write_at(d, 42, asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::write_at( - * d, offset, buffers, - * asio::transfer_all()); @endcode - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers); - -/// Write all of the supplied data at the specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * device. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write_at(d, 42, - * asio::buffer(data, size), ec); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::write_at( - * d, offset, buffers, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - asio::error_code& ec); - -/// Write a certain amount of data at a specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * device. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the device's write_some_at function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write_at(d, 42, asio::buffer(data, size), - * asio::transfer_at_least(32)); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - CompletionCondition completion_condition); - -/// Write a certain amount of data at a specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * device. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the device's write_some_at function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, asio::error_code& ec); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Write all of the supplied data at the specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param b The basic_streambuf object from which data will be written. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::write_at( - * d, 42, b, - * asio::transfer_all()); @endcode - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, basic_streambuf& b); - -/// Write all of the supplied data at the specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes transferred. - * - * @note This overload is equivalent to calling: - * @code asio::write_at( - * d, 42, b, - * asio::transfer_all(), ec); @endcode - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, - uint64_t offset, basic_streambuf& b, - asio::error_code& ec); - -/// Write a certain amount of data at a specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the device's write_some_at function. - * - * @returns The number of bytes transferred. - * - * @throws asio::system_error Thrown on failure. - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, - basic_streambuf& b, CompletionCondition completion_condition); - -/// Write a certain amount of data at a specified offset before returning. -/** - * This function is used to write a certain number of bytes of data to a random - * access device at a specified offset. The call will block until one of the - * following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * write_some_at function. - * - * @param d The device to which the data is to be written. The type must support - * the SyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest write_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the device's write_some_at function. - * - * @param ec Set to indicate what error occurred, if any. - * - * @returns The number of bytes written. If an error occurs, returns the total - * number of bytes successfully transferred prior to the error. - */ -template -std::size_t write_at(SyncRandomAccessWriteDevice& d, uint64_t offset, - basic_streambuf& b, CompletionCondition completion_condition, - asio::error_code& ec); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ -/** - * @defgroup async_write_at asio::async_write_at - * - * @brief Start an asynchronous operation to write a certain amount of data at - * the specified offset. - */ -/*@{*/ - -/// Start an asynchronous operation to write all of the supplied data at the -/// specified offset. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a random access device at a specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * async_write_some_at function, and is known as a composed operation. - * The program must ensure that the device performs no overlapping - * write operations (such as async_write_at, the device's async_write_some_at - * function, or any other composed operations that perform writes) until this - * operation completes. Operations are overlapping if the regions defined by - * their offsets, and the numbers of bytes to write, intersect. - * - * @param d The device to which the data is to be written. The type must support - * the AsyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more buffers containing the data to be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes written from the buffers. If an error - * // occurred, this will be less than the sum of the buffer sizes. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code - * asio::async_write_at(d, 42, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, - const ConstBufferSequence& buffers, - ASIO_MOVE_ARG(WriteHandler) handler); - -/// Start an asynchronous operation to write a certain amount of data at the -/// specified offset. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a random access device at a specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * async_write_some_at function, and is known as a composed operation. - * The program must ensure that the device performs no overlapping - * write operations (such as async_write_at, the device's async_write_some_at - * function, or any other composed operations that perform writes) until this - * operation completes. Operations are overlapping if the regions defined by - * their offsets, and the numbers of bytes to write, intersect. - * - * @param d The device to which the data is to be written. The type must support - * the AsyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param buffers One or more buffers containing the data to be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_write_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the device's async_write_some_at function. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes written from the buffers. If an error - * // occurred, this will be less than the sum of the buffer sizes. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - * - * @par Example - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::async_write_at(d, 42, - * asio::buffer(data, size), - * asio::transfer_at_least(32), - * handler); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, - uint64_t offset, const ConstBufferSequence& buffers, - CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler); - -#if !defined(ASIO_NO_EXTENSIONS) -#if !defined(ASIO_NO_IOSTREAM) - -/// Start an asynchronous operation to write all of the supplied data at the -/// specified offset. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a random access device at a specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the device's - * async_write_some_at function, and is known as a composed operation. - * The program must ensure that the device performs no overlapping - * write operations (such as async_write_at, the device's async_write_some_at - * function, or any other composed operations that perform writes) until this - * operation completes. Operations are overlapping if the regions defined by - * their offsets, and the numbers of bytes to write, intersect. - * - * @param d The device to which the data is to be written. The type must support - * the AsyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param b A basic_streambuf object from which data will be written. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes written from the buffers. If an error - * // occurred, this will be less than the sum of the buffer sizes. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, - basic_streambuf& b, ASIO_MOVE_ARG(WriteHandler) handler); - -/// Start an asynchronous operation to write a certain amount of data at the -/// specified offset. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a random access device at a specified offset. The function call - * always returns immediately. The asynchronous operation will continue until - * one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns 0. - * - * This operation is implemented in terms of zero or more calls to the device's - * async_write_some_at function, and is known as a composed operation. - * The program must ensure that the device performs no overlapping - * write operations (such as async_write_at, the device's async_write_some_at - * function, or any other composed operations that perform writes) until this - * operation completes. Operations are overlapping if the regions defined by - * their offsets, and the numbers of bytes to write, intersect. - * - * @param d The device to which the data is to be written. The type must support - * the AsyncRandomAccessWriteDevice concept. - * - * @param offset The offset at which the data will be written. - * - * @param b A basic_streambuf object from which data will be written. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code std::size_t completion_condition( - * // Result of latest async_write_some_at operation. - * const asio::error_code& error, - * - * // Number of bytes transferred so far. - * std::size_t bytes_transferred - * ); @endcode - * A return value of 0 indicates that the write operation is complete. A - * non-zero return value indicates the maximum number of bytes to be written on - * the next call to the device's async_write_some_at function. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * // Result of operation. - * const asio::error_code& error, - * - * // Number of bytes written from the buffers. If an error - * // occurred, this will be less than the sum of the buffer sizes. - * std::size_t bytes_transferred - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_context::post(). - */ -template -ASIO_INITFN_RESULT_TYPE(WriteHandler, - void (asio::error_code, std::size_t)) -async_write_at(AsyncRandomAccessWriteDevice& d, uint64_t offset, - basic_streambuf& b, CompletionCondition completion_condition, - ASIO_MOVE_ARG(WriteHandler) handler); - -#endif // !defined(ASIO_NO_IOSTREAM) -#endif // !defined(ASIO_NO_EXTENSIONS) - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#include "asio/impl/write_at.hpp" - -#endif // ASIO_WRITE_AT_HPP diff --git a/scout_sdk/asio/asio/yield.hpp b/scout_sdk/asio/asio/yield.hpp deleted file mode 100644 index b527ac9..0000000 --- a/scout_sdk/asio/asio/yield.hpp +++ /dev/null @@ -1,23 +0,0 @@ -// -// yield.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2018 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#include "coroutine.hpp" - -#ifndef reenter -# define reenter(c) ASIO_CORO_REENTER(c) -#endif - -#ifndef yield -# define yield ASIO_CORO_YIELD -#endif - -#ifndef fork -# define fork ASIO_CORO_FORK -#endif diff --git a/scout_sdk/docs/SCOUT_UserManual_v1.2.10_S.pdf b/scout_sdk/docs/SCOUT_UserManual_v1.2.10_S.pdf deleted file mode 100644 index 95df6c2d9dbd9f22522319bcbb5f9e0142e1cebb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2103003 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 hW|7I9A67)t9X{Ugu!@lqOd?y?MCSe( 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⁣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≦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 z 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 ohB6j{dZe|2|9ko*xq4lVNnkmOeQ{* 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 &!6hNv7<2 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

    UZ=ADg#OnHm?dFtc|3mF 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%0Ah`i!ugt{S0~b`U}i|b1UMcT%B*S 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
    eM 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
    eKaFrpI<8Q6*-CBv|H{JB5e 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șt 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Ν+rZk>4u)Ui2}M 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

    |Uj9Djjp-XmluQ)&w=u0SgM5qj! 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 z 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 z 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%0A+Pr9ivO+gKA|K(+b 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

    >drSaS;`47}oFAu{)@ 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